1. 程式人生 > >資料庫操作之整合Mybaties和事務講解 5節課

資料庫操作之整合Mybaties和事務講解 5節課

1、SpringBoot2.x持久化資料方式介紹
    
     簡介:介紹近幾年常用的訪問資料庫的方式和優缺點

        1、原始java訪問資料庫
             開發流程麻煩
             1、註冊驅動/載入驅動
                 Class.forName("com.mysql.jdbc.Driver")
             2、建立連線
                 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname","root","root");
             3、建立Statement

             4、執行SQL語句

             5、處理結果集

             6、關閉連線,釋放資源

        2、apache dbutils框架
             比上一步簡單點
             官網:

https://commons.apache.org/proper/commons-dbutils/
         3、jpa框架
             spring-data-jpa
             jpa在複雜查詢的時候效能不是很好
        
         4、Hiberante   解釋:ORM:物件關係對映Object Relational Mapping
             企業大都喜歡使用hibernate
        
         5、Mybatis框架  
             網際網路行業通常使用mybatis
             不提供物件和關係模型的直接對映,半ORM
        


2、SpringBoot2.x整合Mybatis3.x註解實戰
     簡介:SpringBoot2.x整合Mybatis3.x註解配置實戰

        1、使用starter, maven倉庫地址:http://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter

        2、加入依賴(可以用 http://start.spring.io/ 下載)
                    
             <!-- 引入starter-->
                     <dependency>
                         <groupId>org.mybatis.spring.boot</groupId>
                         <artifactId>mybatis-spring-boot-starter</artifactId>
                         <version>1.3.2</version>
                         <scope>runtime</scope>               
                     </dependency>
                     
              <!-- MySQL的JDBC驅動包    -->   
                      <dependency>
                         <groupId>mysql</groupId>
                         <artifactId>mysql-connector-java</artifactId>
                         <scope>runtime</scope>
                     </dependency>
             <!-- 引入第三方資料來源 -->       
                     <dependency>
                         <groupId>com.alibaba</groupId>
                         <artifactId>druid</artifactId>
                         <version>1.1.6</version>
                     </dependency>

        3、加入配置檔案
             #mybatis.type-aliases-package=net.xdclass.base_project.domain
             #可以自動識別
             #spring.datasource.driver-class-name =com.mysql.jdbc.Driver

            spring.datasource.url=jdbc:mysql://localhost:3306/movie?useUnicode=true&characterEncoding=utf-8
             spring.datasource.username =root
             spring.datasource.password =password
             #如果不使用預設的資料來源 (com.zaxxer.hikari.HikariDataSource)
             spring.datasource.type =com.alibaba.druid.pool.DruidDataSource

        載入配置,注入到sqlSessionFactory等都是springBoot幫我們完成

        4、啟動類增加mapper掃描
             @MapperScan("net.xdclass.base_project.mapper")

             技巧:儲存物件,獲取資料庫自增id
              @Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")

              說明:keyProperty java物件的屬性;keyColumn表示資料庫的欄位

        4、開發mapper
             參考語法 http://www.mybatis.org/mybatis-3/zh/java-api.html

        5、sql指令碼
             CREATE TABLE `user` (
               `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
               `name` varchar(128) DEFAULT NULL COMMENT '名稱',
               `phone` varchar(16) DEFAULT NULL COMMENT '使用者手機號',
               `create_time` datetime DEFAULT NULL COMMENT '建立時間',
               `age` int(4) DEFAULT NULL COMMENT '年齡',
               PRIMARY KEY (`id`)
             ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;


controller——存放api

domain——存放實體類

mapper/dao——訪問資料庫介面

service——業務層

utils——工具類

程式碼例項:

controller/UserController.java:

  1 package net.xdclass.base_project.controller;
  2 
  3 
  4 import java.util.Date;
  5 
  6 import net.xdclass.base_project.domain.JsonData;
  7 import net.xdclass.base_project.domain.User;
  8 import net.xdclass.base_project.service.UserService;
  9 
 10 import org.springframework.beans.factory.annotation.Autowired;
 11 import org.springframework.web.bind.annotation.GetMapping;
 12 import org.springframework.web.bind.annotation.RequestMapping;
 13 import org.springframework.web.bind.annotation.RestController;
 14 
 15 @RestController
 16 @RequestMapping("/api/v1/user")
 17 public class UserController {
 18 
 19 
 20 	@Autowired
 21 	private UserService userService;
 22 
 23 
 24 	/**
 25 	 * 功能描述: user 儲存介面
 26 	 * @return
 27 	 */
 28 	@GetMapping("add")
 29 	public Object add(){
 30 
 31 		User user = new User();
 32 		user.setAge(11);
 33 		user.setCreateTime(new Date());
 34 		user.setName("xdclass");
 35 		user.setPhone("10010000");
 36 		int id = userService.add(user);
 37 
 38        return JsonData.buildSuccess(id);
 39 	}
 40 
 41 //	@Autowired
 42 //	private UserMapper userMapper;
 43 //	
 44 //	
 45 //	
 46 //	@GetMapping("findAll")
 47 //	public Object findAll(){
 48 //		
 49 //       return JsonData.buildSuccess(userMapper.getAll());
 50 //	}
 51 //	
 52 //	
 53 //	
 54 //	@GetMapping("findById")
 55 //	public Object findById(long id){
 56 //       return JsonData.buildSuccess(userMapper.findById(id));
 57 //	}
 58 //	
 59 //	
 60 //	@GetMapping("del_by_id")
 61 //	public Object delById(long id){
 62 //	userMapper.delete(id);
 63 //       return JsonData.buildSuccess();
 64 //	}
 65 //	
 66 //	@GetMapping("update")
 67 //	public Object update(String name,int id){
 68 //		User user = new User();
 69 //		user.setName(name);
 70 //		user.setId(id);
 71 //		userMapper.update(user);
 72 //	    return JsonData.buildSuccess();
 73 //	}
 74 //	
 75 
 76 //	//測試事務
 77 //	@GetMapping("transac")
 78 //	public Object transac(){
 79 //		int id = userService.addAccount();
 80 //	    return JsonData.buildSuccess(id);
 81 //	}
 82 //	
 83 //	
 84 
 85 }
 86 

實體類User.java:

  1 package net.xdclass.base_project.domain;
  2 
  3 import java.util.Date;
  4 
  5 public class User {
  6 
  7 	private int id;
  8 
  9 	private String name;
 10 
 11 	private String phone;
 12 
 13 	private int age;
 14 
 15 	private Date createTime;
 16 
 17 	public int getId() {
 18 		return id;
 19 	}
 20 
 21 	public void setId(int id) {
 22 		this.id = id;
 23 	}
 24 
 25 	public String getName() {
 26 		return name;
 27 	}
 28 
 29 	public void setName(String name) {
 30 		this.name = name;
 31 	}
 32 
 33 	public String getPhone() {
 34 		return phone;
 35 	}
 36 
 37 	public void setPhone(String phone) {
 38 		this.phone = phone;
 39 	}
 40 
 41 	public int getAge() {
 42 		return age;
 43 	}
 44 
 45 	public void setAge(int age) {
 46 		this.age = age;
 47 	}
 48 
 49 	public Date getCreateTime() {
 50 		return createTime;
 51 	}
 52 
 53 	public void setCreateTime(Date createTime) {
 54 		this.createTime = createTime;
 55 	}
 56 
 57 
 58 
 59 
 60 }
 61 

UserMapper.java:

  1 package net.xdclass.base_project.mapper;
  2 
  3 import net.xdclass.base_project.domain.User;
  4 
  5 import org.apache.ibatis.annotations.Insert;
  6 import org.apache.ibatis.annotations.Options;
  7 
  8 public interface UserMapper {
  9 
 10 
 11 	//推薦使用#{}取值,不要用${},因為存在注入的風險
 12 	 @Insert("INSERT INTO user(name,phone,create_time,age) VALUES(#{name}, #{phone}, #{createTime},#{age})")
 13 	 @Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")   //keyProperty java物件的屬性;keyColumn表示資料庫的欄位
 14 	 int insert(User user);
 15 
 16 
 17 
 18 
 19 //
 20 //    @Select("SELECT * FROM user")
 21 //    @Results({
 22 //        @Result(column = "create_time",property = "createTime")  //javaType = java.util.Date.class        
 23 //    })
 24 //    List<User> getAll();
 25 //  
 26 //    
 27 //
 28 //    @Select("SELECT * FROM user WHERE id = #{id}")
 29 //    @Results({
 30 //    	 @Result(column = "create_time",property = "createTime")
 31 //    })
 32 //    User findById(Long id);
 33 //
 34 //   
 35 //
 36 //    @Update("UPDATE user SET name=#{name} WHERE id =#{id}")
 37 //    void update(User user);
 38 //
 39 //    @Delete("DELETE FROM user WHERE id =#{userId}")
 40 //    void delete(Long userId);
 41 //
 42 }

UserService.java:

  1 package net.xdclass.base_project.service;
  2 
  3 import net.xdclass.base_project.domain.User;
  4 
  5 public interface UserService {
  6 
  7 	public int add(User user);
  8 
  9 
 10 
 11 	//public int addAccount();
 12 
 13 }
 14 

UserServiceImpl.java:

  1 package net.xdclass.base_project.service.impl;
  2 
  3 import java.util.Date;
  4 
  5 import net.xdclass.base_project.domain.User;
  6 import net.xdclass.base_project.mapper.UserMapper;
  7 import net.xdclass.base_project.service.UserService;
  8 
  9 import org.springframework.beans.factory.annotation.Autowired;
 10 import org.springframework.stereotype.Service;
 11 import org.springframework.transaction.annotation.Transactional;
 12 
 13 @Service
 14 public class UserServiceImpl implements UserService{
 15 
 16 	@Autowired
 17 	private UserMapper userMapper;
 18 
 19 	@Override
 20 	public int add(User user) {
 21 		userMapper.insert(user);
 22 		int id = user.getId();
 23 		return id;
 24 	}
 25 
 26 
 27 
 28 
 29 
 30 
 31 }
 32 

瀏覽器輸入:http://localhost:8080/api/v1/user/add

資料庫檢視:

image

新增成功

         相關資料:
         http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/#Configuration

        https://github.com/mybatis/spring-boot-starter/tree/master/mybatis-spring-boot-samples

        整合問題集合:
             https://my.oschina.net/hxflar1314520/blog/1800035
             https://blog.csdn.net/tingxuetage/article/details/80179772








3、SpringBoot2.x整合Mybatis3.x增刪改查實操和控制檯列印SQL語句
     講解:SpringBoot2.x整合Mybatis3.x增刪改查實操, 控制檯列印sql語句
    
     1、控制檯列印sql語句       
         #增加列印sql語句,一般用於本地開發測試
         mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

    2、增加mapper程式碼       
         @Select("SELECT * FROM user")
         @Results({
             @Result(column = "create_time",property = "createTime")  //javaType = java.util.Date.class       
         })
         List<User> getAll();
      
         @Select("SELECT * FROM user WHERE id = #{id}")
         @Results({
              @Result(column = "create_time",property = "createTime")
         })
         User findById(Long id);

        @Update("UPDATE user SET name=#{name} WHERE id =#{id}")
         void update(User user);

        @Delete("DELETE FROM user WHERE id =#{userId}")
         void delete(Long userId);
     
      3、增加API

        @GetMapping("find_all")
         public Object findAll(){
            return JsonData.buildSuccess(userMapper.getAll());
         }
        
         @GetMapping("find_by_Id")
         public Object findById(long id){
            return JsonData.buildSuccess(userMapper.findById(id));
         }
        
         @GetMapping("del_by_id")
         public Object delById(long id){
         userMapper.delete(id);
            return JsonData.buildSuccess();
         }
        
         @GetMapping("update")
         public Object update(String name,int id){
             User user = new User();
             user.setName(name);
             user.setId(id);
             userMapper.update(user);
             return JsonData.buildSuccess();
         }






4、事務介紹和常見的隔離級別,傳播行為
    
     簡介:講解什麼是資料庫事務,常見的隔離級別和傳播行為

    1、介紹什麼是事務,單機事務,分散式事務處理等

    2、講解場景的隔離級別
         Serializable: 最嚴格,序列處理,消耗資源大
         Repeatable Read:保證了一個事務不會修改已經由另一個事務讀取但未提交(回滾)的資料
         Read Committed:大多數主流資料庫的預設事務等級
         Read Uncommitted:保證了讀取過程中不會讀取到非法資料。


     3、講解常見的傳播行為
         PROPAGATION_REQUIRED--支援當前事務,如果當前沒有事務,就新建一個事務,最常見的選擇。

        PROPAGATION_SUPPORTS--支援當前事務,如果當前沒有事務,就以非事務方式執行。

        PROPAGATION_MANDATORY--支援當前事務,如果當前沒有事務,就丟擲異常。

        PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起, 兩個事務之間沒有關係,一個異常,一個提交,不會同時回滾

        PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

        PROPAGATION_NEVER--以非事務方式執行,如果當前存在事務,則丟擲異常





5、SpringBoot整合mybatis之事務處理實戰
     簡介:SpringBoot整合Mybatis之事務處理實戰
     1、service邏輯引入事務 @Transantional(propagation=Propagation.REQUIRED)

    2、service程式碼
         @Override
         @Transactional
         public int addAccount() {
             User user = new User();
             user.setAge(9);
             user.setCreateTime(new Date());
             user.setName("事務測試");
             user.setPhone("000121212");
            
             userMapper.insert(user);
             int a = 1/0;

            return user.getId();
         }