引入依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
配置文件application.properties
# mybatis
mybatis.type-aliases-package=com.example.miaosha_xdp.entity
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.default-fetch-size=100
mybatis.configuration.default-statement-timeout=3000
mybatis.mapperLocations = classpath:mapper/*.xml
# 数据源
spring.datasource.url=jdbc:mysql://xdp:3306/miaosha?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
使用mybatis逆向生成工具
引入MyBatis Generator的maven插件
<build>
<plugins>
<!--mybatis自动生成代码插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<!-- 是否覆盖,true表示会替换生成的JAVA文件,false则不覆盖 -->
<overwrite>true</overwrite>
</configuration>
<dependencies>
<!--mysql驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
在resource目录下新建插件的配置文件generatorConfig.xml
<?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>
<!-- defaultModelType="flat" 设置复合主键时不单独为主键创建实体 -->
<context id="MySql" defaultModelType="flat">
<!-- 生成的POJO实现java.io.Serializable接口 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<!--注释-->
<commentGenerator>
<!-- 将数据库中表的字段描述信息添加到注释 -->
<property name="addRemarkComments" value="true"/>
<!-- 注释里不添加日期 -->
<property name="suppressDate" value="true"/>
</commentGenerator>
<!-- 数据库连接 -->
<jdbcConnection
driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://xdp:3306/miaosha"
userId="root"
password="123456"/>
<!-- 生成POJO对象,并将类放到com.songguoliang.springboot.entity包下 -->
<javaModelGenerator targetPackage="com.example.miaosha_xdp.entity" targetProject="src/main/java"></javaModelGenerator>
<!-- 生成mapper xml文件,并放到resources下的mapper文件夹下 -->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"></sqlMapGenerator>
<!-- 生成mapper xml对应dao接口,放到com.songguoliang.springboot.mapper包下-->
<javaClientGenerator targetPackage="com.example.miaosha_xdp.mapper" targetProject="src/main/java" type="XMLMAPPER"></javaClientGenerator>
<!-- table标签可以有多个,至少一个,tableName指定表名,可以使用_和%通配符 -->
<table tableName="miaosha_user">
<!-- 是否只生成POJO对象 -->
<property name="modelOnly" value="false"/>
<!-- 数据库中表名有时我们都会带个前缀,而实体又不想带前缀,这个配置可以把实体的前缀去掉 -->
<domainObjectRenamingRule searchString="^Miaosha" replaceString=""/>
</table>
</context>
</generatorConfiguration>
进行逆向生成
如下图点击maven插件中的mybatis-generator:generate,就为我们自动成了pojo类,映射类和映射的XML文件
mybtis逆向生成插件相关说明
创建实例的过程中有一个以Example结尾的类,这个类是专门用来对这个单表来查询的类,就相当于,对该单表的增删改查是脱离sql性质的,直接在service层就可以完成(当然这个sql是逆向已经生过的)
例如:
select id, username, birthday, sex, address from user WHERE ( username = ‘张三’ ) order by username asc
@Test
public void testFindUserByName(){
//通过criteria构造查询条件
UserExample userExample = new UserExample();
userExample.setOrderByClause("username asc"); //asc升序,desc降序排列
userExample.setDistinct(false); //去除重复,true是选择不重复记录,false反之
UserExample.Criteria criteria = userExample.createCriteria(); //构造自定义查询条件
criteria.andUsernameEqualTo("张三");
//自定义查询条件可能返回多条记录,使用List接收
List<User> users = userMapper.selectByExample(userExample);
System.out.println(users);
}
说明:
Mybatis逆向工程会生成实例及实例对应的example(用于添加条件,相当于where后的部分)
xxxExample example = new xxxExample();
Criteria criteria = example.createCriteria();
方法说明:
// 1.添加升序排列条件,DESC为降序
example.setOrderByClause("字段名ASC")
// 2.去除重复,boolean类型,true为选择不重复的记录
example.setDistinct(false)
// 3.添加字段xxx为null的条件
criteria.andXxxIsNull
// 4.添加字段xxx不为null的条件
criteria.andXxxIsNotNull
// 5.添加xxx字段等于value条件
criteria.andXxxEqualTo(value)
// 6.添加xxx字段不等于value条件
criteria.andXxxNotEqualTo(value)
// 7.添加xxx字段大于value条件
criteria.andXxxGreaterThan(value)
// 8.添加xxx字段大于等于value条件
criteria.andXxxGreaterThanOrEqualTo(value)
// 9.添加xxx字段小于value条件
criteria.andXxxLessThan(value)
// 10.添加xxx字段小于等于value条件
criteria.andXxxLessThanOrEqualTo(value)
// 11.添加xxx字段值在List
criteria.andXxxIn(List)
// 12.不添加xxx字段值在List
criteria.andXxxNotIn(List)
// 13.添加xxx字段值在之间
criteria.andXxxBetween(value1,value2)
// 14.添加xxx字段值不在之间
criteria.andXxxNotBetween(value1,value2)
测试结果
service层
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public void addUser(User user){
userMapper.insert(user);
}
}
contoller层
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/insert")
public String addUser(@RequestBody User user) {
userService.addUser(user);
return "success";
}
}
启动类配置扫包@MapperScan
package com.example.miaosha_xdp;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.miaosha_xdp.mapper")
public class MiaoshaXdpApplication {
public static void main(String[] args) {
SpringApplication.run(MiaoshaXdpApplication.class, args);
}
}
进行测试
在数据库中可以看到测试成功
测试事务
service层添加方法
public void addUserTansnational(){
User user1 = new User();
User user2 = new User();
user1.setId(88L);
user1.setNickname("kobe");
user2.setId(66L);
user2.setNickname("yaoming");
userMapper.insert(user1);
userMapper.insert(user2);
}
controlle层添加方法
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/insert")
public String addUser(@RequestBody User user) {
userService.addUser(user);
return "success";
}
@GetMapping("/Transactional")
public String Transactional() {
userService.addUserTansnational();
return "success";
}
}
测试
可以发现事务没有回滚
在service层方添加事务注解
@Service
@Transactional
public class UserService {
@Autowired
private UserMapper userMapper;
public Integer addUser(User user){
return userMapper.insert(user);
}
public void addUserTansnational(){
User user1 = new User();
User user2 = new User();
user1.setId(88L);
user1.setNickname("kobe");
user2.setId(66L);
user2.setNickname("yaoming");
userMapper.insert(user1);
userMapper.insert(user2);
}
}
再次测试可以看到回滚成功