因为之前系统学习过MyBatis,所以这里只是做一个简要的了解,MyBatis详细知识可以看我以前写的MyBatis专栏。
5. MyBatis入门
对于牛客社区这个项目我们专门建一个数据库community,我们把项目中需要的表给它导入进去,一些测试数据也给它初始化好。
建表的sql语句以及表单的一些初始数据导入到community数据库中。
接下来正式学习MyBatis
- 在SpringBoot中MyBatis的前三个核心组件其实SpringBoot已经帮我们做了,我们需要做的只是写后两个组件:Mapper接口、Mapper映射器。
使用MyBatis对数据库进行操作
接下来我们来使用一下MyBatis对数据库进行操作
首先我们需要导入mysql的依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
接下来我们导入MyBatis的依赖,这里建议使用SpringBoot整合MyBatis的依赖,因为我们用的是SpringBoot框架,我们用SpringBoot整合MyBatis的依赖肯定就更简单了,有自动的配置。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
接下来我们还要对MyBatis做一点配置,因为即便SpringBoot可以自动配置,它也不知道连接数据库的路径是什么、账号密码是什么、希望启动的最大连接是多少,这些我们都得自己配置。
在SpringBoot的整合下就不需要创建mybatis的主配置文件了,直接在 application.properties 配置文件中配置就可以了。
# DataSourceProperties 配置mysql数据库以及连接池(数据源)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/community?characterEncoding=utf-8&useSSL=false&serverTimezone=Hongkong
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
# MybatisProperties 配置MyBatis
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.nowcoder.community.entity
mybatis.configuration.useGeneratedKeys=true
mybatis.configuration.mapUnderscoreToCamelCase=true
接下来我们要对user表里的数据进行增删改查操作了
首先我们需要写一个实体类去封装表里的数据
User
public class User {
private int id;
private String username;
private String password;
private String salt;
private String email;
private int type;
private int status;
private String activationCode;
private String headerUrl;
private Date createTime;
// 为了以免影响阅读体验,get、set、toString方法就不粘了,但是其实是有的
}
接下来我们需要写一个DAO接口访问数据库(只需要去写接口不需要去写实现类),对于这个接口我们需要加一个注解才能让Spring容器装配这个 bean,访问数据库的话在工厂中注册需要加的注解是 @Repository ,但是MyBatis也有一个注解实现了在工厂中注册的功能 @Mapper,这两个注解用哪一个都可以。
@Mapper
public interface UserMapper {
User selectById(int id); // 根据id查询
User selectByName(String username); // 根据name查询
User selectByEmail(String email); // 根据email查询
int insertUser(User user); // 插入数据
int updateStatus(int id, int status); // 更新状态
int updateHeader(int id, String headerUrl);
int updatePassword(int id, String password);
}
接下来就要写这个DAO接口对应的Mapper配置文件了
简单类型的参数 parameterType 不用写
返回类型 resultType 一定要写
keyProperty 表示把 数据库自动生成的 主键值 回填到 对象对应的哪个属性(在这里是 id )
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nowcoder.community.dao.UserMapper">
<sql id="insertFields">
username, password, salt, email, type, status, activation_code, header_url, create_time
</sql>
<sql id="selectFields">
id, username, password, salt, email, type, status, activation_code, header_url, create_time
</sql>
<select id="selectById" resultType="com.nowcoder.community.entity.User">
select <include refid="selectFields"></include>
from user
where id = #{id}
</select>
<select id="selectByName" resultType="com.nowcoder.community.entity.User">
select <include refid="selectFields"></include>
from user
where username = #{username}
</select>
<select id="selectByEmail" resultType="com.nowcoder.community.entity.User">
select <include refid="selectFields"></include>
from user
where email = #{email}
</select>
<insert id="insertUser" parameterType="com.nowcoder.community.entity.User" keyProperty="id">
insert into user (<include refid="insertFields"></include>)
values(#{username}, #{password}, #{salt}, #{email}, #{type}, #{status}, #{activationCode}, #{headerUrl}, #{createTime})
</insert>
<update id="updateStatus">
update user set status = #{status} where id = #{id}
</update>
<update id="updateHeader">
update user set header_url = #{headerUrl} where id = #{id}
</update>
<update id="updatePassword">
update user set password = #{password} where id = #{id}
</update>
</mapper>
接下来写一个测试类进行测试
@SpringBootTest
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = CommunityApplication.class)
public class MapperTests {
@Autowired
private UserMapper userMapper;
@Test
public void testSelectById(){
User user = userMapper.selectById(101);
System.out.println(user);
user = userMapper.selectByName("liubei");
System.out.println(user);
user = userMapper.selectByEmail("nowcoder101@sina.com");
System.out.println(user);
}
@Test
public void testInsertUser() {
User user = new User();
user.setUsername("test");
user.setPassword("123456");
user.setSalt("abc");
user.setEmail("test@qq.com");
user.setHeaderUrl("http://www.nowcoder.com/101.png");
user.setCreateTime(new Date());
int rows = userMapper.insertUser(user);
System.out.println(rows);
System.out.println(user.getId());
}
@Test
public void updateUser() {
int rows = userMapper.updateStatus(150, 1);
System.out.println(rows);
rows = userMapper.updateHeader(150, "http://www.nowcoder.com/102.png");
System.out.println(rows);
rows = userMapper.updatePassword(150, "hello");
System.out.println(rows);
}
}
都运行成功了,然后经检验数据都正确操作了。
最后补充一点:
为了便于调试,我们可以在 application.properties 配置文件中设置日志的级别,便于调试,加上下面这句话即可
# logger
logging.level.com.nowcoder.community=debug
- 我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿。