摘要:更簡答的說就是要么全部執(zhí)行成功,要么撤銷不執(zhí)行。因此,數(shù)據(jù)庫操作的事務(wù)習(xí)慣上就稱為事務(wù)。實(shí)現(xiàn)原理單機(jī)事務(wù)事務(wù)是用對象控制的。接口提供了兩種事務(wù)模式自動(dòng)提交和手工提交。事務(wù)多機(jī)事務(wù),通過實(shí)現(xiàn),需要驅(qū)動(dòng)支持。局限于應(yīng)用使用。
Spring Boot - 數(shù)據(jù)庫配置 回顧
Spring Boot - 初識 Hello World
Spring Boot - Servlet、過濾器、監(jiān)聽器、攔截器
Spring Boot - 靜態(tài)資源處理、啟動(dòng)加載、日志處理
整合JdbcTemplatepom.xml配置maven依賴
application.properties配置數(shù)據(jù)源
org.springframework.boot spring-boot-starter-jdbc mysql mysql-connector-java
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實(shí)踐:查詢用戶表
創(chuàng)建表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;
創(chuàng)建用戶實(shí)體
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 }
創(chuàng)建UserService并注入JdbcTemplate,實(shí)現(xiàn)查詢?法
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 ListgetUserList() { return jdbcTemplate.query("select * from user", new RowMapper () { @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; } }); } }
增加Controller,并返回結(jié)果
代碼片段如下,關(guān)于如何實(shí)現(xiàn)web接口,請參考Spring Boot - 初識 Hello World
@Autowired private UserService userService; @RequestMapping("/userlist") public List整合MyBatisgetUserList() { return userService.getUserList(); }
pom.xml配置maven依賴
application.properties配置mybatis
org.mybatis.spring.boot mybatis-spring-boot-starter 1.2.0
#關(guān)于mapper文件位置和entity類位置,大家需要按自己需要進(jìn)行修改 mybatis.mapper-locations=classpath*:mapper/*Mapper.xml mybatis.type-aliases-package=com.wanye.entity實(shí)踐:通過用戶id查詢指定用戶信息
創(chuàng)建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); }
創(chuàng)建mapper.xml
實(shí)現(xiàn)查詢?法,在userservice類中增加
@Autowired private UserMapper userMapper; public User getUserById(int id) { return userMapper.getUserById(id); }
在controller中返回Json結(jié)果,省略
事務(wù) 事務(wù)概念及原理定義:從數(shù)據(jù)庫角度說,就是一組SQL指令,要么全部執(zhí)行成功,若因?yàn)槟硞€(gè)原因其中一條指令執(zhí)行有錯(cuò)誤,則撤銷先前執(zhí)行過的所有指令。更簡答的說就是:要么全部執(zhí)行成功,要么撤銷不執(zhí)行。
java事務(wù):既然事務(wù)的概念從數(shù)據(jù)庫而來,那Java事務(wù)是什么?之間有什么聯(lián)系?實(shí)際上,一個(gè)Java應(yīng)用系統(tǒng),如果要操作數(shù)據(jù)庫,則通過JDBC來實(shí)現(xiàn)的。增加、修改、刪除都是通過相應(yīng)方法間接來實(shí)現(xiàn)的,事務(wù)的控制也相應(yīng)轉(zhuǎn)移到Java程序代碼中。因此,數(shù)據(jù)庫操作的事務(wù)習(xí)慣上就稱為Java事務(wù)。
實(shí)現(xiàn)原理(單機(jī)事務(wù)):JDBC 事務(wù)是用 Connection 對象控制的。JDBC Connection 接口( java.sql.Connection )提供了兩種事務(wù)模式:自動(dòng)提交和手工提交。 java.sql.Connection 提供了以下控制事務(wù)的方法:
public void setAutoCommit(boolean) public boolean getAutoCommit() public void commit() public void rollback()
使用 JDBC 事務(wù)時(shí),您可以將多個(gè) SQL 語句結(jié)合到一個(gè)事務(wù)中。JDBC 事務(wù)的一個(gè)缺點(diǎn)是事務(wù)的范圍局限于一個(gè)數(shù)據(jù)庫連接。一個(gè) JDBC 事務(wù)不能跨越多個(gè)數(shù)據(jù)庫。
JTA(Java Transaction API)事務(wù)(多機(jī)事務(wù)),通過xa實(shí)現(xiàn),需要驅(qū)動(dòng)支持。事務(wù)可以跨越多個(gè)數(shù)據(jù)庫或多個(gè)DAO,坑比較多,使用也比較復(fù)雜。
容器事務(wù),由j2ee容器提供,基本上是基于JTA來實(shí)現(xiàn)。局限于EJB應(yīng)用使用。
如何配置事務(wù)使用注解 @EnableTransactionManagement 開啟事務(wù)支持,建議在啟動(dòng)類上增加,例如
@EnableTransactionManagement @SpringBootApplication public class Start { public static void main(String[] args) { SpringApplication.run(Start.class, args); } }
在訪問數(shù)據(jù)庫的Service方法上添加注解 @Transactional 便可
實(shí)踐:實(shí)現(xiàn)拷貝用戶信息,并將原用戶的name修改為xiaomingCase1:正常(新增1條記錄name=xiaohong,更新1條記錄name=xiaoming)
Case2:異常(name長度超出varchar(8))導(dǎo)致回滾
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("復(fù)制成功: 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 ListcpUser(@PathVariable("id") long id, @PathVariable("name") String name) { userService.copyUser(id, name); return userList(); }
大家自行驗(yàn)證一下,如果{name}長度超過8個(gè)字節(jié),會(huì)導(dǎo)致復(fù)制成功的數(shù)據(jù)回滾。另外,mysql數(shù)據(jù)庫引擎需要使用InnoDB,并不是所有的引擎都支持事務(wù),大家可以查詢數(shù)據(jù)庫引擎相關(guān)資料。
總結(jié)本文講解Spring Boot整合JdbcTemplate、整合mybatis,介紹并重點(diǎn)講解了事務(wù)處理和配置
本文未提及關(guān)于分?查詢和數(shù)據(jù)庫連接池,我認(rèn)為分頁查詢的重點(diǎn)是分頁算法如何封裝,并不是Spring Boot關(guān)注的重點(diǎn),大家可以自己實(shí)現(xiàn),
另外現(xiàn)在常用的數(shù)據(jù)庫連接池有c3p0/dbcp/tomcat-jdbc/HikariCP
順便提一下,在Spring Boot中更改數(shù)據(jù)源,只需要在application.properties配置文件中增加spring.datasource.type配置即可,例如:
spring.datasource.type=com.zaxxer.hikari.HikariDataSource最后
如果覺得我的文章對您有用,請點(diǎn)贊、收藏。您的支持將鼓勵(lì)我繼續(xù)創(chuàng)作!為了提高大家學(xué)習(xí)效果,錄制了同步的視頻課程,還望大家支持視頻課程
優(yōu)惠報(bào)名 【全程擼碼】Spring Boot 1.5 快速入門教程(全)(原價(jià):Spring Boot - 部署Deploy
Spring Boot - 整合jsp后必須通過spring-boot:run方式啟動(dòng)?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71135.html
摘要:開公眾號差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來越多時(shí),大家搜索起來就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章系列處理登錄請求前后端分離一使用完美處理權(quán)限問題前后端分離二使用完美處理權(quán)限問題前后端分離三中密碼加鹽與中異常統(tǒng)一處理 開公眾號差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來越多時(shí),大家搜索起來就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章! Spring Boo...
摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...
摘要:引入了新的環(huán)境和概要信息,是一種更揭秘與實(shí)戰(zhàn)六消息隊(duì)列篇掘金本文,講解如何集成,實(shí)現(xiàn)消息隊(duì)列。博客地址揭秘與實(shí)戰(zhàn)二數(shù)據(jù)緩存篇掘金本文,講解如何集成,實(shí)現(xiàn)緩存。 Spring Boot 揭秘與實(shí)戰(zhàn)(九) 應(yīng)用監(jiān)控篇 - HTTP 健康監(jiān)控 - 掘金Health 信息是從 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...
摘要:作為微服務(wù)的基礎(chǔ)設(shè)施之一,背靠強(qiáng)大的生態(tài)社區(qū),支撐技術(shù)體系。微服務(wù)實(shí)踐為系列講座,專題直播節(jié),時(shí)長高達(dá)小時(shí),包括目前最流行技術(shù),深入源碼分析,授人以漁的方式,幫助初學(xué)者深入淺出地掌握,為高階從業(yè)人員拋磚引玉。 簡介 目前業(yè)界最流行的微服務(wù)架構(gòu)正在或者已被各種規(guī)模的互聯(lián)網(wǎng)公司廣泛接受和認(rèn)可,業(yè)已成為互聯(lián)網(wǎng)開發(fā)人員必備技術(shù)。無論是互聯(lián)網(wǎng)、云計(jì)算還是大數(shù)據(jù),Java平臺已成為全棧的生態(tài)體系,...
閱讀 1885·2021-09-24 09:48
閱讀 3232·2021-08-26 14:14
閱讀 1686·2021-08-20 09:36
閱讀 1475·2019-08-30 15:55
閱讀 3635·2019-08-26 17:15
閱讀 1433·2019-08-26 12:09
閱讀 614·2019-08-26 11:59
閱讀 3331·2019-08-26 11:57