SpringBoot学习笔记(六):Mybatis注解版
一、什么是 MyBatis?
- MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
二、Maven依赖
- 主要依赖:mybatis-spring-boot-starter
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
三、application.properties数据源配置
mybatis.type-aliases-package=com.mybatis.model
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Spring Boot 会自动加载 spring.datasource.*
相关配置,数据源就会自动注入到 sqlSessionFactory 中,sqlSessionFactory 会自动注入到 Mapper 中,对了,你一切都不用管了,直接拿起来使用就行了。
四、启动类添加对 mapper 包扫描
@MapperScan:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
@SpringBootApplication
@MapperScan("com.mybatis.mapper")
public class MybatisAnnotationApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisAnnotationApplication.class, args);
}
}
或者直接在 Mapper 类上面添加注解@Mapper
- 在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类
五、Mapper接口文件
-
@Select:对应着xml文件中的<select>元素
-
@Results:完成数据库字段到实体类属性的映射
- @Result:对应着xml文件中的
<result>
元素,而参数中协商id = true 时就对应<id>
元素
- @Result:对应着xml文件中的
-
-
@Insert:对应着xml文件中的<select>元素
-
@Update:对应着xml文件中的<update>元素
-
@Delete:对应着xml文件中的<delete>元素
public interface UserMapper {
@Select("SELECT * FROM users")
@Results({
@Result(property = "userSex", column = "user_sex", javaType = UserSexEnum.class),
@Result(property = "nickName", column = "nick_name")
})
List<UserEntity> getAll();
@Select("SELECT * FROM users WHERE id = #{id}")
@Results({
@Result(property = "userSex", column = "user_sex", javaType = UserSexEnum.class),
@Result(property = "nickName", column = "nick_name")
})
UserEntity getOne(Long id);
@Insert("INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})")
void insert(UserEntity user);
@Update("UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}")
void update(UserEntity user);
@Delete("DELETE FROM users WHERE id =#{id}")
void delete(Long id);
}
注意
:#符号和$符号的不同:
- #{}是预编译处理,$ {}是字符串替换。
- mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
- mybatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。
- 使用 #{} 可以有效的防止SQL注入,提高系统安全性。
六、测试类
@RunWith(SpringRunner.class)
@SpringBootTest
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testInsert() throws Exception {
userMapper.insert(new User("Jax", "123", UserSexEnum.MAN));
userMapper.insert(new User("Luna", "111", UserSexEnum.WOMAN));
userMapper.insert(new User("Amy", "222", UserSexEnum.WOMAN));
Assert.assertEquals(3, userMapper.getAll().size());
}
@Test
public void testQuery() throws Exception {
List<User> users = userMapper.getAll();
System.out.println(users.toString());
}
@Test
public void testUpdate() throws Exception {
User user = userMapper.getOne(1l);
System.out.println(user.toString());
user.setNickName("汤姆");
userMapper.update(user);
Assert.assertTrue(("汤姆".equals(userMapper.getOne(1l).getNickName())));
}
}
Assert.assertEquals()
及其重载方法:- 如果两者一致, 程序继续往下运行
- 如果两者不一致, 中断测试方法, 抛出异常信息 AssertionFailedError .