1

概述

上一篇针对Mybatis进行了入门体验,本节将继续介绍Mybatis基本映射--单表查询。

本系列文章是基于Mybatis 3.4.6 版本。

创建表

针对于上一节,我们对sys_user表结构进行了优化,字段类型更规范了些,这样做更有利于数据库性能,我们参考了一些数据库设计规范,后续抽时间整理分享出来,修改后SQL语句为:

CREATE TABLE `sys_user` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_account` varchar(50) NOT NULL COMMENT '用户账户',
  `user_password` char(32) NOT NULL COMMENT 'MD5加密的用户密码',
  `user_email` varchar(20) DEFAULT NULL COMMENT '用户邮箱',
  `user_phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  `created_date` datetime NOT NULL COMMENT '创建时间',
  `modified_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `yn` tinyint(1) unsigned NOT NUll DEFAULT 1 COMMENT '是否有效(0无效,1有效)',
  `modified_user` varchar(50) DEFAULT NULL COMMENT '修改人',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户信息表';

实体

我们的SysUser实体代码如下(使用lombok注解,在类中不必写get/set方法,提高开发效率以及代码更整洁):

package com.github.dalianghe.model;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.Date;

@Getter
@Setter
@ToString
public class SysUser {

    private Long id;

    private String userAccount;

    private String userPassword;

    private String userEmail;

    private String userPhone;

    private Date createdDate;

    private Date modifiedDate;

    private Integer yn;

    private String modifiedUser;

    private String remark;

}

接口

Mybatis3.0相比于2.0,支持使用接口调用方法,并且对于多参数需求,支持在方法参数中使用注解@Param设置参数的名字(2.0中需要使用对象或map来传多参数),接口代码如下:

package com.github.dalianghe.mapper;

import com.github.dalianghe.model.SysUser;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface SysUserMapper {

    // 返回多值需用List接收
    public List<SysUser> selectAll() throws Exception;
    // 返回单个或0个使用对象接收
    public SysUser selectUserById(Long id) throws Exception;
    // 多参数方法
    public SysUser selectUserByAccountAndPass(@Param("userAccount") String userAccount,
                                              @Param("userPassword") String userPassword) throws Exception;

}

接口类中定义了无参、一个参数和多个参数的查询方法,在mapper配置文件中需定义三个id为方法名的select查询标签。

需注意的是查询SQL返回的结果数量,当返回1个或0个时,使用对象,返回多个时使用List,否则会报错。

mapper配置文件

定义mapper映射文件,代码如下:

<?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">
<!-- namespace与mapper接口的全限定类名进行关联 -->
<mapper namespace="com.github.dalianghe.mapper.SysUserMapper">
    <!-- resultMap标签用于配置查询字段与java对象属性的映射关系 -->
    <resultMap id="userMap" type="SysUser">
        <id property="id" column="id"/>
        <result property="userAccount" column="user_account"/>
        <result property="userPassword" column="user_password"/>
        <!-- ... 省略其他字段 ... -->
    </resultMap>
    <!-- id与mapper接口方法关联,使用resultMap进行字段映射,其值与上面resultMap的id值对应 -->
    <select id="selectAll" resultMap="userMap">
        select id,user_account,user_password,user_email from sys_user
    </select>
    <!-- 单参数查询,指定参数类型,并且使用别名与对象字段映射 -->
    <select id="selectUserById" parameterType="java.lang.Integer" resultType="SysUser">
        select id,user_account userAccount,user_password userPassword,user_email userEmail from sys_user
        where id=#{id}
    </select>
    <!-- 多参数查询,指定参数类型为map -->
    <select id="selectUserByAccountAndPass" parameterType="java.util.Map" resultMap="userMap">
        select id,user_account,user_password,user_email from sys_user
        where user_account=#{userAccount}
        and user_password=#{userPassword}
    </select>

</mapper>

mybatis配置文件

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>
        <!-- logImpl属性配置指定使用LOG4J输出日志 -->
        <setting name="logImpl" value="LOG4J2" />
        <!-- true可以自动将SQL字段下划线转换为java对象的驼峰式命名属性中,默认为false -->
        <setting name= "mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <typeAliases>
        <!--  -->
        <package name="com.github.dalianghe.model"/>
    </typeAliases>
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC">
                <property name="" value=""/>
            </transactionManager>
            <dataSource type="UNPOOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!--
            方法一:逐一配置需要加载的mapper文件
        -->
        <mapper resource="mappers/SysUserMapper.xml"/>

        <!--
            方法二:配置接口所在的包路径,此配置将:
            1、判断接口接口对应的命名空间是否已存在,存在报错,不存在进行下操作
            2、加载接口对应的XML映射文件,将接口全限定名转换为maper文件路径
                 如:com.github.dalianghe.mapper.SysUserMapper-》com/github/dalianghe/mapper.SysUserMapper.xml
            3、处理接口中的注解方法
            此方法需Mapper接口与mapper配置文件放在同一目录下
        -->
        <!--<package name="com.github.dalianghe.mapper"/>-->
    </mappers>

</configuration>

测试

编写测试用例对mapper方法进行测试,代码如下:

package com.github.dalianghe;

import com.github.dalianghe.mapper.SysUserMapper;
import com.github.dalianghe.model.SysUser;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class UserMapperTest {

    private static SqlSessionFactory sqlSessionFactory;

    @Before
    public void init(){
        try{
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    public SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }

    @Test
    public void testSelectAll(){
        SqlSession sqlSession = getSqlSession();
        try{
            SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
            List<SysUser> users = sysUserMapper.selectAll();
            users.forEach(user -> {
                System.out.println(user.toString());
            });
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Test
    public void testSelectUserById(){
        SqlSession sqlSession = getSqlSession();
        try{
            SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
            SysUser sysUser = sysUserMapper.selectUserById(1L);
            System.out.println(sysUser);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Test
    public void testSelectUserByAccountAndPass(){
        SqlSession sqlSession = getSqlSession();
        try{
            SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
            SysUser sysUser = sysUserMapper.selectUserByAccountAndPass("admin","123");
            System.out.println(sysUser);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}

运行测试方法即可。

总结

本节实例了mybatis基本查询及映射,这些也是实际工作中用的最多的功能,虽然简单,日积月累会构建起我们的知识结构和体系,一步一步来。。。

最后创建了qq群方便大家交流,可扫描加入,同时也可加我qq:276420284,共同学习、共同进步,谢谢!


dalianghe
95 声望29 粉丝

仰望星空,脚踏实地。