• [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);
        }
    }
  • 相关阅读:
    node中__dirname、__filename、process.cwd()、process.chdir()表示的路径
    formidable模块的使用
    对象函数的readFileSyc类
    nodejs的事件驱动理解
    书籍类
    Cookie的弊端
    Codeforces 1015 E(模拟)
    Codeforces 1015D(贪心)
    牛客网暑期ACM多校训练营(第五场)I(树状数组)
    2018牛客暑假多校第五场 A(二分答案)
  • 原文地址:https://www.cnblogs.com/tengyunhao/p/8575463.html
Copyright © 2020-2023  润新知