spring 數據庫操作之JDBC(05)

Spring JDBC模板

一. 單獨使用jdbc

Java Database Connectivity(JDBC) 是Java api標準的一部分.是用來Java開發(fā)語言和多數數據庫交換.JDBC是編程接口,供Java開發(fā)者用來訪問數據庫.JDBC提供了很多方法用來查詢,更新,和刪除數據庫數據,JDBC庫主要提供的接口使用步驟

  1. 創(chuàng)建數據庫鏈接
  2. 創(chuàng)建SQL聲明
  3. 執(zhí)行SQL語句
  4. 查看或者數據結果集
  5. 關閉鏈接

下面是一個使用JDBC操作數據庫的簡單例子

創(chuàng)建數據庫spring_jdbc和表employee

create table employee(
    id int primary key auto_increment,
    name varchar(32)
);

創(chuàng)建Java工程,導入連接MySQL的jar包:mysql-connector-java-5.1.7-bin.jar

Entity:

Employee.java

package com.it.entity;

public class Employee {
    private int id;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Employee(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return this.id+"==>"+this.name;
    }
}

接口EmployeeDao.java

package com.it.dao;

import java.io.Serializable;
import com.it.entity.Employee;

public interface EmployeeDao {
    Employee getEmployeeById(Serializable id);
    //void createEmployee();
    void insertEmployee(Employee employee);
}

接口EmployeeDao的實現類:EmployeeDaoImpl.java

package com.it.dao.impl;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.it.dao.EmployeeDao;
import com.it.entity.Employee;

public class EmployeeDaoImpl implements EmployeeDao{
    private String url = "jdbc:mysql://localhost:3306/spring_jdbc?useUnicode=true&characterEncoding=utf-8";
    private String user = "root";
    private String password = "1l9o9v0e";
    private String className = "com.mysql.jdbc.Driver";
    
    @Override
    public Employee getEmployeeById(Serializable id) {
        // TODO Auto-generated method stub
        Connection connection = null;
        Employee employee = null;
        
        try {
            Class.forName(className);
            connection = DriverManager.getConnection(url, user, password);
            PreparedStatement statement = connection.prepareStatement(""
                    + "select id,name from employee where id=?");
            statement.setInt(1, (int) id);
            ResultSet rs = statement.executeQuery();
            if (rs.next()) {
                employee = new Employee(rs.getInt("id"), rs.getString("name"));
            }
            rs.close();
            statement.close();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally {
            if (connection!=null) {
                try {
                    connection.close();
                } catch (Exception e2) {
                    // TODO: handle exception
                    throw new RuntimeException(e2);
                }
            }
        }
        
        return employee;
    }

    @Override
    public void insertEmployee(Employee employee) {
        // TODO Auto-generated method stub
        Connection connection = null;
        try {
            
            Class.forName(className);
            connection = DriverManager.getConnection(url, user, password);
            PreparedStatement statement = connection.prepareStatement("insert into employee(name) values(?)");
            
            statement.setString(1, employee.getName());
            statement.execute();
                    
            statement.close();
            
        } catch (Exception e) {
            // TODO: handle exception
            throw new RuntimeException(e);
        }finally {
            if (connection!=null) {
                try {
                    connection.close();
                } catch (Exception e2) {
                    // TODO: handle exception
                    throw new RuntimeException(e2);
                }
            }
        }
    }

}

測試JDBC操作數據庫:JdbcDemo.java

package com.it.a_jdbc;

import org.junit.Test;

import com.it.dao.EmployeeDao;
import com.it.dao.impl.EmployeeDaoImpl;
import com.it.entity.Employee;

public class JdbcDemo {

    private EmployeeDao employeeDao = new EmployeeDaoImpl();
    
    @Test
    public void testJdbcInsert() {
        Employee employee = new Employee(2, "大佬");
        employeeDao.insertEmployee(employee);
        System.out.println("insert success!");
    }
    
    @Test
    public void testJdbcGet() {
        Employee emp = employeeDao.getEmployeeById(1);
        System.out.println(emp);
    
    }
    
}

運行測試方法,數據庫會增加近name='大佬'的數據,同樣可以獲取ID為1的數據

二. Spring 對JDBC的支持

在前面的小例子,我們沒有引入spring相關的方法,實現了一個Java類進行DAO操作:使用JDBC連接到數據庫,進行數據操作.在下面的內容,將會學習spring框架通過去除重復代碼,讓我們的工作更加簡單.

使用 spring JdbcTemplate查找數據庫

2.1 引入spring-JDBC相關jar包

c3p0-0.9.1.2.jar
commons-logging-1.1.3.jar
mysql-connector-java-5.1.7-bin.jar
spring-aop-4.1.6.RELEASE.jar
spring-aspects-4.1.6.RELEASE.jar
spring-beans-4.1.6.RELEASE.jar
spring-context-4.1.6.RELEASE.jar
spring-core-4.1.6.RELEASE.jar
spring-expression-4.1.6.RELEASE.jar
spring-jdbc-4.1.6.RELEASE.jar
spring-tx-4.1.6.RELEASE.jar

2.2 src目錄下創(chuàng)建bean.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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        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.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
        
        
        
        <!-- 數據源對象:c3p0連接池 -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
            <property name="jdbcUrl" value="jdbc:mysql:///spring_jdbc?useUnicode=true&characterEncoding=utf8"></property>
            <property name="user" value="root"></property>
            <property name="password" value="1l9o9v0e"></property>
            <property name="initialPoolSize" value="3"></property>
            <property name="maxPoolSize" value="10"></property>
            <property name="maxStatements" value="100"></property>
            <property name="acquireIncrement" value="2"></property>
        
        </bean>
        
        
        <!-- jdbcTemplate工具類實例 -->
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
        
        <bean id="userDao" class="com.it.dao.impl.UserDaoImpl">
            <property name="jdbcTemplate" ref="jdbcTemplate"></property>
        </bean>
        
        
</beans>

2.3 相關類的主要代碼

創(chuàng)建Entity類:User.java

package com.it.entity;

public class User {
    private int id;
    private String name;
    private int age;
    
    public void setAge(int age) {
        this.age = age;
    }
    
    public int getAge() {
        return age;
    }
    
    public User() {
        // TODO Auto-generated constructor stub
        super();
    }
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public User(int id, String name,int age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "id:"+this.id+"==>:name"+this.name+"==>age:"+this.age;
    }
}

接口 UserDao.java

package com.it.dao;

import com.it.entity.User;

public interface UserDao {
    //根據ID獲取用戶
    User getUserById(int id);
    //插入數據
    int insertUser(User user);
    //刪除用戶
    int deleteUserById(int id);
    //獲取用戶數量
    int getUserCount();
    //更新用戶
    void updateUser(User user);
    
}

UserDao的實現,UserDaoImpl.java

package com.it.dao.impl;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import com.it.dao.UserDao;
import com.it.entity.User;

public class UserDaoImpl implements UserDao{

    private JdbcTemplate jdbcTemplate;
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    //user_t
    @Override
    public User getUserById(int id) {
        // TODO Auto-generated method stub
        String sql = "select id,name,age from user_t where id=?";
        return jdbcTemplate.queryForObject(sql, new MyMapper(),id);
    }

    @Override
    public int insertUser(User user) {
        // TODO Auto-generated method stub
        String sql = "insert into user_t(name,age) values(?,?)";
        int affect = jdbcTemplate.update(sql, user.getName(),user.getAge());
        return affect;
    }

    @Override
    public int deleteUserById(int id) {
        String delQuery = "delete from user_t where id = ?";
        return jdbcTemplate.update(delQuery, new Object[] { id });
    }

    @Override
    public int getUserCount() {
        // TODO Auto-generated method stub
        String sql = "select count(id) from user_t";
        
        return jdbcTemplate.queryForObject(sql, null, Integer.class);
    }

    @Override
    public void updateUser(User user) {
        // TODO Auto-generated method stub
        User user2 = this.getUserById(user.getId());
        if (user2!=null) {
            String sql = "update user_t set name=?,age=? where id=?";
            jdbcTemplate.update(sql, user.getName(),user.getAge(),user.getId());
        }
    }
    
    
    public void insertUsers(final List<User> users) {
        String sql = "insert into user_t(name,age) values(?,?)";
        
        jdbcTemplate.batchUpdate(sql,
                new BatchPreparedStatementSetter() {
                    
                    @Override
                    public void setValues(PreparedStatement statement, int i) throws SQLException {
                        // TODO Auto-generated method stub
                        User user = users.get(i);
                        statement.setString(1, user.getName());
                        statement.setInt(2, user.getAge());
                        
                    }
                    
                    @Override
                    public int getBatchSize() {
                        // TODO Auto-generated method stub
                        return users.size();
                    }
                }
            );
    }
    
    public void batchUpdate() {
        jdbcTemplate.batchUpdate(new String[]{
                "update user_t set age=100 where id=5",
                "update user_t set age=100 where id=6",
                "update user_t set age=100 where id=7"
        });
    }
    
    class MyMapper implements RowMapper<User>{

        @Override
        public User mapRow(ResultSet rs, int index) throws SQLException {
            // TODO Auto-generated method stub
            User user = new User(rs.getInt("id"),rs.getString("name"), rs.getInt("age"));
            return user;
        }
    }
}

測試類:測試spring JDBCTemplate簡單的CRUD

JdbcTemplateDemo.java

package com.it.b_jdbc_template;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.it.dao.UserDao;
import com.it.dao.impl.UserDaoImpl;
import com.it.entity.User;

public class JdbcTemplateDemo {
    
    private ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
    
    @Test
    public void getUserById() {
        UserDao userDao = (UserDao) ac.getBean("userDao");
        User user = userDao.getUserById(1);
        System.out.println(user);
    } 
    
    @Test
    public void insertUser(){
        UserDao userDao = (UserDao) ac.getBean("userDao");
        User user = new User(3, "小愛", 12);
        int count = userDao.insertUser(user);
        System.out.println("插入成功!:"+count);
    
    }
    
    @Test
    public void deleteUserById(){
        UserDao userDao = (UserDao) ac.getBean("userDao");
        int index = userDao.deleteUserById(2);
        System.out.println("刪除成功!:"+index);
    }
    
    @Test
    public void getUserCount(){
        UserDao userDao = (UserDao) ac.getBean("userDao");
        int userCount = userDao.getUserCount();
        System.out.println("總的用戶個數: "+userCount);
    }
    
    @Test
    public void updateUser(){
        UserDao userDao = (UserDao) ac.getBean("userDao");
        User user = new User(1, "大兵", 44);
        userDao.updateUser(user);
        System.out.println("更新成功: "+user.toString());
        
    }
    
    @Test
    public void batchOperation() {
        List<User> list = new ArrayList<>();
        for(int i = 0;i<10;i++){
            User user = new User(i+5, "Rose"+i+1, i+23);
            list.add(user);
        }
        
        UserDaoImpl userDao = (UserDaoImpl) ac.getBean("userDao");
        userDao.insertUsers(list);
        int userCount = userDao.getUserCount();
        System.out.println("總的用戶數量: "+userCount);
    }
    
    @Test
    public void batchUpdate() {
        UserDaoImpl userDao = (UserDaoImpl) ac.getBean("userDao");
        userDao.batchUpdate();
        
    }
}

2.4 spring JDBC的批處理操作

批處理:單個可執(zhí)行的操作單元組成的多步操作.如果需要進行多次同樣的操作,JDBC驅動會表現更加流暢.此外,如果多個更新操作處理,可以限制運行的操作數量.

通常來說,運行程序的服務器和數據庫服務器不在同一個位置.假設現在需要執(zhí)行100次執(zhí)行語句,
通常來說,我們會在程序將查詢語句逐條的發(fā)送到數據庫服務器并執(zhí)行.這樣,我們必須通過網絡將查詢語句發(fā)送到數據庫服務器.這樣會導致交流成本的消耗降低性能.所以,為了挺高性能和減少交流的消耗,使用JDBC的批處理操作.

批處理操作允許我們一次性提交多個SQL語句到服務器.JDBCTemplate支持JDBC 多個statement
或者多個prepareStatement的操作

jdbcTemplate有兩個重載batchUpdate()方法

  • 一個方法是執(zhí)行多個JDBC statement語句 : public int[] batchUpdate(String[] sql) throws DataAccessException

比如:

jdbcTemplate.batchUpdate (new String [] {
"update emp set salary = salary * 1.5 where empId = 10101",
"update emp set salary = salary * 1.2 where empId = 10231", "update dept set location = 'Bangalore' where deptNo = 304"
});
  • 另外一個方法是執(zhí)行SQL statement語句多次,可以有不同的參數,使用preparestatement語句

public int[] batchUpdate(String sql, BatchPreparedStatementSetter bPSS) throws DataAccessException

主要例子看 UserDaoImpl.java的兩個方法


    public void insertUsers(final List<User> users) {
        String sql = "insert into user_t(name,age) values(?,?)";
        
        jdbcTemplate.batchUpdate(sql,
                new BatchPreparedStatementSetter() {
                    
                    @Override
                    public void setValues(PreparedStatement statement, int i) throws SQLException {
                        // TODO Auto-generated method stub
                        User user = users.get(i);
                        statement.setString(1, user.getName());
                        statement.setInt(2, user.getAge());
                        
                    }
                    
                    @Override
                    public int getBatchSize() {
                        // TODO Auto-generated method stub
                        return users.size();
                    }
                }
            );
    }
    
    public void batchUpdate() {
        jdbcTemplate.batchUpdate(new String[]{
                "update user_t set age=100 where id=5",
                "update user_t set age=100 where id=6",
                "update user_t set age=100 where id=7"
        });
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末腾务,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子涝婉,更是在濱河造成了極大的恐慌加叁,老刑警劉巖倦沧,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異它匕,居然都是意外死亡展融,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門豫柬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來告希,“玉大人,你說我怎么就攤上這事烧给⊙嗯迹” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵础嫡,是天一觀的道長指么。 經常有香客問我,道長榴鼎,這世上最難降的妖魔是什么伯诬? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮巫财,結果婚禮上盗似,老公的妹妹穿的比我還像新娘。我一直安慰自己平项,他們只是感情好桥言,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布萌踱。 她就那樣靜靜地躺著,像睡著了一般号阿。 火紅的嫁衣襯著肌膚如雪并鸵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天扔涧,我揣著相機與錄音园担,去河邊找鬼。 笑死枯夜,一個胖子當著我的面吹牛弯汰,可吹牛的內容都是我干的。 我是一名探鬼主播湖雹,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咏闪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了摔吏?” 一聲冷哼從身側響起鸽嫂,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎征讲,沒想到半個月后据某,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡诗箍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年癣籽,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滤祖。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡筷狼,死狀恐怖,靈堂內的尸體忽然破棺而出匠童,到底是詐尸還是另有隱情埂材,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布俏让,位于F島的核電站楞遏,受9級特大地震影響,放射性物質發(fā)生泄漏首昔。R本人自食惡果不足惜寡喝,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勒奇。 院中可真熱鬧预鬓,春花似錦、人聲如沸赊颠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至顶猜,卻和暖如春沧奴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背长窄。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工滔吠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挠日。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓疮绷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嚣潜。 傳聞我的和親對象是個殘疾皇子冬骚,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容

  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,810評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現懂算,斷路器只冻,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 主要內容 定義Spring的數據訪問支持 配置數據庫資源 使用Spring提供的JDBC模板 寫在前面:經過上一篇...
    程序熊大閱讀 8,760評論 1 31
  • 《北京折疊》火了一段時間了。趕緊找來看看犯犁,說實話有點失望属愤。 同樣是獲得雨果獎女器,與“三體”沒法比酸役。 當然,它是短篇小...
    德萬托阿閱讀 1,568評論 0 4
  • 今天一直在想寫什么好呢驾胆,剛才突然想到周末兩天是可以休息不寫的涣澡,那么我可以寫一下休息。 今天沒什么特別的安排丧诺,老大不...
    by_10閱讀 224評論 0 0