发表于: 2020-11-03 23:47:21

2 1591


今天完成的事情:

JDBC,JDBCTemplate的详解

JDBC,首先使用Class.forName("com.mysql.jdbc.Driver");加载驱动,之后通过getConnection(StringjdbcUrl,Stringuser,Stringpassword) 方法获取连接,连接到数据库。然后定义SQL语句,之后创建向数据库发送sql的statement对象,不过现在一般使用PreparedStatement 防止sql注入(SQL语句在程序运行前已经进行了预编译,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1'也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令)。例子:PreparedStatement ps = conn.preparedStatement(sql); 再来处理执行结果(ResultSet),最后释放资源,也就是归还连接,因为数据库连接(Connection)非常耗资源,所以尽量晚创建,尽量早的释放,且都要加try catch 以防前面关闭出错,免得后面的就不执行了


JDBCTemplate,JDBCTemplate其实是spring提供的一个模板,所以需要导入spring-jdbc的一个包。有了spring的加入节省了一下功能:节省代码,不管连接(Connection),不管事务,不管异常,不管关闭(con.close() ps.close )

首先创建db.properties配置文件(在这之前现在pom.xml中添加依赖spring-jdbc,连接池c3-p0),编写spring配置文件,在其中读取读取properties文件,生成c3p0连接池,之后生成jdbcTemplate,并注入连接池中。这样spring配置文件就编写完毕,感觉和spring+mybatis配置文件很像,在编写一个实体类,最后编写一个测试类,感觉和spring+mybatis没差了。

package com.xwj.util;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.util.CollectionUtils;

import com.xwj.bean.User;

public class TestJdbc {

   private ApplicationContext ctx = null;
   private JdbcTemplate jdbcTemplate = null;

   {
       ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
       jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
   }

   /**
    * 执行 INSERT
    */
   @Test
   public void testInsert() {
       String sql = "INSERT INTO xwj_user(id, last_name, age) VALUES(?, ?, ?)";
       jdbcTemplate.update(sql, "1", "a-xwj", 0);
   }

   /**
    * 执行UPDATE
    */
   @Test
   public void testUpdate() {
       String sql = "UPDATE xwj_user SET last_name = ? WHERE id = ?";
       jdbcTemplate.update(sql, "b-xwj", 1);
   }

   /**
    * 执行 DELETE
    */
   @Test
   public void testDelete() {
       String sql = "DELETE from xwj_user WHERE id = ?";
       jdbcTemplate.update(sql, 1);
   }

   /**
    * 测试批量更新操作 最后一个参数是 Object[] List 类型:因为修改一条记录需要一个 Object 数组,修改多条记录就需要一个
    * List 来存放多个数组。
    */
   @Test
   public void testBatchUpdate() {
       String sql = "INSERT INTO xwj_user(id, last_name, email) VALUES(?, ?, ?)";

       List<Object[]> batchArgs = new ArrayList<>();
       batchArgs.add(new Object[] { "2", "AA", "aa@atguigu.com" });
       batchArgs.add(new Object[] { "3", "BB", "bb@atguigu.com" });
       batchArgs.add(new Object[] { "4", "CC", "cc@atguigu.com" });
       batchArgs.add(new Object[] { "5", "DD", "dd@atguigu.com" });

       jdbcTemplate.batchUpdate(sql, batchArgs);
   }

   /**
    * 从数据库中获取一条记录,实际得到对应的一个对象 注意:不是调用 queryForObject(String sql,Class<Employee> requiredType, Object... args) 方法!
    * 而需要调用queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args)
    * 1、其中的 RowMapper 指定如何去映射结果集的行,常用的实现类为 BeanPropertyRowMapper
    * 2、使用SQL中的列的别名完成列名和类的属性名的映射,例如 last_name lastName
    * 3、不支持级联属性。 JdbcTemplate只能作为一个 JDBC 的小工具, 而不是 ORM 框架
    */
   @Test
   public void testQueryForObject() {
       String sql = "SELECT id, last_name lastName, email FROM xwj_user WHERE ID = ?";
       RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
       // 在将数据装入对象时需要调用set方法。
       User user = jdbcTemplate.queryForObject(sql, rowMapper, 2);
       System.out.println(user);
   }

   /**
    * 一次查询多个对象
    * 注意:调用的不是 queryForList 方法
    */
   @Test
   public void testQueryForList() {
       String sql = "SELECT id, name, email FROM xwj_user WHERE id > ?";
       RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
       List<User> userList = jdbcTemplate.query(sql, rowMapper, 1);
       if (!CollectionUtils.isEmpty(userList)) {
           userList.forEach(user -> {
               System.out.println(user);
           });
       }
   }

   /**
    * 获取单个列的值或做统计查询
    * 使用 queryForObject(String sql, Class<Long> requiredType)  
    */
   @Test
   public void testQueryForCount() {
       String sql = "SELECT count(id) FROM xwj_user";
       long count = jdbcTemplate.queryForObject(sql, Long.class);

       System.out.println(count);
   }

}



mybatis详解:和JDBCTemplate一样的配置pom.xml文件,首先配置log4j日志,之后配置SqlMapConfig.XML文件,在文件开始需设置





明天计划的事情: 



遇到的问题:



收获:





返回列表 返回列表
评论

    分享到