1、Spring框架对JDBC的简单封装
提供了一个JDBCTemplate对象来简化JDBC的开发。
2、步骤:
1. 导入jar包:commons-logging-1.2.jar、spring-beans-5.0.0.RELEASE.jar、spring-core-5.0.0.RELEASE.jar、spring-jdbc-5.0.0.RELEASE.jar、spring-tx-5.0.0.RELEASE.jar
2. 创建JdbcTemplate对象。依赖于数据源DataSource
JdbcTemplate template = new JdbcTeplate(ds);
3. 调用JdbcTemplate的方法来完成CRUD的操作
-
- update():执行DML语句。增删改语句
- queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value。将这条记录封装为一个map集合
注意:这个方法查询的结果集长度只能是1,即只适用于查询结果只有1条记录的。
-
- queryForList():查询结果将结果集封装为list集合。
注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中。
-
- query():查询结果,将结果集封装为JavaBean对象。
- query的参数:RowMapper
- query():查询结果,将结果集封装为JavaBean对象。
* 一般我们使用BeanPropertyRowMapper实现类,它可以完成数据到JavaBean的自动封装。
* new BeanPropertyRowMapper<类型>(类型.class)
例如:List<Emp> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
-
- queryForObject():查询结果,将结果封装为对象
- 一般用于聚合函数的查询
- queryForObject():查询结果,将结果封装为对象
代码
package cn.itcast.datasource.jdbctemplate; import cn.itcast.datasource.utils.JDBCUtils; import org.springframework.jdbc.core.JdbcTemplate; /** * JdbcTemplate入门 */ public class JdbcTemplateDemo1 { public static void main(String[] args) { //1. 导入jar包 //2. 创建JDBCTeplate对象 JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); //3. 调用方法 String sql = "update account set balance = 5000 where id = ?"; int count = jdbcTemplate.update(sql, 3); System.out.println(count); } }
执行结果:
3、练习
需求:
1. 修改emp表1001号数据的salary为1000
package cn.itcast.datasource.jdbctemplate; import cn.itcast.datasource.utils.JDBCUtils; import org.junit.Test; import org.springframework.jdbc.core.JdbcTemplate; public class JdbcTemplateDemo2 { //Junit单元测试,可以让方法独立执行 /** * 1. 修改1号数据的 salary 为 10000 */ @Test public void test1(){ //1. 获取JDBCTeplate对象 JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); //2. 定义sql String sql = "update emp set salary = 10000 where id = 1001"; //3. 执行sql int count = jdbcTemplate.update(sql); System.out.println(count); } }
2. 添加一条记录
package cn.itcast.datasource.jdbctemplate; import cn.itcast.datasource.utils.JDBCUtils; import org.junit.Test; import org.springframework.jdbc.core.JdbcTemplate; public class JdbcTemplateDemo2 { //1. 获取JDBCTeplate对象 private JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); //Junit单元测试,可以让方法独立执行 /** * 1. 修改1号数据的 salary 为 10000 */ @Test public void test1(){ //2. 定义sql String sql = "update emp set salary = 10000 where id = 1001"; //3. 执行sql int count = jdbcTemplate.update(sql); System.out.println(count); } /** * 2. 添加一条记录 */ @Test public void test2(){ //2. 定义sql String sql = "insert into emp(id,ename,dept_id) values (?,?,?)"; //3. 执行sql int count = jdbcTemplate.update(sql,1015,"郭靖",10); System.out.println(count); } }
执行结果:
3. 删除刚才添加的记录
/** * 删除刚才添加的记录 */ @Test public void test3(){ //2. 定义sql String sql = "delete from emp where id = ?"; //3. 执行sql int count = jdbcTemplate.update(sql,1015); System.out.println(count); }
4. 查询id为1001的记录,将其封装为Map集合
/** * 查询id为1001的记录,将其封装为Map集合 */ @Test public void test4(){ //2. 定义sql String sql = "select * from emp where id = ?"; //3. 执行sql Map<String, Object> map = jdbcTemplate.queryForMap(sql, 1001); System.out.println(map); }
执行结果:
5. 查询所有记录,将其封装为List
/** * 5. 查询所有记录,将其封装为List */ @Test public void test5(){ //2. 定义sql String sql = "select * from emp"; //3. 执行sql List<Map<String, Object>> list = jdbcTemplate.queryForList(sql); System.out.println(list); }
执行结果:
6. 查询所有记录,将其封装为Emp对象的List集合
实现方法1:
/** * 6. 查询所有记录,将其封装为Emp对象的List集合 */ @Test public void test6(){ //2. 定义sql String sql = "select * from emp"; //3. 执行sql List<Emp> list = jdbcTemplate.query(sql, new RowMapper<Emp>() { @Override public Emp mapRow(ResultSet rs, int i) throws SQLException { Emp emp = new Emp(); int id = rs.getInt("id"); String ename = rs.getString("ename"); int job_id = rs.getInt("job_id"); int mgr = rs.getInt("mgr"); Date joindate = rs.getDate("joindate");//这是java.sql.Date,是java.util.Date的子类 double salary = rs.getDouble("salary"); double bonus = rs.getDouble("bonus"); int dept_id = rs.getInt("dept_id"); emp.setId(id); emp.setEname(ename); emp.setJob_id(job_id); emp.setMgr(mgr); emp.setJoindate(joindate); emp.setSalary(salary); emp.setBonus(bonus); emp.setDept_id(dept_id); return emp; } }); System.out.println(list); }
上面代码比较繁琐,需要获取值再赋值,可用方法2简化操作。
实现方法2:
package cn.itcast.datasource.jdbctemplate; import java.util.Date; /** * 封装Emp表数据的JavaBean */ public class Emp { private Integer id; private String ename; private Integer job_id; private Integer mgr; private Date joindate; private Double salary; private Double bonus; private Integer dept_id; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public Integer getJob_id() { return job_id; } public void setJob_id(Integer job_id) { this.job_id = job_id; } public Integer getMgr() { return mgr; } public void setMgr(Integer mgr) { this.mgr = mgr; } public Date getJoindate() { return joindate; } public void setJoindate(Date joindate) { this.joindate = joindate; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } public Double getBonus() { return bonus; } public void setBonus(Double bonus) { this.bonus = bonus; } public Integer getDept_id() { return dept_id; } public void setDept_id(Integer dept_id) { this.dept_id = dept_id; } @Override public String toString() { return "Emp{" + "id=" + id + ", ename='" + ename + '\'' + ", job_id=" + job_id + ", mgr=" + mgr + ", joindate=" + joindate + ", salary=" + salary + ", bonus=" + bonus + ", dept_id=" + dept_id + '}'; } }
id等对象必须是对象类型,否则执行下面的会报错。
@Test public void test6_2(){ //2. 定义sql String sql = "select * from emp"; //3. 执行sql List<Emp> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class)); System.out.println(list); }
执行结果:
7. 查询总记录数
/** * 7. 查询总记录数 */ @Test public void test7(){ //2. 定义sql String sql = "select count(id) from emp"; Object total = jdbcTemplate.queryForObject(sql,Long.class); System.out.println(total); }
执行结果: