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