Spring框架对JDBC的简单封装
提供了一个JDBCTemplate对象,简化JDBC的开发
步骤
- 导入jar包
- 创建JDBCTemplate对象。依赖于数据源DataSource
JDBCTemplate template = new JDBCTemplate(ds) ;
- 调用JDBCTemplate的方法来完成CRUD的操作
update() : 执行DML语句,增删改
queryForMap() : 查询结果,将结果集封装为map集合
❗:这个方法查询的结果长度只能是 1
queryForList() : 查询结果,将结果集封装为list集合
❗:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
query() : 查询结果,将结果集封装为JavaBean对象
❗:query的参数:RowMapper
一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
new BeanPropertyRowMapper<类型>(类型.class)
queryForObject() : 查询结果,将结果集封装为对象
❗:一般用于聚合函数的查询
简单入门

package cn.itcast.jdbcTemplate;import cn.itcast.utils.JDBCUtils;import org.springframework.jdbc.core.JdbcTemplate;/*** jdbcTemplate入门*/public class jdbcTemplateDemo1 {public static void main(String[] args) {//1.导入jar包//2.创建JDBCTemplate对象JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());//3.调用方法String sql = "update account set balance = 5000 where id = ?";int count = template.update(sql,3); //第一个数字就是第一个问号的值System.out.println(count);}}结果:"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一月 23, 2021 5:34:14 下午 com.alibaba.druid.pool.DruidDataSource info信息: {dataSource-1} inited1Process finished with exit code 0
练习
🍕Junit单元测试,可以让方法独立执行
package cn.itcast.jdbcTemplate;import org.junit.Test;public class jdbcTemplateDemo2 {//Junit单元测试,可以让方法独立执行/*** 修改1号数据的balance为1w*/@Testpublic void test1(){System.out.println("..");}}
tip:
![]() |
可单独运行Test |
|---|---|
![]() |
@Test初次会报错,点击小灯泡导个包就没事了 |
![]() —————————————————————————————————— ![]() |
运行成功后就全是绿色的✔
—————————
运行不成功就是红色的 ❗ |
update()
🤔修改1号数据的balance为1w
@Testpublic void test1(){//1.获取jdbcTemplate对象JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());//2.定义sqlString sql = "update account set balance = 10000 where id = 1";//3.执行sqlint count = template.update(sql);System.out.println(count);}
tip
![]() |
这玩意每次都获取挺麻烦的 |
|---|---|
![]() |
给他放到成员变量的位置就不用每次都申请获取对象了。 |
还要用private修饰一下 |
🤔添加一条记录
package cn.itcast.jdbcTemplate;import cn.itcast.utils.JDBCUtils;import org.junit.Test;import org.springframework.jdbc.core.JdbcTemplate;public class jdbcTemplateDemo2 {//1.获取jdbcTemplate对象private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());@Testpublic void test2(){String sql = "insert into account(id,name,balance) values (?,?,?)";int count = template.update(sql,4,"王八",1000);System.out.println(count);}}
🤔删除刚才添加的记录
@Testpublic void test3(){String sql = "delete from account where id = ?";int count = template.update(sql,4);System.out.println(count);}
queryForMap()
🤔查询id为1的记录,将其封装为Map集合
@Testpublic void test4(){String sql = "select * from account where id = ?";Map<String,Object> map = template.queryForMap(sql,1);System.out.println(map);}
tips: 只能封装一个。
查询结果将结果集封装为map集合,将列名作为key,将值作为value,将这条记录封装为一个map集合。
queryForList()
🤔查询所有记录,将其封装为list
@Testpublic void test5(){String sql = "select * from account";List<Map<String,Object>> list = template.queryForList(sql);for (Map<String,Object> stringObjectMap:list){System.out.println(stringObjectMap);}}
tips:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
query()
🤔查询所有记录,将其封装为Emp对象的List集合
@Testpublic void test6(){String sql = "select * from account";List<account> list = template.query(sql, new RowMapper<account>() {@Overridepublic account mapRow(ResultSet rs, int i) throws SQLException {account account = new account();int id = rs.getInt("id");String name = rs.getString("name");int balance = rs.getInt("balance");account.setId(id);account.setName(name);account.setBalance(balance);return account;}});for (account account:list) {System.out.println(account);}}
简化代码
@Testpublic void test6_1(){String sql = "select * from account";List<account> list = template.query(sql,new BeanPropertyRowMapper<account>(account.class));for (account account:list){System.out.println(account);}}
❗ 理论上可行,但是注意:此时如果数据有null值,就会报错!


Failed to convert property value of type ‘null’ to required type ‘double’ for property ‘balance’;
在balance数据里面,有一个null不能转换成double
因为在定义实体类的时候,把元素都定义为基本数据类型了,基本数据类型不能接收null,只能默认值:0

重新定义数据类型为封装类,再重新生成setter/getter/toString
此时就不会报错了。查询成功
🤔查询总记录数
@Testpublic void test7(){String sql = "select count(id) from account";Double balance = template.queryForObject(sql,Double.class);System.out.println(balance);}







