Mybatis基本映射--SELECT

概述

上一篇針對Mybatis進行了入門體驗,本節將繼續介紹Mybatis基本映射--單表查詢。java

本系列文章是基於Mybatis 3.4.6 版本。mysql

建立表

針對於上一節,咱們對sys_user表結構進行了優化,字段類型更規範了些,這樣作更有利於數據庫性能,咱們參考了一些數據庫設計規範,後續抽時間整理分享出來,修改後SQL語句爲:git

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方法,提升開發效率以及代碼更整潔):github

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;

}sql

接口

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查詢標籤。apache

需注意的是查詢SQL返回的結果數量,當返回1個或0個時,使用對象,返回多個時使用List,不然會報錯。session

mapper配置文件

定義mapper映射文件,代碼以下:mybatis

<?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配置文件代碼以下:app

<?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"/>

        <!--
            方法二:配置接口所在的包路徑,此配置將:
            一、判斷接口接口對應的命名空間是否已存在,存在報錯,不存在進行下操做
            二、加載接口對應的XML映射文件,將接口全限定名轉換爲maper文件路徑
                 如:com.github.dalianghe.mapper.SysUserMapper-》com/github/dalianghe/mapper.SysUserMapper.xml
            三、處理接口中的註解方法
            此方法需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,共同窗習、共同進步,謝謝!

相關文章
相關標籤/搜索