springJDBC和SpringJDBCTemplate解决方案探究

先来看一个纯JDBC的例子,体会一下springJDBC和SpringJDBCTemplate两者的区别

一个Customer类

 1 package com.mkyong.customer.model;
 2
 3 import java.sql.Timestamp;
 4
 5 public class Customer
 6 {
 7     int custId;
 8     String name;
 9     int age;
10
11
12     public Customer(int custId, String name, int age) {
13         this.custId = custId;
14         this.name = name;
15         this.age = age;
16     }
17
18     public int getCustId() {
19         return custId;
20     }
21     public void setCustId(int custId) {
22         this.custId = custId;
23     }
24     public String getName() {
25         return name;
26     }
27     public void setName(String name) {
28         this.name = name;
29     }
30     public int getAge() {
31         return age;
32     }
33     public void setAge(int age) {
34         this.age = age;
35     }
36
37     @Override
38     public String toString() {
39         return "Customer [age=" + age + ", custId=" + custId + ", name=" + name
40                 + "]";
41     }
42
43
44 }

Dao类:

1 package com.mkyong.customer.dao;
2
3 import com.mkyong.customer.model.Customer;
4
5 public interface CustomerDAO
6 {
7     public void insert(Customer customer);
8     public Customer findByCustomerId(int custId);
9 }

DaoImpl类:

 1 package com.mkyong.customer.dao.impl;
 2
 3 import java.sql.Connection;
 4 import java.sql.PreparedStatement;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7
 8 import javax.sql.DataSource;
 9
10 import com.mkyong.customer.dao.CustomerDAO;
11 import com.mkyong.customer.model.Customer;
12
13 public class JdbcCustomerDAO implements CustomerDAO
14 {
15     private DataSource dataSource;
16
17     public void setDataSource(DataSource dataSource) {
18         this.dataSource = dataSource;
19     }
20
21     public void insert(Customer customer){
22
23         String sql = "INSERT INTO CUSTOMER " +
24                 "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
25         Connection conn = null;   //每次都要重新声明一个conection
26
27         try {
28             conn = dataSource.getConnection();
29             PreparedStatement ps = conn.prepareStatement(sql);   //每次都要进行conn.prepareStatment操作
30             ps.setInt(1, customer.getCustId());
31             ps.setString(2, customer.getName());
32             ps.setInt(3, customer.getAge());
33             ps.executeUpdate();  //每次都要提交更新
34             ps.close();  //每次都要手动关闭数据库连接
35
36         } catch (SQLException e) {   //每次都要进行异常处理。导致大量冗余的代码
37             throw new RuntimeException(e);
38
39         } finally {
40             if (conn != null) {
41                 try {
42                     conn.close();
43                 } catch (SQLException e) {}
44             }
45         }
46     }
47
48     public Customer findByCustomerId(int custId){
49
50         String sql = "SELECT * FROM CUSTOMER WHERE CUST_ID = ?";
51
52         Connection conn = null;
53
54         try {
55             conn = dataSource.getConnection();
56             PreparedStatement ps = conn.prepareStatement(sql);
57             ps.setInt(1, custId);
58             Customer customer = null;
59             ResultSet rs = ps.executeQuery();
60             if (rs.next()) {
61                 customer = new Customer(
62                         rs.getInt("CUST_ID"),
63                         rs.getString("NAME"),
64                         rs.getInt("Age")
65                 );
66             }
67             rs.close();
68             ps.close();
69             return customer;
70         } catch (SQLException e) {
71             throw new RuntimeException(e);
72         } finally {
73             if (conn != null) {
74                 try {
75                 conn.close();
76                 } catch (SQLException e) {}
77             }
78         }
79     }
80 }

上述的例子充满了大量的冗余代码。,CRUD操作都要对应的写:

1 conn.open(); 2 conn.prepareStatment(); 3 conn.close() 以及异常处理....等等

这样子显得非常多余,可以有更加优雅的解决方案吗?   废话当然有,Look~↓

提供了JdbcTemplate 来封装数据库jdbc操作细节: 
包括: 数据库连接[打开/关闭] ,异常转义 ,SQL执行 ,查询结果的转换

使用模板方式封装 jdbc数据库操作-固定流程的动作,提供丰富callback回调接口功能,方便用户自定义加工细节,更好模块化jdbc操作,简化传统的JDBC操作的复杂和繁琐过程。

看下面代码:

  1 package com.mkyong.customer.dao.impl;
  2
  3 import java.util.ArrayList;
  4 import java.util.HashMap;
  5 import java.util.List;
  6 import java.util.Map;
  7
  8 import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
  9 import org.springframework.jdbc.core.namedparam.SqlParameterSource;
 10 import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
 11 import org.springframework.jdbc.core.simple.ParameterizedBeanPropertyRowMapper;
 12 import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
 13
 14 import com.mkyong.customer.dao.CustomerDAO;
 15 import com.mkyong.customer.model.Customer;
 16 import com.mkyong.customer.model.CustomerParameterizedRowMapper;
 17
 18
 19 public class SimpleJdbcCustomerDAO extends SimpleJdbcDaoSupport implements CustomerDAO
 20 {
 21     //insert example
 22     public void insert(Customer customer){
 23
 24         String sql = "INSERT INTO CUSTOMER " +
 25             "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
 26
 27         getSimpleJdbcTemplate().update(sql, customer.getCustId(),
 28                     customer.getName(),customer.getAge()
 29         );
 30
 31     }
 32
 33     //insert with named parameter
 34     public void insertNamedParameter(Customer customer){
 35
 36         String sql = "INSERT INTO CUSTOMER " +
 37             "(CUST_ID, NAME, AGE) VALUES (:custId, :name, :age)";
 38
 39         Map<String, Object> parameters = new HashMap<String, Object>();
 40         parameters.put("custId", customer.getCustId());
 41         parameters.put("name", customer.getName());
 42         parameters.put("age", customer.getAge());
 43
 44         getSimpleJdbcTemplate().update(sql, parameters);
 45
 46     }
 47
 48
 49     //insert batch example
 50     public void insertBatch(final List<Customer> customers){
 51
 52         String sql = "INSERT INTO CUSTOMER " +
 53             "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
 54
 55         List<Object[]> parameters = new ArrayList<Object[]>();
 56         for (Customer cust : customers) {
 57             parameters.add(new Object[] {cust.getCustId(), cust.getName(), cust.getAge()});
 58         }
 59         getSimpleJdbcTemplate().batchUpdate(sql, parameters);
 60
 61     }
 62
 63     //insert batch with named parameter
 64     public void insertBatchNamedParameter(final List<Customer> customers){
 65
 66         String sql = "INSERT INTO CUSTOMER " +
 67             "(CUST_ID, NAME, AGE) VALUES (:custId, :name, :age)";
 68
 69         List<SqlParameterSource> parameters = new ArrayList<SqlParameterSource>();
 70         for (Customer cust : customers) {
 71
 72             parameters.add(new BeanPropertySqlParameterSource(cust));
 73
 74         }
 75         getSimpleJdbcTemplate().batchUpdate(sql,
 76                 parameters.toArray(new SqlParameterSource[0]));
 77     }
 78
 79     //insert batch with named parameter
 80     public void insertBatchNamedParameter2(final List<Customer> customers){
 81
 82         SqlParameterSource[] params = SqlParameterSourceUtils.createBatch(customers.toArray());
 83         getSimpleJdbcTemplate().batchUpdate(
 84                 "INSERT INTO CUSTOMER (CUST_ID, NAME, AGE) VALUES (:custId, :name, :age)",
 85                 params);
 86
 87     }
 88
 89     //insert batch example with SQL
 90     public void insertBatchSQL(final String sql){
 91
 92         getJdbcTemplate().batchUpdate(new String[]{sql});
 93
 94     }
 95
 96     //query single row with ParameterizedRowMapper
 97     public Customer findByCustomerId(int custId){
 98
 99         String sql = "SELECT * FROM CUSTOMER WHERE CUST_ID = ?";
100
101         Customer customer = getSimpleJdbcTemplate().queryForObject(
102                 sql,  new CustomerParameterizedRowMapper(), custId);
103
104         return customer;
105     }
106
107     //query single row with ParameterizedBeanPropertyRowMapper (Customer.class)
108     public Customer findByCustomerId2(int custId){
109
110         String sql = "SELECT * FROM CUSTOMER WHERE CUST_ID = ?";
111
112         Customer customer = getSimpleJdbcTemplate().queryForObject(
113                 sql,ParameterizedBeanPropertyRowMapper.newInstance(Customer.class), custId);
114
115         return customer;
116     }
117
118     //query mutiple rows with ParameterizedBeanPropertyRowMapper (Customer.class)
119     public List<Customer> findAll(){
120
121         String sql = "SELECT * FROM CUSTOMER";
122
123         List<Customer> customers =
124             getSimpleJdbcTemplate().query(sql, ParameterizedBeanPropertyRowMapper.newInstance(Customer.class));
125
126         return customers;
127     }
128
129     //query mutiple rows with ParameterizedBeanPropertyRowMapper (Customer.class)
130     public List<Customer> findAll2(){
131
132         String sql = "SELECT * FROM CUSTOMER";
133
134         List<Customer> customers =
135             getSimpleJdbcTemplate().query(sql, ParameterizedBeanPropertyRowMapper.newInstance(Customer.class));
136
137         return customers;
138     }
139
140     public String findCustomerNameById(int custId){
141
142         String sql = "SELECT NAME FROM CUSTOMER WHERE CUST_ID = ?";
143
144         String name = getSimpleJdbcTemplate().queryForObject(
145                 sql, String.class, custId);
146
147         return name;
148
149     }
150
151     public int findTotalCustomer(){
152
153         String sql = "SELECT COUNT(*) FROM CUSTOMER";
154
155         int total = getSimpleJdbcTemplate().queryForInt(sql);
156
157         return total;
158     }
159
160
161 }

细心你,会发现JdbcTemplate的实例中有一系列的方法如:queryForXXX,update,delete大大简化了JDBC操作。

当然,还可以再进一步的优化一下,就是通过依赖注入,直接把jdbcTemplate注入到dao类的jdbcT字段。

快动手试试吧!  提示:Spring还提供了和Hibernate整合的SpringHibernateTemplate解决方案哦。

时间: 2024-09-28 18:50:02

springJDBC和SpringJDBCTemplate解决方案探究的相关文章

大数据分析与机器学习系统学习路线指导(1)

3.开始专业课程的学习,请根据自己的学习能力和基础,逐渐选择学习课程,一年完成学习即可!三个专业方向课程详解如下: 数据分析师专业方向 学习路线建议 课程名称 难易程度 基础课 大数据的统计学基础 ★ 基础课 大数据的矩阵计算基础 ★ 工具课 深度玩转Excel ★ 工具课 R语言数据分析.展现与实例 ★ 工具课 SPSS数据分析入门与提高 ★★ 工具课 数据分析与SAS ★★ 应用课 基于软件学习数据挖掘算法与案例 ★ 应用课 BI实战之cognos 篇 ★★ 应用课 量化投资 ★★ 应用课

对TCP连接被重置解决方案的探究

分类: 网络与安全 对TCP连接被重置解决方案的探究——跨过GFW通向自由网络的可行途径 2010年05月25日 星期二 上午 00:19 这个标题有点长——其实开始只想写破折号之前的部分,因为这种技术文章说的隐晦一点没有坏处,但又担心大家不明白是怎么回事,硬着头皮还是补上了后面的部分. 中 国的网络环境很复杂,同时中国也是对互联网高度控制的国家之一,当然仅限于大陆.而控制中国网民自由上网的网络海关正是大名鼎鼎的GFW(Great Fire Wall,长城防火墙),GFW的工作原理就是重置TCP

【iOS发展-53】实例探究:scrollView使用方法和解决方案无法滚动核心

案例效果: (1)基本的就是练习scrollView的使用方法.界面里面的其它元素基本都是UIView和UIButton堆砌起来的. (2)主要用代码实现.当然,能够先用storyboard拖个scrollView出来.注意须要滚动的都须要放在scrollView,注意层级关系. (3)我们要在代码中使用设置这个scrollView所以直接拖拽形成一个变量,代码都在ViewController.m中: --设置scrollView的最重要的三个属性例如以下,已用凝视标出. --取得一个控件的最大

Disruptor——一种可替代有界队列完成并发线程间数据交换的高性能解决方案

本文翻译自LMAX关于Disruptor的论文,同时加上一些自己的理解和标注.Disruptor是一个高效的线程间交换数据的基础组件,它使用栅栏(barrier)+序号(Sequencing)机制协调生产者与消费者,从而避免使用锁和CAS,同时还组合使用预分配内存机制.缓存行机制(cache line).批处理效应(batch effect)来达到高吞吐量和低时延的目标.目前Disruptor版本已经迭代至3.0,本论文是基于Disruptor1.0写就,在新版本中,相对与1.0版本,其核心设计

Android热修复——Tinker微信解决方案

Android的热修复 前言: 随着时代的发展,由于公司的项目需要去求变化平凡计划总赶不上变化,H5的高灵活性,开发周期短,更新速度快H5以及一些混合开发越来越被看好,然而主要原因之一:这种混合开发的方式容错率大,更新和修复BUG快.不用发布版本就可以让用户不觉的情况下就更新对应的内容或者BUG,我们不能否认混合开发的快捷,正在此前提下热修复和热更新技术也得到了非常大的发展,不管热修复还是热更新,都是对app的内容或者逻辑变化做出像web页面更新一样的体验.而本文只对热修复进行探索,不对H5进行

探究 C++ Singleton(单例模式)

一.静态化并不是单例模式 初学者可能会犯的错误, 误以为把所有的成员变量和成员方法都用 static 修饰后, 就是单例模式了: class Singleton { public: /* static method */ private: static Singleton m_data; //static data member 在类中声明,在类外定义 }; Singleton Singleton::m_data; 乍一看确实具备单例模式的很多条件, 不过它也有一些问题. 第一, 静态成员变量初

pyttsx的中文语音识别问题及探究之路

最近在学习pyttsx时,发现中文阅读一直都识别错误,从发音来看应该是字符编码问题,但搜索之后并未发现解决方案.自己一路摸索解决,虽说最终的原因非常可笑,大牛们可能也是一眼就能洞穿,但也值得记录一下.嗯,主要并不在于解决之道,而是探究之旅. 1.版本(python2中谈编码解码问题不说版本都是耍流氓) python:2.7 pyttsx:1.2 OS:windows10中文版 2.系统的各种字符编码 sys.getdefaultencoding() ascii sys.getfilesystem

关于工厂模式的探究

关于工厂模式的探究:工厂模式分为三种:1.简单工厂模式2.工厂模式3.抽象工厂模式 1.简单工厂模式的具体特征是 只有三个对象. 1. 工厂 2. 抽象的产品  3. 真实产品 public class Test {    //抽象的产品     public interface InterfaceProduct{        void run();    }    //真实产品    public static class   Product implements InterfaceProd

[译] 探究 Swift 中的 Futures &amp; Promises

原文地址:Under the hood of Futures & Promises in Swift 原文作者:John Sundell 译者:oOatuo 校对者:Kangkang, Richard_Lee 探究 Swift 中的 Futures & Promises 异步编程可以说是构建大多数应用程序最困难的部分之一.无论是处理后台任务,例如网络请求,在多个线程中并行执行重操作,还是延迟执行代码,这些任务往往会中断,并使我们很难调试问题. 正因为如此,许多解决方案都是为了解决上述问题而