[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>
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>
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); } }