需要导入的依赖,mybatis有2.0.0的依赖了,但是考虑到只有2.0.0,可能不稳的就先用2018年的最后一个版本1.3.2。注意这里指的是spring boot整合的mybatis版本,而不是单纯的mybatis版本。
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- mysql依赖,版本要选择和你数据库对应的! -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
</dependency>
然后在application.properties中添加数据库的配置信息:
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.moonlight.poolMaximumActiveConnections=400
spring.datasource.moonlight.poolMaximumIdleConnections=200
spring.datasource.moonlight.poolMaximumCheckoutTime=20000
在每一个mapper接口上写@mapper注解很麻烦,不如直接在spring boot的启动入口类上使用@MapperScan注解:指定要扫描的Mapper类的包的路径,统一将mapper接口注册为spring中的java bean,多个包用逗号隔开。例如:
@SpringBootApplication
@MapperScan(basePackages = "com.blacktv.springboot.database.mapper")//将指定包内自动注册为mapper接口
public class SpringbootHelloApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootHelloApplication.class, args);
}
}
其实Spring Boot整合MyBatis,比单独用MyBatis要简单的多的多,下面就用这个student表来做一个增删改查的案例
POJO类,就一个lombok的注解,属性名一定要和字段名一样。
/**
* student表的pojo类,Spring Boot整合MyBatis案例
*/
@Data
public class Student {
private Integer id;
private String name;
public Student() {
}
public Student(String name) {
this.name = name;
}
}
Mapper接口,用注解编写SQL语句,这里很重要
/**
* Student类的mapper接口
*/
public interface StudentMapper {
/**
* 添加学生
*
* @param student
* @return
*/
@Insert("INSERT INTO student(`name`) VALUES(#{student.name})")
public int add(@Param("student") Student student);
/**
* 根据id删除学生
* @param id
* @return
*/
@Delete("DELETE FROM student WHERE `id` = #{id}")
public int deleteById(@Param("id") int id);
/**
* 根据id修改学生名称
* @param student
* @return
*/
@Update("UPDATE student SET `name` = #{student.name} WHERE `id` = #{student.id}")
public int update(@Param("student") Student student);
/**
* 查询全部学生
*/
@Select("SELECT * FROM student")
public List<Student> getStudentList();
/**
* 根据id查询学生
*
* @param id
* @return
*/
@Select("select * from student where `id` = #{id}")
public Student getStudentById(@Param("id") int id);
}
Server,这个没啥可说的,就是封装一层,给以后加事务用
/**
* Student类的业务逻辑类
*/
@Service
public class StudentService {
@Autowired
private StudentMapper studentMapper;//在启动入口类用@MapperScan注解扫描mapper接口,idea可能会在这里报错,不用担心只是误报
/**
* 新增student,成功返回true
*
* @param student
* @return
*/
public boolean add(Student student) {
return studentMapper.add(student) > 0;
}
/**
* 根据id删除学生
*
* @param id
* @return
*/
public boolean deleteById(int id) {
return studentMapper.deleteById(id) > 0;
}
/**
* 根据id修改学生名称
*
* @param student
* @return
*/
public boolean update(Student student) {
return studentMapper.update(student) > 0;
}
/**
* 根据id查询student
*
* @param id
* @return
*/
public Student getStudentById(int id) {
return studentMapper.getStudentById(id);
}
/**
* 获取学生列表
*
* @return
*/
public List<Student> getStudentList() {
return studentMapper.getStudentList();
}
}
控制器
/**
* 整合mybatis案例
*/
@RestController
public class TestA {
@Autowired
private StudentService studentService;
/**
* 增
*
* @param name
* @return
*/
@GetMapping(value = "/add")
public String add(String name) {
return studentService.add(new Student(name)) ? "添加成功" : "添加失败";
}
/**
* 根据id删除学生
*
* @param id
* @return
*/
@GetMapping(value = "/delete")
public String delete(int id) {
return studentService.deleteById(id) ? "删除成功" : "删除失败";
}
@GetMapping(value = "/update")
public String update(Student student) {
return studentService.update(student) ? "修改成功" : "修改失败";
}
/**
* 查,如果输入id=0,则查询学生列表
*
* @return
*/
@GetMapping(value = "/get")
public String get(int id) {
if (id == 0)
return JSONArray.toJSONString(studentService.getStudentList());
return JSONArray.toJSONString(studentService.getStudentById(id));
}
}
添加接口:
查询接口,查询全部(这里写的逻辑是id=0则查询全部)
查询接口,根据id查询
修改接口,可以看到修改成功了
删除接口,可以看到删除成功了(如果删除成功后,在查询接口里还是能查询到要么是因为事务,要么是缓存)