Spring Boot - 整合JdbcTemplate、MyBatis

Spring Boot - 數據庫配置

回顧

  1. Spring Boot - 初識 Hello World
  2. Spring Boot - Servlet、過濾器、監聽器、攔截器
  3. Spring Boot - 靜態資源處理、啓動加載、日誌處理

整合JdbcTemplate

  1. pom.xml配置maven依賴
  2. application.properties配置數據源
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=1
spring.datasource.initial-size=1
spring.datasource.validation-query=SELECT 1
spring.datasource.test-on-borrow=false
spring.datasource.test-while-idle=true
spring.datasource.time-between-eviction-runs-millis=18800

實踐:查詢用戶表

  • 建立表user
CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(8) NOT NULL DEFAULT '',
  `age` int(11) NOT NULL,
  `create` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4;
  • 建立用戶實體
package com.wanye.entity;

/**
 * Created by wanye on 2017/6/3.
 */
public class User {
    private int id;
    private String name;
    private int age;
    private int create;
// 省略get set
}
  • 建立UserService並注入JdbcTemplate,實現查詢⽅法
package com.wanye.service;

import com.wanye.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;

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

/**
 * Created by wanye on 2017/6/3.
 */
@Service
public class UserService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<User> getUserList() {
        return jdbcTemplate.query("select * from user", new RowMapper<User>() {

            @Override
            public User mapRow(ResultSet resultSet, int i) throws SQLException {
                User user = new User();
                user.setId(resultSet.getInt("id"));
                user.setName(resultSet.getString("name"));
                user.setAge(resultSet.getInt("age"));
                user.setCreate(resultSet.getInt("create"));
                return user;
            }
        });
    }
}
@Autowired
    private UserService userService;
    @RequestMapping("/userlist")
    public List<User> getUserList() {
        return userService.getUserList();
    }

整合MyBatis

  1. pom.xml配置maven依賴
  2. application.properties配置mybatis
<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.2.0</version>
        </dependency>
        <!-- 省略mysql驅動依賴 -->
#關於mapper文件位置和entity類位置,你們須要按本身須要進行修改
mybatis.mapper-locations=classpath*:mapper/*Mapper.xml
mybatis.type-aliases-package=com.wanye.entity

實踐:經過用戶id查詢指定用戶信息

  • 建立mapper接口 @Mapper
package com.wanye.mapper;

import com.wanye.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

/**
 * Created by wanye on 2017/6/3.
 */
@Repository
@Mapper
public interface UserMapper {
    public User getUserById(int id);
}
  • 建立mapper.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<!-- namespace要指向定義的mapper接口 -->
<mapper namespace="com.wanye.mapper.UserMapper">
<!-- id即mapper接口中的具體方法名 -->
<!-- resultType即方法返回值-->
    <select id="getUserById" resultType="com.wanye.entity.User">
        SELECT * FROM USER WHERE id = #{id}
    </select>
</mapper>
  • 實現查詢⽅法,在userservice類中增長
@Autowired
    private UserMapper userMapper;
    public User getUserById(int id) {
        return userMapper.getUserById(id);
    }
  • 在controller中返回Json結果,省略

事務

事務概念及原理

  1. 定義:從數據庫角度說,就是一組SQL指令,要麼所有執行成功,若由於某個緣由其中一條指令執行有錯誤,則撤銷先前執行過的全部指令。更簡答的說就是:要麼所有執行成功,要麼撤銷不執行。
  2. java事務:既然事務的概念從數據庫而來,那Java事務是什麼?之間有什麼聯繫?實際上,一個Java應用系統,若是要操做數據庫,則經過JDBC來實現的。增長、修改、刪除都是經過相應方法間接來實現的,事務的控制也相應轉移到Java程序代碼中。所以,數據庫操做的事務習慣上就稱爲Java事務。
  3. 實現原理(單機事務):JDBC 事務是用 Connection 對象控制的。JDBC Connection 接口( java.sql.Connection )提供了兩種事務模式:自動提交和手工提交。 java.sql.Connection 提供瞭如下控制事務的方法:
public void setAutoCommit(boolean)  
            public boolean getAutoCommit()  
            public void commit()  
            public void rollback()

使用 JDBC 事務時,您能夠將多個 SQL 語句結合到一個事務中。JDBC 事務的一個缺點是事務的範圍侷限於一個數據庫鏈接。一個 JDBC 事務不能跨越多個數據庫。java

  1. JTA(Java Transaction API)事務(多機事務),經過xa實現,須要驅動支持。事務能夠跨越多個數據庫或多個DAO,坑比較多,使用也比較複雜。
  2. 容器事務,由j2ee容器提供,基本上是基於JTA來實現。侷限於EJB應用使用。

如何配置事務

  1. 使用註解 @EnableTransactionManagement 開啓事務支持,建議在啓動類上增長,例如
@EnableTransactionManagement
@SpringBootApplication
public class Start {
    public static void main(String[] args) {
        SpringApplication.run(Start.class, args);
    }
}
  1. 在訪問數據庫的Service方法上添加註解 @Transactional 即可

實踐:實現拷貝用戶信息,並將原用戶的name修改成xiaoming

  1. Case1:正常(新增1條記錄name=xiaohong,更新1條記錄name=xiaoming)
  2. Case2:異常(name長度超出varchar(8))致使回滾mysql

userService.java
@Transactional
public void copyUser(long id, String name) {
    User user = getUserById(id);
    int i = jdbcTemplate.update("insert INTO USER (name,age,`CREATE`) VALUES (?,?,?)", new Object[]{user.getName(), user.getAge(), user.getCreate()});
    logger.info("複製成功: i=" + i + " name=" + name + " id=" + id);
    i = jdbcTemplate.update("update USER SET name=? where id=?", new Object[]{name, user.getId()});
    logger.info("更新成功:i=" + i + " name=" + name + " id=" + id);
}
userController.java
@RequestMapping("/user/cp/{id}/{name}")
public List<User> cpUser(@PathVariable("id") long id, @PathVariable("name") String name) {
    userService.copyUser(id, name);
    return userList();
}

你們自行驗證一下,若是{name}長度超過8個字節,會致使複製成功的數據回滾。另外,mysql數據庫引擎須要使用InnoDB,並非全部的引擎都支持事務,你們能夠查詢數據庫引擎相關資料。web

總結

  • 本文講解Spring Boot整合JdbcTemplate、整合mybatis,介紹並重點講解了事務處理和配置
  • 本文未說起關於分⻚查詢和數據庫鏈接池,我認爲分頁查詢的重點是分頁算法如何封裝,並非Spring Boot關注的重點,你們能夠本身實現,
  • 另外如今經常使用的數據庫鏈接池有c3p0/dbcp/tomcat-jdbc/HikariCP
  • 順便提一下,在Spring Boot中更改數據源,只須要在application.properties配置文件中增長spring.datasource.type配置便可,例如:
spring.datasource.type=com.zaxxer.hikari.HikariDataSource

最後

若是以爲個人文章對您有用,請點贊、收藏。您的支持將鼓勵我繼續創做!爲了提升你們學習效果,錄製了同步的視頻課程,還望你們支持視頻課程算法

優惠報名

【全程擼碼】Spring Boot 1.5 快速入門教程(全)(原價:28,優惠價:22)

【全程擼碼】Spring Boot 進階(全)(原價:46,優惠價:39)

預告

  1. Spring Boot - 部署Deploy
  2. Spring Boot - 整合jsp後必須經過spring-boot:run方式啓動?

圖片描述

相關文章
相關標籤/搜索