Java——数据库编程JDBC之JDBCTemplate的使用简化数据库操作步骤(含增删改查练习实例源码)

举报
Winter_world 发表于 2021/09/28 22:43:54 2021/09/28
【摘要】 目录 0 引言 1 Spring JDBC 1.1 JDBCTemplate使用步骤 1.2 JDBCTemplate练习 0 引言 上一篇博文中讲解了数据库连接池技术,使用该技术代码的复用度和效率均有提高,但是在做JDBC操作时还是比较麻烦,特别是处理查询结果时,要从结果集中获取数据,再封装成对象等等。 实际...

目录

0 引言

1 Spring JDBC

1.1 JDBCTemplate使用步骤

1.2 JDBCTemplate练习


0 引言

上一篇博文中讲解了数据库连接池技术,使用该技术代码的复用度和效率均有提高,但是在做JDBC操作时还是比较麻烦,特别是处理查询结果时,要从结果集中获取数据,再封装成对象等等。

实际上我们希望的最理想操作就是定义好sql,再把它执行了,像抽取数据再封装、释放资源等这样的体力活不希望自己来做,本文介绍一个JDBC 简单封装类Spring JDBC,简化程序开发步骤。

1 Spring JDBC

其是Spring框架对JDBC的简单封装(Spring框架是JavaEE的灵魂框架,后续再学习总结),它提供了一个JDBC Template对象来简化JDBC的开发。

1.1 JDBCTemplate使用步骤

使用步骤:

  • 1)导入5个jar包(同样也需要数据库连接池和驱动的jar包);
  • 2)创建JDBCTemplate对象,依赖于数据源DataSource;
  • 3)调用JDBCTemplate的方法来完成CRUD的操作:
          update方法:执行DML增删改语句;
          query方法:queryForMap(),查询结果,将结果集封装为Map集合,将列名作为key,将值作为value,注意:查询的结果集长度只能是1;
           queryForList(),查询结果,将结果集封装为List集合,将每一条记录封装为一个Map集合,再将Map集合装载至List集合;
           query(),查询结果,将结果封装为JavaBean对象(最为常用),其参数:一般使用BeanPropertyRowMapper<JavaBean>(JavaBean.class),可以实现数据到JavaBean的自动封装。
           queryForObject(),查询结果,将结果封装为对象。一般用于聚合函数的查询。

【举例】JdbcTemplate入门程序,实现一行数据的更新


  
  1. public class JdbcTemplateDemo1 {
  2. public static void main(String[] args) {
  3. //1、导入jar包
  4. //2、创建JDBCTemplate对象
  5. JdbcTemplate template = new JdbcTemplate(JdbcUtils.getDataSource());
  6. //3、调用方法
  7. String sql = "update account set balance = 5000 where id = ?";
  8. int count = template.update(sql, 1);
  9. System.out.println(count); //返回值为1
  10. }
  11. }

以上入门程序可以看出,使用JdbcTemplate极大的简化了程序,方便用户操作(其中JdbcUtils是Druid的工具类,请查看上一篇博客中有提供源码)。

1.2 JDBCTemplate练习

以本地数据库db1的emp表为练习对象,需求:

  • 1)修改id=1的salary为888;
  • 2)添加一条记录;
  • 3)删除刚才添加的记录;
  • 4)查询id=1的记录,将结果封装为Map集合;
  • 5)查询所有记录,将其封装为List集合;
  • 6)查询所有记录,将其封装为Emp对象的List集合;
  • 7)查询总记录数。

【原表数据】:

【Junit测试用例】:


  
  1. public class JdbcTemplateDemo2 {
  2. //Juint单元测试,让方法独立执行,不依赖于主方法
  3. //1、获取JdbcTemplate对象
  4. private JdbcTemplate template = new JdbcTemplate(JdbcUtils.getDataSource());
  5. // 1)修改id=1的salary为888;
  6. @Test
  7. public void test1(){
  8. String sql = "update emp set salary = 888 where id = 1";
  9. int count = template.update(sql);
  10. System.out.println(count);
  11. }
  12. // 2)添加一条记录;
  13. @Test
  14. public void test2(){
  15. String sql = "insert into emp(id,name,gender,salary,join_date,dept_id) values(6,'张三','男',100,'2020-01-01',1) ";
  16. int count = template.update(sql);
  17. System.out.println(count);
  18. }
  19. // 3)删除刚才添加的记录;
  20. @Test
  21. public void test3(){
  22. String sql = "delete from emp where id = ?";
  23. int count = template.update(sql,6);
  24. System.out.println(count);
  25. }
  26. // 4)查询id=1的记录,将结果封装为Map集合;
  27. @Test
  28. public void test4(){
  29. String sql = "select * from emp where id = ?";
  30. Map<String, Object> map = template.queryForMap(sql, 1);
  31. System.out.println(map);
  32. //结果:{id=1, NAME=孙悟空, gender=男, salary=888.0, join_date=2013-02-24, dept_id=1}
  33. }
  34. // 5)查询所有记录,将其封装为List集合;
  35. @Test
  36. public void test5(){
  37. String sql = "select * from emp";
  38. List<Map<String, Object>> list = template.queryForList(sql);
  39. for (Map<String, Object> stringObjectMap : list) {
  40. System.out.println(stringObjectMap);
  41. }
  42. /* {id=1, NAME=孙悟空, gender=男, salary=888.0, join_date=2013-02-24, dept_id=1}
  43. {id=2, NAME=猪八戒, gender=男, salary=3600.0, join_date=2010-12-02, dept_id=2}
  44. {id=3, NAME=唐僧, gender=男, salary=9000.0, join_date=2008-08-08, dept_id=2}
  45. {id=4, NAME=白骨精, gender=女, salary=5000.0, join_date=2015-10-07, dept_id=3}
  46. {id=5, NAME=蜘蛛精, gender=女, salary=4500.0, join_date=2011-03-14, dept_id=1}*/
  47. }
  48. // 6)查询所有记录,将其封装为Emp对象的List集合;
  49. @Test
  50. public void test6() {
  51. String sql = "select * from emp";
  52. List<Emp> empList = template.query(sql, new RowMapper<Emp>() {
  53. @Override
  54. public Emp mapRow(ResultSet rs, int i) throws SQLException {
  55. Emp emp = new Emp();
  56. int id = rs.getInt("id");
  57. String name = rs.getString("name");
  58. String gender = rs.getString("gender");
  59. double salary = rs.getDouble("salary");
  60. Date join_date = rs.getDate("join_date");
  61. int dept_id = rs.getInt("dept_id");
  62. emp.setId(id);
  63. emp.setName(name);
  64. emp.setGender(gender);
  65. emp.setSalary(salary);
  66. emp.setJoin_date(join_date);
  67. emp.setDept_id(dept_id);
  68. return emp;
  69. }
  70. });
  71. for (Emp emp : empList) {
  72. System.out.println(emp);
  73. }
  74. }
  75. /* Emp{id=1, name='孙悟空', gender='男', salary=888.0, joindate=2013-02-24, dept_id=1}
  76. Emp{id=2, name='猪八戒', gender='男', salary=3600.0, joindate=2010-12-02, dept_id=2}
  77. Emp{id=3, name='唐僧', gender='男', salary=9000.0, joindate=2008-08-08, dept_id=2}
  78. Emp{id=4, name='白骨精', gender='女', salary=5000.0, joindate=2015-10-07, dept_id=3}
  79. Emp{id=5, name='蜘蛛精', gender='女', salary=4500.0, joindate=2011-03-14, dept_id=1}*/
  80. // 6)查询所有记录,将其封装为Emp对象的List集合;简化的形式
  81. @Test
  82. public void test6_2() {
  83. String sql = "select * from emp";
  84. List<Emp> empList = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
  85. for (Emp emp : empList) {
  86. System.out.println(emp);
  87. }
  88. }
  89. //7)查询总记录数
  90. @Test
  91. public void test7() {
  92. String sql = "select count(id) from emp";
  93. Long total = template.queryForObject(sql, Long.class); //一般来执行聚合函数
  94. System.out.println(total); //5
  95. }
  96. }

作于202007101050,已归档

———————————————————————————————————

本文为博主原创文章,转载请注明出处!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。

原文链接:winter.blog.csdn.net/article/details/107191804

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。