昨天寫了一篇爲何不少人不肯意用hibernate了?博客,與廣大猿友探討了一下hibernate的優劣及鏈接數據庫的方法,回家研究了一下,發現Spring JdbcTemplate挺好用的,作了個總結,分享給你們。java
聲明:本文只是小編的一點拙見,不喜勿噴。mysql
欲速則不達,欲達則欲速!spring
1、hibernate與Spring JdbcTemplate對比sql
hibernate批量處理海量數據從性能上考慮是不可取的,浪費了很大的內存。從它的機制上講hibernate是先把符合條件的數據查詢出來,放到內存中,而後再進行操做,一頓操做猛如虎,奈何性能不理想。數據庫
Spring JdbcTemplate和hibernate在處理簡單查詢操做時,效率基本相同,甚至hibernate的效率要略高一些。可是在執行批量操做,繁瑣操做時,hibernate的效率能達到Spring JdbcTemplate的80%就不錯了。但hibernate能夠極大提升開發效率,像分頁等較複雜的開發都是能夠直接完成的,因此彌補了效率的不足。數組
追求執行效率用Spring JdbcTemplate,追求開發效率用hibernate,若是存在較多批量操做,建議使用spring JdbcTemplate。mybatis
2、Spring JdbcTemplate相對於hibernate優點所在app
本人在開發的過程當中接觸比較多的是hibernate、mybatis。兩種持久層框架都感受不盡如人意。hibernate就不說了爲何不少人不肯意用hibernate了?框架
mybatis是持久層的輕量級封裝,在mybatis中若是須要進行某一個操做,首先須要定義mapper,而後再定義mapper.xml。在mapper.xml中須要完成model映射,須要寫上接口相關的sql,這個過程做者認爲重複性的工做比較多。若是能在java類中直接寫sql,同時還能進行簡單的對象操做,那麼程序將即擁有hibernate的部分優勢,又能擁有mybatis的部分優勢,豈不是很香,Spring JdbcTemplate應運而生。函數
3、Spring JdbcTemplate簡介
Spring對數據庫的操做在jdbc上面作了深層次的封裝,使用spring的注入功能,能夠把DataSource註冊到JdbcTemplate中。
JdbcTemplate位於中。其全限定命名爲org.springframework.jdbc.core.JdbcTemplate。要使用JdbcTemplate還須要一個
這個包含了事務和異常控制。
4、JdbcTemplate提供的方法
一、execute方法
能夠用於執行任何SQL語句,通常用於執行DDL語句。
二、update方法和batchUpdate方法
update方法用於執行新增、修改、刪除等語句;batchUpdate方法用於執行批量處理相關語句。
三、query方法及queryForXXX方法
用於執行查詢相關語句。
四、call方法
用於執行存儲過程、函數相關語句。
5、案例分析
一、在src下新建一個屬性配置文件
jdbc.user=root jdbc.password=123456 jdbc.driverClass=com.mysql.jdbc.Driver jdbc.jdbcUrl=jdbc\:mysql\:///test
咱們一般將數據庫的配置信息單獨放到一個文件中,這樣也爲了方便後期維護。
二、配置Spring配置文件applicationContext.xml
<context:property-placeholder location="classpath:db.properties"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean>
第一行代碼:用來讀取db.properties文件中的數據。
第二行代碼:用來配置一個數據源,這裏數據實現類來此C3P0中的一個屬性類,其中屬性的值就是來自於db.properties。
第九行代碼:配置一個JdbcTemplate實例,並注入一個dataSource數據源。
三、update()方法
(1)經過update插入數據
//啓動IoC容器 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); //獲取IoC容器中JdbcTemplate實例 JdbcTemplate jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate"); String sql="insert into user (name,deptid) values (?,?)"; int count= jdbcTemplate.update(sql, new Object[]{"caoyc",3}); System.out.println(count);
這裏update方法,第二參能夠爲可變參數。在數據庫中能夠看到,數據以被正確插入
(2)經過update修改數據
String sql="update user set name=?,deptid=? where id=?"; jdbcTemplate.update(sql,new Object[]{"zhh",5,51});
(3)經過update刪除數據
String sql="delete from user where id=?"; jdbcTemplate.update(sql,51);
四、batchUpdate()批量插入、更新和刪除方法
批量插入
String sql="insert into user (name,deptid) values (?,?)"; List<Object[]> batchArgs=new ArrayList<Object[]>(); batchArgs.add(new Object[]{"caoyc",6}); batchArgs.add(new Object[]{"zhh",8}); batchArgs.add(new Object[]{"cjx",8}); jdbcTemplate.batchUpdate(sql, batchArgs);
batchUpdate方法第二參數是一個元素爲Object[]數組類型的List集合。
五、從數據庫中讀取數據到實體對象
(1)先定義一個User實體類
package com.proc; public class User { private Integer id; private String name; private Integer deptid; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getDeptid() { return deptid; } public void setDeptid(Integer deptid) { this.deptid = deptid; } public String toString() { return "User [id=" + id + ", name=" + name + ", deptid=" + deptid + "]"; } }
(2)讀取單個對象
String sql="select id,name,deptid from user where id=?"; RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class); User user= jdbcTemplate.queryForObject(sql, rowMapper,52); System.out.println(user);
輸出結果
User [id=52, name=caoyc, deptid=6]
注意:
(3)讀取多個對象
String sql="select id,name,deptid from user"; RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class); List<User> users= jdbcTemplate.query(sql, rowMapper); for (User user : users) { System.out.println(user); }
輸出結果
... User [id=49, name=姓名49, deptid=5] User [id=50, name=姓名50, deptid=8] User [id=52, name=caoyc, deptid=6] User [id=53, name=zhh, deptid=8] User [id=54, name=cjx, deptid=8] ...
(4)獲取某個記錄某列或者count、avg、sum等函數返回惟一值
String sql="select count(*) from user"; int count= jdbcTemplate.queryForObject(sql, Integer.class); System.out.println(count);
6、實際開發中的應用
一、UserDao.java
package com.proc; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; @Repository public class UserDao { @Autowired private JdbcTemplate jdbcTemplate; public User get(int id){ String sql="select id,name,deptid from user where id=?"; RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class); return jdbcTemplate.queryForObject(sql, rowMapper,id); } }
二、XML配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <context:component-scan base-package="com.proc"></context:component-scan> <context:property-placeholder location="classpath:db.properties"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean> </beans>
三、代碼測試
UserDao userDao=(UserDao) ctx.getBean("userDao"); System.out.println(userDao.get(53));
推薦博文