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是其实现类