JDBCTemplate的好处:

1.可以实现将查询到的数据自动分装为实体类对象
2.可以不用在执行增删改以后释放prepareStatement 对象和connection对象了

项目的框架:

项目的框架.png
可以看到项目里面使用到了7个jar包这七个jar包缺一不可的,
1.和前面两个案例01,02一样我们使先试用druid这个jar包创建一了一个工具类,提供了得到Connection和Datasource对象的方法。
2.创建了一个user的实体类,后期可以使用JDBCTemplate直接将查询到的数据封装成为User对象。

用到的方法

/*
使用JDBCTemplate来实现对mysql数据库的操作
前提:结合前面的Druid来得到DateSource

使用JDBCtemplate的好处就是我们不用再自己去关闭数据库的连接了

1。将查询到的结果封装成为对象并且放到list集合里面
List userlist = jdbcTemplate.query(sql, new BeanPropertyRowMapper(User.class));
2.将查询到的每一条记录封装成为Map集合,并且将map集合放到一个list集合里面
List> maps = jdbcTemplate.queryForList(sql);
3.将查询到的结果放到Map集合里面去,!!!! 只支持查询结果是一条记录的时候,亮条记录的时候就会报错
Map stringObjectMap = jdbcTemplate.queryForMap(sql2,133);

这三种方法都可以先将sql语句里面的参数用占位符?? 代替,在执行的时候进行补全

/

实体类代码

注意:实体类的变量名 , 属性名 要和你的数据库里面的字段的名字一模一样,不然无法自动封装为User对象

  1. package bean;
  2. public class User {
  3. private int id;
  4. private String name ;
  5. private int money;
  6. public User() {
  7. }
  8. public User(int id, String name, int money) {
  9. this.id = id;
  10. this.name = name;
  11. this.money = money;
  12. }
  13. public int getId() {
  14. return id;
  15. }
  16. public void setId(int id) {
  17. this.id = id;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public int getMoney() {
  26. return money;
  27. }
  28. public void setMoney(int money) {
  29. this.money = money;
  30. }
  31. @Override
  32. public String toString() {
  33. return "User{" +
  34. "id=" + id +
  35. ", name='" + name + '\'' +
  36. ", money=" + money +
  37. '}';
  38. }
  39. }

image.png

测试类代码

  1. package SpringTemplate;
  2. import bean.User;
  3. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  4. import org.springframework.jdbc.core.JdbcTemplate;
  5. import utils.JDBCUtils;
  6. import javax.sql.DataSource;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.Set;
  10. public class JDBCTemplate {
  11. /**
  12. * 使用JDBCTemplate来实现对mysql数据库的操作
  13. * 前提:结合前面的Druid来得到DateSource
  14. *
  15. * 使用JDBCtemplate的好处就是我们不用再自己去关闭数据库的连接了
  16. *
  17. * 1。将查询到的结果封装成为对象并且放到list集合里面
  18. * List<User> userlist = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));
  19. * 2.将查询到的每一条记录封装成为Map集合,并且将map集合放到一个list集合里面
  20. * List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
  21. * 3.将查询到的结果放到Map集合里面去,!!!! 只支持查询结果是一条记录的时候,亮条记录的时候就会报错
  22. * Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(sql2,133);
  23. *
  24. * 这三种方法都可以先将sql语句里面的参数用占位符?? 代替,在执行的时候进行补全
  25. *
  26. */
  27. public static void main(String[] args) {
  28. //得到JDBCtemplate的对象 注意导包的时候导的是org.springframework.jdbc.core.JdbcTemplate;
  29. JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
  30. String sql = "select * from luo ;";
  31. List<User> userlist = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));
  32. for (User user : userlist) {
  33. System.out.println(user);
  34. }
  35. System.out.println("----------防止sql注入------------");
  36. String sql3 = "select * from luo where id = ?;";
  37. List<User> userlist2 = jdbcTemplate.query(sql3,new BeanPropertyRowMapper<User>(User.class), "133" );
  38. for (User user : userlist2) {
  39. System.out.println(user);
  40. }
  41. System.out.println("---------------------------");
  42. //将查询到的结果封装成为一个list集合,集合里面是Map集合 一个map集合就是一条记录 键是字段名,值是值
  43. List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
  44. for (Map<String, Object> map : maps) {
  45. System.out.println(map);
  46. }
  47. System.out.println("--------------------------");
  48. //将查询到的结果放到一个map集合里面
  49. // 注意 这种方法只是用于查询的结果集里面只有一条记录的查询,结果集里面如果有两条记录就会报错
  50. String sql2 = "select * from luo where id = ? ;"; //使用占位符可以防止sql注入
  51. Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(sql2,133); //填补空缺值,并执行sql
  52. //遍历map集合
  53. //1.得到键的集合
  54. Set<String> set = stringObjectMap.keySet();
  55. for (String s : set) {
  56. System.out.println(s+"-----"+stringObjectMap.get(s));
  57. }
  58. }
  59. }

扩展知识

Spring JDBC 提供了一个 JDBCTemplate对象
Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
步骤:
1. 导入jar包
2. 创建JdbcTemplate对象。依赖于数据源DataSource 这个DataSource对象我们可以使用刚才创建的DruidTools来得到
* JdbcTemplate template = new JdbcTemplate(ds);

  1. 3. 调用JdbcTemplate的方法来完成CRUD的操作<br /> ** * update():执行DML语句。增、删、改语句**<br />** * queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合**<br />** * 注意:这个方法查询的结果集长度只能是1**<br />** * queryForList():查询结果将结果集封装为list集合**<br />** * 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中**<br />** * query():查询结果,将结果封装为JavaBean对象**<br />** * query的参数:RowMapper**<br />** * 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装**<br />** * new BeanProp ertyRowMapper<类型>(类型.class)**<br />** **_*重点!!!! 为什么这个方法可以实现 自动封装为Person对象 是因为_<br />_ *他会把我们在Person里面定义的属性值id name money和数据库里面的字段进行匹配_<br />_*所以如果你想使用系统的BeanPropertyRowMapper方法 就要保证Person类的属性值和 数据库的字段一一对应_<br />** * queryForObject:查询结果,将结果封装为对象**<br />** * 一般用于聚合函数的查询**

使用JDBCtemplate的好处:
使用JDBCTemplate的有点就在于我们不需要再 创建数据库的连接 得到数据库连接池 归还连接 大大方便了

扩展案例

案例:

下面是使用Spring JDBC的 JDBCTemplate对象来实现7个案例,使用到了7个jar包 实现数据库操作更加的方便了
七个练习是:

练习一 修改id值为133的人的钱为333
* 练习二 我们添加一条记录 insert into luo values(166,”阿里巴”,777);
练习三 删除刚才添加的数据 delete from luo where id = ? ;
练习四 查询id为133的记录 并且将数据放到map集合里面 map 集合是一个双列集合里面是键值对
练习五 ; 查询所有的记录 将记录存放到list集合 list集合里面的每一个元素是一个map集合
练习六 ;查询所有的记录 将每一条记录封装为person对象 再把对象放到list集合里面
使用SpringJDBC 给的 JDBCTamplate的.query方法就可以实现 将查询到的结果封装为javabean对象
练习6plus 我们会发现自己实现一下 RowMap方法是可以的,但是比较麻烦 所以 我们来使用一下系统已经实现好的接口
系统重写好RowMaper接口的类是 BeanPropertyRowMaper();参数是一个字节码文件 就是你想封装成类的字节码文件
练习7 得到记录的总数 使用聚合函数

代码

  1. import DruidUtils.DruidTools;
  2. import org.junit.Test;
  3. import org.omg.PortableInterceptor.ClientRequestInfo;
  4. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  5. import org.springframework.jdbc.core.JdbcTemplate;
  6. import org.springframework.jdbc.core.RowMapper;
  7. import javax.lang.model.type.ArrayType;
  8. import java.sql.ResultSet;
  9. import java.sql.SQLException;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. import java.util.Map;
  13. import java.util.Set;
  14. public class JDBCTemplatePractice1 {
  15. /**
  16. * 我们在这里实现几个JDBCTemplate的练习
  17. * 使用单元测试的方式 不需要主方法 让定义的方法可以独立运行
  18. * 单元测试的方法返回值一般都是 void ,修饰符都是public
  19. * 我们只需要添加一个注解@Test 然后点击注解左边的小灯泡 吧Junit4添加进去就可以实现单元测试了
  20. */
  21. /**
  22. * 练习一 修改id值为133的人的钱为333
  23. */
  24. @Test
  25. public void test1 (){
  26. //获取JDBCTemplate对象 参数是dataSource我们可以使用自己创建的工具类得到
  27. JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
  28. //创建sql语句
  29. String sql = "update luo set money = ? where id = 133";
  30. //为sql设置参数 并执行sql
  31. int res = jdbcTemplate.update(sql, 363);
  32. if (res > 0){
  33. System.out.println("修改成功");
  34. }else {
  35. System.out.println("修改失败");
  36. }
  37. }
  38. /**
  39. * 练习一 我们添加一条记录 insert into luo values(166,"阿里巴",777);
  40. * 使用JDBCTemplate的update方法可以执行DML(增删改)语句 返回int 数据
  41. */
  42. @Test
  43. public void test2 (){
  44. //获得JDBCTemplate对象 参数是DataSource
  45. JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
  46. String sql = "insert into luo values(?,?,?);";
  47. //使用JDBCTemplate为sql赋值并执行sql语句
  48. int res = jdbcTemplate.update(sql,155,"阿里巴",666);
  49. if (res>0){
  50. System.out.println("添加成功");
  51. }else {
  52. System.out.println("添加失败");
  53. }
  54. }
  55. /**
  56. * 练习三 删除刚才添加的数据 delete from luo where id = ? ;
  57. * 使用JDBCTemplate的update方法执行sql语句 参数是 DataSource 我们使用自己的DruidTools工具类得到
  58. */
  59. @Test
  60. public void test3(){
  61. JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
  62. String sql = "delete from luo where id = ? ;";
  63. int res = jdbcTemplate.update(sql,155);
  64. if (res > 0){
  65. System.out.println("删除成功");
  66. }else {
  67. System.out.println("删除失败");
  68. }
  69. }
  70. /**
  71. * 练习四 查询id为133的记录 并且将数据放到map集合里面 map 集合是一个双列集合里面是键值对
  72. * 使用JDBCTemp的queryformap方法返回的是一个map集合
  73. * select * from luo where id = ? ;
  74. * 使用JDBCTemplate的update方法执行sql语句 参数是 DataSource 我们使用自己的DruidTools工具类得到
  75. *
  76. * 注意:!! !这种方法只是用于查询的结果集里面只有一条记录的查询,结果集里面如果有两条记录就会报错
  77. */
  78. @Test
  79. public void test4(){
  80. JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
  81. String sql = "select * from luo where id = ? ;";
  82. //map集合里面的数据就是 将字段名封装为键 字段的值 封装为值
  83. Map<String,Object> map = jdbcTemplate.queryForMap(sql,133);
  84. //我们再回忆一下遍历map集合的方法
  85. //方法一 将键和值当做一个整体进行遍历
  86. Set<Map.Entry<String,Object>> set= map.entrySet();
  87. //set集合只能使用增强for遍历
  88. for (Map.Entry<String,Object> entry : set){
  89. System.out.println(entry.getKey()+"---"+entry.getValue());
  90. }
  91. }
  92. /**
  93. * 练习五 ; 查询所有的记录 将记录存放到list集合 list集合里面的每一个元素是一个map集合
  94. * 事实上就是把查到的每一条记录封装为一个 map集合再把所有的集合放到 一个list集合里面
  95. */
  96. @Test
  97. public void test5(){
  98. //得到JDBCTemplate对象
  99. JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
  100. String sql = "select * from luo ;";
  101. List<Map<String,Object>> list = jdbcTemplate.queryForList(sql);
  102. for (Map<String, Object> stringObjectMap : list) {
  103. System.out.println(stringObjectMap);
  104. }
  105. }
  106. /**
  107. * 练习六 ;查询所有的记录 将每一条记录封装为person对象 再把对象放到list集合里面
  108. * 使用SpringJDBC 给的 JDBCTamplate的.query方法就可以实现 将查询到的结果封装为javabean对象
  109. */
  110. @Test
  111. public void test6(){
  112. //得到Tamplate的对象 参数是DataSource
  113. JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
  114. String sql = "select * from luo ;";
  115. //第二个参数是一个 接口我们可以自己实现接口 也可以使用系统已经实现好的类 这里我们自己实现一下接口
  116. List<Person> list = jdbcTemplate.query(sql, new RowMapper<Person>() {
  117. @Override
  118. public Person mapRow(ResultSet resultSet, int i) throws SQLException {
  119. //这里的resuleSet就是查询到的结果集 i 就是查询到的记录数
  120. //我们可以使用ResultSet的getxxx方法得到指定的字段对应的值
  121. int id = resultSet.getInt("id");
  122. String name = resultSet.getString("name");
  123. int money = resultSet.getInt("money");
  124. //封装为对象
  125. Person person = new Person(id , name , money);
  126. return person;
  127. }
  128. });
  129. //遍历一下list集合
  130. for (Person person : list) {
  131. System.out.println(person);
  132. }
  133. }
  134. /**
  135. * 我们会发现自己实现一下 RowMap方法是可以的,但是比较麻烦 所以 我们来使用一下系统已经实现好的接口
  136. * 系统重写好RowMaper接口的类是 BeanPropertyRowMaper();参数是一个字节码文件 就是你想封装成类的字节码文件
  137. */
  138. @Test
  139. public void test6plus(){
  140. //得到JDBCTemplate 对象
  141. JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
  142. String sql = "select * from luo ;";
  143. //使用系统已经实心好RowMaper接口的类 BeanPropertyRowMaper();
  144. List<Person> list =jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(Person.class));
  145. //注意这里在封装成为对象的时候 数据库里面记录有时候可能为空 这样你在给对象赋值的时候可能会出错
  146. //比如 有一条记录的id为null 我们在给 Person对象的id赋值的时候 因为id值是int int不能为空 所以就会报错
  147. //因为基本类型不可以为null 解决方法就是 在Person类里面使用基本数据类型的封装类 Integer double-- Double
  148. /**
  149. * 重点!!!! 为什么这个方法可以实现 自动封装为Person对象 是因为
  150. * 他会把我们在Person里面定义的属性值 id name money 和数据库里面的字段进行匹配
  151. * 所以如果你想使用系统的BeanPropertyRowMapper方法 就要保证Person类的属性值和 数据库的字段一一对应
  152. */
  153. for (Person person : list) {
  154. System.out.println(list);
  155. }
  156. }
  157. /**
  158. * 得到记录的总数 使用聚合函数
  159. * select count(id) from luo ; () 里面一般放的是主键
  160. * 使用的方法是 queryForObject()
  161. */
  162. @Test
  163. public void test7(){
  164. JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
  165. String sql = "select count(id) from luo ;";
  166. //queryForObject()方法执行sql 前面用int接收后面第二个参数就要使用int的字节码文件 ,class
  167. int i = jdbcTemplate.queryForObject(sql,Integer.class);
  168. System.out.println(i);
  169. }
  170. }