素小暖講Spring JdbcTemplate

昨天寫了一篇爲何不少人不肯意用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]

注意:

  • 使用BeanPropertyMapper要求sql數據查詢出來的列和實體屬性須要一一對應。若是數據中列名和屬性名不一致,在sql語句中須要用as從新取一個別名。
  • 使用JdbcTemplate對象不能獲取關聯對象

(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));

 

推薦博文

素小暖講Java框架(SSH、SSM、Springboot)

相關文章
相關標籤/搜索