資料庫操作之整合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框架
比上一步簡單點
官網:
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
資料庫檢視:
新增成功
相關資料:
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();
}