现在依然非常流行的数据持久层框架,通过与 springboot 的整合,几乎不用做任何配置即可使用,直接操作数据库。
springboot 中可以通过注解方式也可以通过配置方式使用 MyBatis,当然,也可以混合使用两种方式。
准备工作
数据源配置延用了上一篇的配置
加入相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
先确保建了数据表,同时有了相对应的实体类
本例使用如下数据表和实体类
CREATE TABLE `students` (
`sid` int NOT NULL,
`sname` varchar(20)
);
CREATE TABLE `departments` (
`deptid` int NOT NULL,
`deptname` varchar(20)
);
public class Student {
private Integer sid;
private String sname;
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
}
public class Department {
private Integer deptid;
private String deptname;
public Integer getDeptid() {
return deptid;
}
public void setDeptid(Integer deptid) {
this.deptid = deptid;
}
public String getDeptname() {
return deptname;
}
public void setDeptname(String deptname) {
this.deptname = deptname;
}
}
注解方式
注解方式:就是创建一个 Mapper 接口,直接在接口的方法上加入注解,并且把该方法执行的 sql 直接写在注解中。记得在 Mapper 接口类上标注 @Mapper ,或者在启动类标注 @MapperScan(value=“com.xiao.mapper”),指明扫描哪个包,value 可以是一个 String 数组。在启动类标注后就不用在每个 Mapper 接口类标注 @Mapper 了
@Mapper
public interface StudentMapper {
// @Options(useGeneratedKeys=true,keyProperty="sid") // 此注解表明这个表使用了自增主键,插入记录后主键会封装到这个对象中
@Insert("insert into students values(#{sid},#{sname})")
public int insertStu(Student stu);
@Delete("delete from students where sid = #{sid}")
public int deleteStuById(Integer sid);
@Update("update students set sname = #{sname} where sid = #{sid}")
public int updateStuById(Student stu);
@Select("select * from students where sid = #{sid}")
public Student getStuById(Integer sid);
}
写好接口类后,不用写实现类,就可以直接注入使用了,下面直接在 Controller 中调用 crud 方法
@RestController
public class StudentsController {
@Autowired
StudentMapper stuMapper;
@GetMapping("/stu")
public Student insertStu(Student stu) {
stuMapper.insertStu(stu);
return stu;
}
@GetMapping("/stu/{id}")
public Student getStuById(@PathVariable("id")Integer sid) {
return stuMapper.getStuById(sid);
}
}
启动项目,发送请求,查看结果
当数据库的列名有下划线时,需要开启驼峰命名才能正确装配属性,我们可以自定义 MyBatis 的配置规则,给容器中添加一个 ConfigurationCustomizer
@org.springframework.context.annotation.Configuration
public class MybatisConfig {
@Bean
public ConfigurationCustomizer mybatisCustomizer() {
return new ConfigurationCustomizer() {
@Override
public void customize(Configuration configuration) {
// 开启驼峰命名
configuration.setMapUnderscoreToCamelCase(true);
}
};
}
}
配置方式
配置方式:就是写相应的 mapper.xml 映射文件,在 xml 文件中书写 sql ,id 对应 Mapper 接口中的方法名
在静态资源目录下创建 mybatis 文件夹,存放有关 mybatis 的配置文件。创建一个 mybatis 的全局配置文件 mybatis-config.xml,空的就行,只要头
<?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>
</configuration>
创建 Mapper 接口,这次没有在这里加@Mapper注解,直接在启动类中加 @MapperScan 注解
public interface DeptMapper {
public void insertDept(Department dept);
public Department getDeptById(Integer deptid);
}
写 Mapper 映射文件 departmentMapper.xml,我放在资源目录 mybatis 的 mapper 文件夹下。namespace 绑定对应的 Mapper 接口
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiao.mapper.DeptMapper">
<select id="getDeptById" resultType="com.xiao.entities.Department">
select * from departments where deptid = #{deptid}
</select>
<insert id="insertDept">
insert into departments values(#{deptid},#{deptname})
</insert>
</mapper>
在 application.properties 配置文件中指定资源文件的位置
# mybatis 全局配置/主配置文件
mybatis.config-location=classpath:mybatis/mybatis-config.xml
# mybatis mapper映射文件
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
controller 中调用方法
@RestController
public class DeptController {
@Autowired
DeptMapper deptMapper;
@GetMapping("/dept")
public Department insertDept(Department dept) {
deptMapper.insertDept(dept);
return dept;
}
@GetMapping("/dept/{id}")
public Department getDeptById(@PathVariable("id") Integer id) {
return deptMapper.getDeptById(id);
}
}
启动项目,记得在启动类 @MapperScan 注解
配置方式开启驼峰命名,在 mybatis 的主配置文件中加入一个设置
<?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>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>
注解方式和配置方式可以混用,本人倾向于简单的 sql 用注解方式,比较复杂的 sql 用配置方式。