[Spring] 學習Spring Boot之二:整合MyBatis並使用@Trasactional管理事務


一、配置及准備工作

1、在 Maven 的 pom 文件中新增以下依賴:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>runtime</version>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.0</version>
</dependency>

2、在 application.properties 中配置 mysql 的鏈接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/demo
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

3、在數據庫中創建 user_info 表:

CREATE TABLE user_info
(
  account  VARCHAR(20) NOT NULL PRIMARY KEY,
  nickname VARCHAR(20) NULL,
  phone    CHAR(11)    NULL,
  password CHAR(32)    NOT NULL,
  email    VARCHAR(50) NULL
) ENGINE = InnoDB DEFAULT CHARSET=utf8;

 

二、使用 mybatis generator 自動生成代碼

1、在 Maven 的 pom 文件中添加如下插件:

<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.2</version>
    <configuration>
    <configurationFile>${basedir}/src/main/resources/mybatis-generator.xml</configurationFile> <overwrite>true</overwrite> <verbose>true</verbose> </configuration> </plugin>

2、將如下 mybatis-generator.xml 配置文件放入到 src/main/resources 目錄下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!-- 數據庫驅動:選擇你的本地硬盤上面的數據庫驅動包-->
    <classPathEntry  location="/Users/tengyunhao/.m2/repository/mysql/mysql-connector-java/5.1.21/mysql-connector-java-5.1.21.jar"/>
    <context id="DB2Tables"  targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressDate" value="false"/>
            <!-- 是否去除自動生成的注釋 true:是 : false:否 -->
            <property name="suppressAllComments" value="false"/>
        </commentGenerator>
        <!--數據庫鏈接URL,用戶名、密碼 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost/demo" userId="root" password="123456">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!-- 生成模型的包名和位置-->
        <javaModelGenerator targetPackage="com.tengyunhao.demo.entity" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- 生成映射文件的包名和位置-->
        <sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.tengyunhao.demo.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- 要生成的表 tableName是數據庫中的表名或視圖名 domainObjectName是實體類名-->
        <table tableName="user_info" domainObjectName="UserInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
    </context>
</generatorConfiguration>
mybatis-generator.xml

3、添加運行配置

點擊 run -> Edit Configurations

點擊 + 號,添加一個 Maven 的配置

4、運行

運行后我們就可以在相應的目錄下看到生成的代碼了,如圖:

 

三、基本使用

1、編寫 Service 接口及 Service 實現類:

public interface UserService {
    int addUser(UserInfo userInfo);
    UserInfo getUserByAccount(String account);
}
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Override
    public int addUser(UserInfo userInfo) {
        return userInfoMapper.insert(userInfo);
    }
    @Override
    public UserInfo getUserByAccount(String account) {
        return userInfoMapper.selectByPrimaryKey(account);
    }
}

2、編寫 Controller 類:

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @RequestMapping(value = "account", method = RequestMethod.POST)
    public int addUser(String account, String password, String nickname) {
        UserInfo userInfo = new UserInfo();
        userInfo.setAccount(account);
        userInfo.setPassword(password);
        userInfo.setNickname(nickname);
        return userService.addUser(userInfo);
    }
    @RequestMapping(value = "account", method = RequestMethod.GET)
    public UserInfo getUserByAccount(String account) {
        return userService.getUserByAccount(account);
    }
}

給 UserMapper 加上 @Mapper 注解(我這不加注解會報錯)

3、配置 mybastis

首先在 application.properties 中新增如下配置:

mybatis.mapper-locations=classpath:mapping/*.xml
mybatis.config-location=classpath:mybatis-config.xml

然后將 mybatis-config.xml 配置文件放到 src/main/resources 目錄下:

<?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>
    <typeAliases>
    </typeAliases>
</configuration>
mybatis-config.xml

4、運行項目進行測試

這時我們就可以啟動項目了。

另外 IDEA 提供了進行接口測試的工具,打開方式為 Tools -> Test RESTful Web Service,如下圖所示:

 

四、添加事務

我們只需要在 Service 實現類中的方法上加入 @Trasactional 注解,默認當拋出異常的時候就會觸發事務的回滾,從源碼角度來看一下如何使用其參數:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {

    /** 指定事務管理器 */
    @AliasFor("transactionManager")
    String value() default "";

    /** 指定事務的限定符 */
    @AliasFor("value")
    String transactionManager() default "";

    /** 事務傳播行為,默認為支持當前事務,當前沒有事務則創建一個 */
    Propagation propagation() default Propagation.REQUIRED;

    /** 事務隔離級別,默認按數據庫默認隔離級別 */
    Isolation isolation() default Isolation.DEFAULT;

    /** 事務超時時間 */
    int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;

    /** 讀寫或只讀事務,默認讀寫事務 */
    boolean readOnly() default false;

    /** 觸發事務回滾的異常類 */
    Class<? extends Throwable>[] rollbackFor() default {};

    /** 同上 */
    String[] rollbackForClassName() default {};

    /** 不會導致事務回滾的異常類 */
    Class<? extends Throwable>[] noRollbackFor() default {};

    /** 同上 */
    String[] noRollbackForClassName() default {};

}

在 Service 實現類加入 @Trasactional 注解后,還需要在入口類添加 @EnableTransactionManagement 注解,來開啟事務:

@EnableTransactionManagement
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM