1. Spring6 對 集成MyBatis 開發運用(附有詳細的操作步驟) @目錄1. Spring6 對 集成MyBatis 開發運用(附有詳細的操作步驟)每博一文案2. 大概的實現步驟概述3. 詳細實現操作步驟4. Spring配置文件的 import,導入外部xml 配置5. 總結:6. 最 ...
1. Spring6 對 集成MyBatis 開發運用(附有詳細的操作步驟)
@
目錄- 1. Spring6 對 集成MyBatis 開發運用(附有詳細的操作步驟)
- 每博一文案
- 2. 大概的實現步驟概述
- 3. 詳細實現操作步驟
- 4. Spring配置文件的 import,導入外部xml 配置
- 5. 總結:
- 6. 最後:
每博一文案
理想主義的花
終將盛開在浪漫主義的土壤里
我的熱情
永遠不會熄滅在現實主義的平凡里
我們終將上岸,陽光萬里
2. 大概的實現步驟概述
- 第一步:準備資料庫表
-
使用t_act表(賬戶表)
- 第二步:IDEA中創建一個模塊,並引入依賴
-
-
- spring-context
-
- spring-jdbc
-
- mysql驅動
-
- mybatis
-
- mybatis-spring:mybatis提供的與spring框架集成的依賴
-
- 德魯伊連接池
-
- junit
-
- 第三步:基於三層架構實現,所以提前創建好所有的包
-
-
- com.powernode.bank.mapper
-
- com.powernode.bank.service
-
- com.powernode.bank.service.impl
-
- com.powernode.bank.pojo
-
- 第四步:編寫pojo
-
Account,屬性私有化,提供公開的setter getter和toString。
- 第五步:編寫mapper介面
-
AccountMapper介面,定義方法
- 第六步:編寫mapper配置文件
-
在配置文件中配置命名空間,以及每一個方法對應的sql。
- 第七步:編寫service介面和service介面實現類
-
-
- AccountService
-
- AccountServiceImpl
-
- 第八步:編寫jdbc.properties配置文件
-
資料庫連接池相關信息
- 第九步:編寫mybatis-config.xml配置文件
-
-
- 該文件可以沒有,大部分的配置可以轉移到spring配置文件中。
-
- 如果遇到mybatis相關的系統級配置,還是需要這個文件。
-
- 第十步:編寫spring.xml配置文件
-
-
- 組件掃描
-
- 引入外部的屬性文件
-
- 數據源
-
- SqlSessionFactoryBean配置
-
-
- 註入mybatis核心配置文件路徑
-
-
-
- 指定別名包
-
-
-
- 註入數據源
-
-
- Mapper掃描配置器
-
-
- 指定掃描的包
-
-
- 事務管理器DataSourceTransactionManager
-
-
- 註入數據源
-
-
- 啟用事務註解
-
-
- 註入事務管理器
-
-
- 第十一步:編寫測試程式,並添加事務,進行測試
3. 詳細實現操作步驟
具體實現內容:我們運用 Spring6 和 MyBatis 實現一個轉賬操作(該轉賬操作,進行一個事務上的控制,運用 MyBatis 執行 SQL 語句)。
- 第一步:準備資料庫表
-
使用t_act表(賬戶表)
連接資料庫的工具有很多,這裡我們可以使用IDEA工具自帶的 DataBase 插件。可以根據下圖提示自行配置:
一般是在 IDEA 的左邊,DataBase
如下是 t_act 的表結構
如下是 t_act 的表數據內容:
- 第二步:IDEA中創建一個模塊,並引入依賴
-
-
- spring-context
-
- spring-jdbc
-
- mysql驅動
-
- mybatis
-
- mybatis-spring:mybatis提供的與spring框架集成的依賴
-
- 德魯伊連接池
-
- junit
-
我們先在pom.xml
配置文件當中導入相關的 jar
包信息:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.rainbowsea</groupId>
<artifactId>spring6-016-mybaits</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<!--倉庫-->
<repositories>
<!--spring里程碑版本的倉庫-->
<repository>
<id>repository.spring.milestone</id>
<name>Spring Milestone Repository</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.0-M2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>6.0.0-M2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.13</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- 第三步:基於三層架構實現,所以提前創建好所有的包
-
-
- com.powernode.bank.mapper
-
- com.powernode.bank.service
-
- com.powernode.bank.service.impl
-
- com.powernode.bank.pojo
-
- 第四步:編寫pojo
-
Account,屬性私有化,提供公開的setter getter和toString。
- 第五步:編寫mapper介面
-
AccountMapper介面,定義方法
package com.rainbowsea.bank.mapper;
import com.rainbowsea.bank.pojo.Account;
import java.util.List;
// 該介面的實現類不需要寫,是mybatis通過動態代理機制生成的實現類
public interface AccountMapper {
// 這就是DAO,只要編寫CRUD方法即可
/**
* 新增賬戶
* @param account
* @return
*/
int insert(Account account);
/**
* 根據賬戶刪除賬戶
* @param actno
* @return
*/
int deleteByActno(String actno);
/**
* 根據賬戶更新
* @param account
* @return
*/
int update(Account account);
/**
* 根據賬戶查詢賬戶
* @param actno
* @return
*/
Account selectByActno(String actno);
/**
* 查詢所有的賬戶
* @return
*/
List<Account> selectAll();
}
- 第六步:編寫mapper配置文件
-
在配置文件中配置命名空間,以及每一個方法對應的sql。
一定要註意,按照下圖提示創建這個目錄。註意是 斜杠(因為是創建目錄) 不是點兒。在resources目錄下新建。並且要和Mapper介面包對應上。因為只有這樣,MyBatis 才會進行動態代理這個介面。
同時:如果介面叫做AccountMapper,配置文件必須是 AccountMapper.xml,名稱要保持一致。
總結兩點:就是路徑位置要保持一致,對應的名稱也要保持一致。尾碼名不同。
同時在 AccountMapper.xml
當中編寫 SQL 語句內容。
<?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">
<mapper namespace="com.rainbowsea.bank.mapper.AccountMapper">
<insert id="insert">
insert into t_act(actno,balance) values(#{actno}, #{balance})
</insert>
<delete id="deleteByActno">
delete from t_act where actno = #{actno}
</delete>
<update id="update">
update t_act set balance = #{balance} where actno = #{actno}
</update>
<select id="selectByActno" resultType="Account">
select * from t_act where actno = #{actno}
</select>
<select id="selectAll" resultType="Account">
select * from t_act
</select>
</mapper>
- 第七步:編寫service介面和service介面實現類
-
-
- AccountService
-
- AccountServiceImpl
-
編寫 AccountService 業務介面,定義約束,規範,進行一個業務上的轉賬操作。
package com.rainbowsea.bank.service;
import com.rainbowsea.bank.pojo.Account;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
public interface AccountService {
/**
* 開戶
* @param account
* @return
*/
int save(Account account);
/**
* 根據賬號銷戶
* @param actno
* @return
*/
int deleteByActno(String actno);
/**
* 修改賬戶
* @param act
* @return
*/
int update(Account act);
/**
* 根據賬號獲取賬戶
* @param actno
* @return
*/
Account getByActno(String actno);
/**
* 獲取所有賬戶
* @return
*/
List<Account> getAll();
/**
* 轉賬
* @param fromActno
* @param toActno
* @param money
*/
void transfer(String fromActno, String toActno, double money);
}
註意:要將編寫的service實現類納入IoC容器管理,同時註意需要開啟事務@Transactional
package com.rainbowsea.bank.service.impl;
import com.rainbowsea.bank.mapper.AccountMapper;
import com.rainbowsea.bank.pojo.Account;
import com.rainbowsea.bank.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service(value = "accountServiceImpl")
@Transactional // 放在類中,下麵的類中的所有方法都開啟了事務
public class AccountServiceImpl implements AccountService {
// Could not find bean with name 'org.mybatis.spring.SqlSessionFactoryBean#0
@Autowired // 非簡單類型自動裝配
private AccountMapper accountMapper;
@Override
public int save(Account account) {
return accountMapper.insert(account);
}
@Override
public int deleteByActno(String actno) {
return accountMapper.deleteByActno(actno);
}
@Override
public int update(Account act) {
return accountMapper.update(act);
}
@Override
public Account getByActno(String actno) {
return accountMapper.selectByActno(actno);
}
@Override
public List<Account> getAll() {
return accountMapper.selectAll();
}
@Override
public void transfer(String fromActno, String toActno, double money) {
Account fromAct = accountMapper.selectByActno(fromActno);
if(fromAct.getBalance() < money) {
throw new RuntimeException("餘額不足");
}
Account toAct = accountMapper.selectByActno(toActno);
//模擬異常
/* String s = null;
s.toString();
*/
// 記憶體上修改
fromAct.setBalance(fromAct.getBalance() - money);
toAct.setBalance(toAct.getBalance() + money);
// 資料庫上修改數據內容
int count = accountMapper.update(fromAct);
count += accountMapper.update(toAct);
if(count != 2) {
throw new RuntimeException("轉賬失敗");
}
}
}
- 第八步:在 resources 的根路徑下,編寫jdbc.properties配置文件
-
資料庫連接池相關信息,賬號,密碼,同時註意要加上
jdbc
, 同時註意不要加任何的空格,同時是 放在類的根路徑(resources )下
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring6
jdbc.username=root
jdbc.password=MySQL123
- 第九步:編寫mybatis-config.xml配置文件
-
-
- 該文件可以沒有,大部分的配置可以轉移到spring配置文件中。
-
- 如果遇到mybatis相關的系統級配置,還是需要這個文件。
- 放在類的根路徑(resources )下,只開啟日誌,其他配置到spring.xml中。
-
)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 幫助我們列印mybatis的日誌信息。sql語句等-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
</configuration>
- 第十步:編寫spring.xml配置文件
-
-
- 組件掃描
-
- 引入外部的屬性文件
-
- 數據源
-
- SqlSessionFactoryBean配置
-
-
- 註入mybatis核心配置文件路徑
-
-
-
- 指定別名包
-
-
-
- 註入數據源
-
-
- Mapper掃描配置器
-
-
- 指定掃描的包
-
-
- 事務管理器DataSourceTransactionManager
-
-
- 註入數據源
-
-
- 啟用事務註解
-
-
- 註入事務管理器
-
同樣,我們還是將其防止到 類的根路徑下(resources )
-
-
註意:當你在spring.xml文件中直接寫標簽內容時,IDEA會自動給你添加命名空間
<?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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 組件掃描,-->
<context:component-scan base-package="com.rainbowsea.bank"></context:component-scan>
<!-- 引入外部的屬性配置文件-->
<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
<!-- 數據源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 配置SqlSessionFactoryBean "org.mybatis.spring.SqlSessionFactoryBean"-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 註入數據源-->
<property name="dataSource" ref="dataSource"></property>
<!-- 指定mybatis 核心配置文件-->
<property name="configLocation" value="mybatis-config.xml"></property>
<!-- 指定別名-->
<property name="typeAliasesPackage" value="com.rainbowsea.bank.pojo"></property>
</bean>
<!-- Mapper 掃描配置器,主要掃描Mapper 介面,生成代理類-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.rainbowsea.bank.mapper"></property>
</bean>
<!-- 事務管理器-->
<bean id="txManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 配置數據源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 啟用事務註解,事務管理器-->
<tx:annotation-driven transaction-manager="txManger"></tx:annotation-driven>
</beans>
- 第十一步:編寫測試程式,並添加事務,進行測試
)
package com.rainbowsea.spring6.test;
import com.rainbowsea.bank.service.AccountService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringMybatisTest {
@Test
public void testSpringMybatis() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
// AccountService.class 左右兩邊保持一致性
AccountService accountService = applicationContext.getBean("accountServiceImpl", AccountService.class);
try {
accountService.transfer("act-001","act-002",10000);
System.out.println("轉賬成功");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
沒有異常,看是否能轉賬成功
模擬異常,看是否,能夠進行正常的事務回滾
運行測試:
4. Spring配置文件的 import,導入外部xml 配置
如果 spring 配置文件有多個,可以在 spring 的核心配置文件中使用 import
進行引入,我們可以將組件掃描單獨定義到一個配置文件中,如下:我們將一個《組件掃描》,定義到一個單獨的名為common.xml
的配置文件當中去,並導入,引入到 spring 的配置文件當中使用。如下:
使用<import>
標簽進行一個導入
<!-- 在Spring 的核心配置文件中引入其他的子 spring 配置文件-->
<import resource="common.xml"></import>
把模擬異常去了,測試,是否能夠轉賬成功。如下:
註意:在實際開發中,service 單獨配置到一個文件中,dao單獨配置到一個文件中,然後在核心配置文件中引入,養成好習慣。
5. 總結:
Spring6 對集成MyBatis 開發:這裡總的來說是十步,完成的。
一定要註意,按照下圖提示創建這個目錄。註意是 斜杠(因為是創建目錄) 不是點兒。在resources目錄下新建。並且要和Mapper介面包對應上。因為只有這樣,MyBatis 才會進行動態代理這個介面。
同時:如果介面叫做AccountMapper,配置文件必須是 AccountMapper.xml,名稱要保持一致。
總結兩點:就是路徑位置要保持一致,對應的名稱也要保持一致。尾碼名不同。
Spring 當中使用
<import>
標簽導入外部xml 配置。
6. 最後:
“在這個最後的篇章中,我要表達我對每一位讀者的感激之情。你們的關註和回覆是我創作的動力源泉,我從你們身上吸取了無盡的靈感與勇氣。我會將你們的鼓勵留在心底,繼續在其他的領域奮鬥。感謝你們,我們總會在某個時刻再次相遇。”