Spring降低了JavaEE API的使用难度,其中就包括JDBC。

Spring JDBC的核心类是JdbcTemplate,JdbcTemplate类   extends  JdbcAccessor抽象类,并implements了JdbcOperations接口。

 

 

 

Spring JDBC的使用步骤

1、添加数据库驱动的jar包

Spring JDBC需要3个jar包的支持:

  • spring-jdbc.jar、spring-tx.jar(事务处理)   这2个是Spring自带的,不用管
  • 数据库驱动的jar包

 

 

2、在xml中配置DataSource、JdbcTemplate



<!--配置数据源,class打DMDS就出来了-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://127.0.0.1/my_db?serverTimezone=GMT" />
        <property name="username" value="root" />
        <property name="password" value="abc" />
    </bean>

    <!--配置JdbcTemplate-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--注入数据源依赖-->
        <property name="dataSource" ref="dataSource" />
    </bean>



 

 

3、使用JdbcTemplate



1   ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
2         //获取配置的JdbcTemplate
3         JdbcTemplate jdbcTemplate=applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
4         //之后就可以通过jdbcTemplate操作数据库了
5         //.......



 

 

 

 

JdbcTemplate类的常用方法

1、execute(String  sql)   

可执行任何sql语句,但因为返回值是void,所以一般用于执行DDL语句(对数据库、表进行新建、修改、删除操作)。

 

 

2、查询,有多个查询方法

 

 

3、update()    插入、修改、删除记录

  • int  update(String sql)     //返回受影响的记录数
  • int  update(String sql, Object...args)

 

 

4、batchUpdate()   批量插入、修改、删除记录

  • int[]   batchUpdate(String...sql)    //返回受影响的记录数
  • int[]   batchUpdate(String...sql, List<Object[]>  args)    

 

 

5、set系列方法

  • setMaxRows(int max)    //设置返回的最大记录数
  • setQueryTimeout(int  timeout)    //设置查询超时
  • setDataSource(DataSource  dataSource)    //设置数据源

以上方法都有对应的get方法。

 

 

 

 

 

JdbcTemplate类的查询方法

1、queryForObject()      //返回一条记录 ,select只能选择一列

  • 目标类型   queryForObject(String sql, 目标类型.class)    //返回值就是目标类型的结果
  • 目标类型  queryForObject(String sql, Object[] args, 目标类型.class)    //args是sql语句中?对应的值
  • 目标类型  queryForObject(String sql, 目标类型.class, Object... args)

 



1      String sql="select id from student_tb where name = '张三'";
2         int id=jdbcTemplate.queryForObject(sql,Integer.class);  //如果查询到的id有多个,此句代码会报错。包装类、普通类会自动转换。



 



1     String sql="select id from student_tb where name = ? and score = ?";
2         Object[] arg=new Object[]{"张三",90};
3         int id=jdbcTemplate.queryForObject(sql,arg,int.class);  //参数要是Object[]的形式



 



1     String sql="select id from student_tb where name = ? and score = ?";
2         int id=jdbcTemplate.queryForObject(sql,int.class,"张三",90);



 

说明
  • 因为是ForObject,一个对象,所以select只能选中一列,选择多个列会报错。
  • 必须且只能返回一条记录,如果返回多条记录或没有记录匹配,都会报错

 

 

 

 

2、queryForRowSet()     //返回查询结果集

  • SqlRowSet  queryForRowSet(String sql)     //SqlRowSet即结果集
  • SqlRowSet  queryForRowSet(String sql, Object...args)    //args是sql语句中的?对应得值。
1     String sql="select * from student_tb";
2         SqlRowSet rowSet=jdbcTemplate.queryForRowSet(sql);
3         while (rowSet.next()){
4             System.out.println(rowSet.getInt(1));   //参数可以是int型的列索引(从1开始),也可以是String类型的列名
5         }



 

 

 

 

3、queryForMap()    //返回一条记录,select可选择多列

  • queryForMap(String sql)
  • queryForMap(String sql, Object...args)
1     String sql="select id,name,age,score from student_tb where id = 1";
2         Map<String,Object> map=jdbcTemplate.queryForMap(sql); //此处使用泛型时,key必须是String,value必须是Object
3         System.out.println("学号:"+map.get("id"));
4         System.out.println("姓名:"+map.get("name"));
5         System.out.println("年龄:"+map.get("age"));
6         System.out.println("成绩:"+map.get("score"));



 

说明

  • queryForMap()是查询一条记录,只能返回一条记录,若返回多条记录或没有记录匹配,都会报错。
  • Map<String,Object>是固定的,不能修改。
  • Map<String,Object>存储的是一条记录。String指的是select选中的字段名,Object指的是该字段的值。因为一个key(字段)只能对应一个value(字段值),所以返回的必须且只能是一条记录。

 

 

 

 

4、queryForList()    //返回列表,可以返回多条记录

  • List<T>  queryForList(String sql, 目标类型.class)
  • List<T>  queryForList(String sql, Object[]  args, 目标类型.class)    //args是sql语句中?的对应值
  • List<T>  queryForList(String sql, 目标类型.class, Object...args)
1     String sql="select name from student_tb";
2         List<String> list=jdbcTemplate.queryForList(sql,String.class);
3         Iterator<String> iterator=list.iterator();
4         while (iterator.hasNext()){
5             System.out.println(iterator.next());
6         }



说明:因为返回值是List<T>,所以可以返回多条记录。List元素类型必须相同,所以select只能选中一列,选中多列会报错。

 

 

  • List<Map<String,Object>>   queryForList(String sql)
  • List<Map<String,Object>>   queryForList(String sql, Object...args)
1     String sql="select id,name,age,score from student_tb";
 2         List<Map<String,Object>> list=jdbcTemplate.queryForList(sql);  //select选择多个字段,数据类型不同,value只能是Object
 3         Iterator<Map<String,Object>> iterator=list.iterator();  //如果此处泛型指定迭代的元素类型,则迭代元素需要强制类型转换为Map<String,Obejct>
 4         Map<String,Object> map;
 5         while (iterator.hasNext()){
 6             map= iterator.next();
 7             String out="学号:"+map.get("id")+"        姓名:"+map.get("name")+"      年龄:"+map.get("age")+"       成绩:"+map.get("score");
 8             System.out.println(out);
 9 
10         }



说明:List的元素类型是Map<String,Obejct>,一个Map<String,Obejct>表示一条记录(可以是多列),即返回值可以是多条记录,select可以选择多列。

 

queryForList()的返回值是List,会把返回的记录放入List中,所以可以返回0条或多条记录。返回0条时,List是空的,这是可以的,不会报错。

 

 

 

 

5、query()   

  • List<T>   query(String sql, RowMapper<T>  rowMapper)
  • List<T>   query(String sql, Object[]  args, RowMapper<T>  rowMapper)
  • List<T>   query(String sql, RowMapper<T>  rowMapper, Object...args)
1 class Student{
 2     private int id;
 3     private String name;
 4     private int age;
 5     private int score;
 6 
 7     public void setId(int id) {
 8         this.id = id;
 9     }
10 
11     public void setName(String name) {
12         this.name = name;
13     }
14 
15     public void setAge(int age) {
16         this.age = age;
17     }
18 
19     public void setScore(int score) {
20         this.score = score;
21     }
22 
23 
24     public int getId() {
25         return id;
26     }
27 
28     public String getName() {
29         return name;
30     }
31 
32     public int getAge() {
33         return age;
34     }
35 
36     public int getScore() {
37         return score;
38     }
39 }
40 
41 
42 public class Test {
43     public static void main(String[] args) {
44         ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
45         JdbcTemplate jdbcTemplate=applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
46 
47         RowMapper<Student> rowMapper=new BeanPropertyRowMapper<>(Student.class);
48         String sql="select id,name from student_tb";
49         List<Student> list=jdbcTemplate.query(sql,rowMapper); 
50         for (Student student:list){
51             System.out.println(student.getName());
52         }
53 
54     }
55 }



 

说明

  • 可返回多条记录,select可选择多列,但select选择的列名必须和目标类的属性名一致,且目标类中必须有该列(属性)的setter方法,因为返回的记录是通过目标类的setter方法初始化对象的,如果目标类中没有对应属性的setter方法,不会报错,属性会初始化为默认值。select未选中的属性会初始化为默认值。
  • RowMapper是接口,BeanPropertyRowMapper是其实现类