Spring框架对JDBC的简单封装
提供了一个JDBCTemplate对象,简化JDBC的开发

步骤

  1. 导入jar包
  2. 创建JDBCTemplate对象。依赖于数据源DataSource

JDBCTemplate template = new JDBCTemplate(ds) ;

  1. 调用JDBCTemplate的方法来完成CRUD的操作

update() : 执行DML语句,增删改
queryForMap() : 查询结果,将结果集封装为map集合
❗:这个方法查询的结果长度只能是 1
queryForList() : 查询结果,将结果集封装为list集合
❗:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
query() : 查询结果,将结果集封装为JavaBean对象
❗:query的参数:RowMapper
一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
new BeanPropertyRowMapper<类型>(类型.class)
queryForObject() : 查询结果,将结果集封装为对象
❗:一般用于聚合函数的查询

简单入门

image.png

  1. package cn.itcast.jdbcTemplate;
  2. import cn.itcast.utils.JDBCUtils;
  3. import org.springframework.jdbc.core.JdbcTemplate;
  4. /**
  5. * jdbcTemplate入门
  6. */
  7. public class jdbcTemplateDemo1 {
  8. public static void main(String[] args) {
  9. //1.导入jar包
  10. //2.创建JDBCTemplate对象
  11. JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
  12. //3.调用方法
  13. String sql = "update account set balance = 5000 where id = ?";
  14. int count = template.update(sql,3); //第一个数字就是第一个问号的值
  15. System.out.println(count);
  16. }
  17. }
  18. 结果:
  19. "C:\Program Files\Java\jdk1.8.0_151\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=51863:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_151\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\rt.jar;C:\Users\DYQ\IdeaProjects\workplace\out\production\dateSource_jdbcTemplate;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\c3p0-0.9.5.5.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\mchange-commons-java-0.2.19.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\mysql-connector-java-8.0.21.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\druid-1.0.9.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\spring-tx-5.1.10.RELEASE.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\commons-logging-1.2.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\spring-beans-5.1.10.RELEASE.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\spring-core-5.1.10.RELEASE.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\spring-jdbc-5.1.10.RELEASE.jar" cn.itcast.jdbcTemplate.jdbcTemplateDemo1
  20. 一月 23, 2021 5:34:14 下午 com.alibaba.druid.pool.DruidDataSource info
  21. 信息: {dataSource-1} inited
  22. 1
  23. Process finished with exit code 0

练习

🍕Junit单元测试,可以让方法独立执行

  1. package cn.itcast.jdbcTemplate;
  2. import org.junit.Test;
  3. public class jdbcTemplateDemo2 {
  4. //Junit单元测试,可以让方法独立执行
  5. /**
  6. * 修改1号数据的balance为1w
  7. */
  8. @Test
  9. public void test1(){
  10. System.out.println("..");
  11. }
  12. }

tip:

image.png 可单独运行Test
image.png @Test初次会报错,点击小灯泡导个包就没事了
image.png
——————————————————————————————————
image.png

运行成功后就全是绿色的✔

—————————

运行不成功就是红色的 ❗ |

update()

🤔修改1号数据的balance为1w

  1. @Test
  2. public void test1(){
  3. //1.获取jdbcTemplate对象
  4. JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
  5. //2.定义sql
  6. String sql = "update account set balance = 10000 where id = 1";
  7. //3.执行sql
  8. int count = template.update(sql);
  9. System.out.println(count);
  10. }

tip

image.png 这玩意每次都获取挺麻烦的
image.png 给他放到成员变量的位置就不用每次都申请获取对象了。

还要用private修饰一下 |

🤔添加一条记录

  1. package cn.itcast.jdbcTemplate;
  2. import cn.itcast.utils.JDBCUtils;
  3. import org.junit.Test;
  4. import org.springframework.jdbc.core.JdbcTemplate;
  5. public class jdbcTemplateDemo2 {
  6. //1.获取jdbcTemplate对象
  7. private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
  8. @Test
  9. public void test2(){
  10. String sql = "insert into account(id,name,balance) values (?,?,?)";
  11. int count = template.update(sql,4,"王八",1000);
  12. System.out.println(count);
  13. }
  14. }

🤔删除刚才添加的记录

  1. @Test
  2. public void test3(){
  3. String sql = "delete from account where id = ?";
  4. int count = template.update(sql,4);
  5. System.out.println(count);
  6. }

queryForMap()

🤔查询id为1的记录,将其封装为Map集合

  1. @Test
  2. public void test4(){
  3. String sql = "select * from account where id = ?";
  4. Map<String,Object> map = template.queryForMap(sql,1);
  5. System.out.println(map);
  6. }

image.png

tips: 只能封装一个。

查询结果将结果集封装为map集合,将列名作为key,将值作为value,将这条记录封装为一个map集合。

queryForList()

🤔查询所有记录,将其封装为list

  1. @Test
  2. public void test5(){
  3. String sql = "select * from account";
  4. List<Map<String,Object>> list = template.queryForList(sql);
  5. for (Map<String,Object> stringObjectMap:list){
  6. System.out.println(stringObjectMap);
  7. }
  8. }

image.png

tips:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中

query()

🤔查询所有记录,将其封装为Emp对象的List集合

  1. @Test
  2. public void test6(){
  3. String sql = "select * from account";
  4. List<account> list = template.query(sql, new RowMapper<account>() {
  5. @Override
  6. public account mapRow(ResultSet rs, int i) throws SQLException {
  7. account account = new account();
  8. int id = rs.getInt("id");
  9. String name = rs.getString("name");
  10. int balance = rs.getInt("balance");
  11. account.setId(id);
  12. account.setName(name);
  13. account.setBalance(balance);
  14. return account;
  15. }
  16. });
  17. for (account account:list) {
  18. System.out.println(account);
  19. }
  20. }

image.png

简化代码

  1. @Test
  2. public void test6_1(){
  3. String sql = "select * from account";
  4. List<account> list = template.query(sql,new BeanPropertyRowMapper<account>(account.class));
  5. for (account account:list){
  6. System.out.println(account);
  7. }
  8. }

❗ 理论上可行,但是注意:此时如果数据有null值,就会报错!

image.png
image.png
Failed to convert property value of type ‘null’ to required type ‘double’ for property ‘balance’;
在balance数据里面,有一个null不能转换成double
因为在定义实体类的时候,把元素都定义为基本数据类型了,基本数据类型不能接收null,只能默认值:0
image.pngimage.png
重新定义数据类型为封装类,再重新生成setter/getter/toString
image.png
此时就不会报错了。查询成功

🤔查询总记录数

  1. @Test
  2. public void test7(){
  3. String sql = "select count(id) from account";
  4. Double balance = template.queryForObject(sql,Double.class);
  5. System.out.println(balance);
  6. }

image.png