1.4 社区开发前置知识:MyBatis入门

195 阅读3分钟

因为之前系统学习过MyBatis,所以这里只是做一个简要的了解,MyBatis详细知识可以看我以前写的MyBatis专栏。

5. MyBatis入门

对于牛客社区这个项目我们专门建一个数据库community,我们把项目中需要的表给它导入进去,一些测试数据也给它初始化好。

image-20220703095222527.png

建表的sql语句以及表单的一些初始数据导入到community数据库中。

接下来正式学习MyBatis

image-20220703100046849.png

mybatis.org/mybatis-3

mybatis.org/spring

  • 在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

image-20220703104213365.png

接下来我们要对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);
}

image-20220703122737217.png

接下来就要写这个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>

image-20220703122652792.png

接下来写一个测试类进行测试

@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);
    }

}

image-20220703125717880.png

都运行成功了,然后经检验数据都正确操作了。

最后补充一点:

为了便于调试,我们可以在 application.properties 配置文件中设置日志的级别,便于调试,加上下面这句话即可

# logger
logging.level.com.nowcoder.community=debug