MyBatis 映射器

ps 一個用於生成MyBatis配置文件的插件 mybatis-generator
使用方法呢, 是加入maven插件中 然後執行相關命令可以實現自動生成MyBatis配置文件

自動映射

首先編寫無參的javabean

package com.ming.MyBatis.POJO;

/**
 * @author ming
 */
public class Role {
    private int id;
    private String roleName;
    private String note;
    
    public Role(){

    }

    /**
     * @param id 
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @param roleName 
     */
    public void setRole_name(String roleName) {
        this.roleName = roleName;
    }

    /**
     * @param note 
     */
    public void setNote(String note) {
        this.note = note;
    }

    /**
     * @return 
     */
    public int getId() {
        return id;
    }

    /**
     * @return 
     */
    public String getRoleName() {
        return roleName;
    }

    /**
     * @return 
     */
    public String getNote() {
        return note;
    }
}

然後創建數據庫

這次使用的是開發環境創建的數據庫
數據庫類型如下
1554124784598.remmina-2019-4-13-20-0-18.273289-1

編寫映射文件

<mapper namespace="com.ming.MyBatis.POJO.RoleMapper">
    <select id="getRole" parameterType="int" resultType="com.ming.MyBatis.POJO.Role">
        SELECT id, role_name as roleName, note FROM t_role WHERE id = #{id}
    </select>
    
</mapper>

此時結果會自動映射到VO對象中,根據VO對象自動調用set方法,然後進行賦值操作

此時DAO層接口

/**
     * @param id
     * @return
     */
    public Role getRole(int id);

傳遞多個參數

如果需要傳遞多個參數,使用MyBatis提供的Map接口

首先新增加DAO層接口

/**
     * 查詢Map
     * @param params
     * @return
     */
    public List<Role> findRoleByteMap(Map<String, String> params);

接着,書寫映射文件,傳遞參數

<select id="findRoleByteMap" parameterType="map" resultMap="roleMap">
        SELECT id, role_name, note FROM t_role
        WHERE role_name LIKE CONCAT('%', #{roleName}, '%')
        AND note LIKE CONCAT('%', #{note}, '%')
    </select>

這裏呢,定義了一個結果集
對於返回的數據,使用typehand進行攔截,將會調用自定義別名的role類

<resultMap type="role" id="roleMap">
        <!-- id爲主鍵映射關係 其中數據庫中的id爲主鍵 -->
        <id column="id" property="id" javaType="int" jdbcType="INTEGER"/>
        <!-- result爲其他基本數據類型和實體類之間的映射 映射關係爲role_name 到 roleName之間的映射 數據類型爲string到VARCHAR之間的映射關係 -->
        <result column="role_name" property="roleName" javaType="string" jdbcType="VARCHAR"/>
        <!-- 這裏使用typeHandler表示遇到此處理集的時候,將會執行com.ming.MyBatis.StringTypeHandler -->
        <result column="note" property="note" typeHandler="com.ming.MyBatis.StringTypeHandler"/>
    </resultMap>

現在的完整文件

<?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.ming.MyBatis.POJO.RoleMapper">
    <resultMap type="role" id="roleMap">
        <!-- id爲主鍵映射關係 其中數據庫中的id爲主鍵 -->
        <id column="id" property="id" javaType="int" jdbcType="INTEGER"/>
        <!-- result爲其他基本數據類型和實體類之間的映射 映射關係爲role_name 到 roleName之間的映射 數據類型爲string到VARCHAR之間的映射關係 -->
        <result column="role_name" property="roleName" javaType="string" jdbcType="VARCHAR"/>
        <!-- 這裏使用typeHandler表示遇到此處理集的時候,將會執行com.ming.MyBatis.StringTypeHandler -->
        <result column="note" property="note" typeHandler="com.ming.MyBatis.StringTypeHandler"/>
    </resultMap>
    
    <select id="getRole" parameterType="int" resultType="com.ming.MyBatis.POJO.Role">
        SELECT id, role_name as roleName, note FROM t_role WHERE id = #{id}
    </select>
    
    <select id="findRoleByteMap" parameterType="map" resultMap="roleMap">
        SELECT id, role_name, note FROM t_role
        WHERE role_name LIKE CONCAT('%', #{roleName}, '%')
        AND note LIKE CONCAT('%', #{note}, '%')
    </select>
</mapper>
<?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>
    <!-- 讀取數據庫配置文件 -->
    <properties resource="db.properties"/>
    <!-- 定義別名 -->
    <typeAliases>
        <typeAlias type="com.ming.MyBatis.POJO.Role" alias="role"/>
    </typeAliases>
    
    <!-- 自定義數據處理 -->
    <typeHandlers>
        <typeHandler jdbcType="VARCHAR" javaType="string" handler="com.ming.MyBatis.StringTypeHandler"/>
    </typeHandlers>
    <!-- 定義數據庫信息 -->
    <environments default="development">
        <environment id="development">
            <!-- jdbc事物管理 -->
            <transactionManager type="JDBC"/>
            <!-- 數據庫鏈接信息 -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <mapper resource="RoleMapper.xml"/>
    </mappers>
</configuration>

書寫結果展示

<%@ page import="org.apache.ibatis.session.SqlSession" %>
<%@ page import="com.ming.Util.SqlSessionFactoryUtil" %>
<%@ page import="com.ming.MyBatis.POJO.RoleMapper" %>
<%@ page import="com.ming.MyBatis.POJO.Role" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="javax.swing.text.html.HTMLDocument" %>
<%@ page import="java.util.Iterator" %>
<html>
<body>
<h2>Hello World!</h2>

<%
    long startTime = System.currentTimeMillis(); //獲取開始時間
    SqlSession sqlSession = null;
    List<Role> role = null;
    for(int i = 0; i < 10; i++) {
        try {
            sqlSession = SqlSessionFactoryUtil.openSqlSesion();
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            Map<String, String> paramsMap = new HashMap<String, String>();
            paramsMap.put("roleName", "name");
            paramsMap.put("note", "note");
            role = roleMapper.findRoleByteMap(paramsMap);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
    long endTime = System.currentTimeMillis(); //獲取結束時間

%>

<%
    Iterator iterator = role.iterator();
    while(iterator.hasNext()){
        %>
            <%=((Role)iterator.next()).getNote()%>

        <%
    }
%>
</body>
</html>

數據庫中大概有一萬多條記錄,時間較長

2019-04-14-05-04-05----

ps 一萬多條list擔心內存

此時可以在此處輸出查詢日誌,用於進行分析

註解傳遞參數

使用param註解傳遞參數

新建一個DAO接口

/**
     * @param roleName 
     * @param note
     * @return
     */
    public List<Role> findRoleByteMap1(@Param("roleName") String roleName, @Param("note") String note);

再次編寫映射文件,對DAO層和SQL語句進行映射配置

<select id="findRoleByteMap1" resultMap="roleMap">
        SELECT id, role_name, note FROM t_role
        WHERE role_name LIKE CONCAT('%', #{roleName}, '%')
        AND note LIKE CONCAT('%', #{note}, '%')
    </select>

再次編寫展示層

<%@ page import="org.apache.ibatis.session.SqlSession" %>
<%@ page import="com.ming.Util.SqlSessionFactoryUtil" %>
<%@ page import="com.ming.MyBatis.POJO.RoleMapper" %>
<%@ page import="com.ming.MyBatis.POJO.Role" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="javax.swing.text.html.HTMLDocument" %>
<%@ page import="java.util.Iterator" %>
<html>
<body>
<h2>Hello World!</h2>

<%
    long startTime = System.currentTimeMillis(); //獲取開始時間
    SqlSession sqlSession = null;
    List<Role> role = null;
    for(int i = 0; i < 10; i++) {
        try {
            sqlSession = SqlSessionFactoryUtil.openSqlSesion();
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            Map<String, String> paramsMap = new HashMap<String, String>();
            paramsMap.put("roleName", "name");
            paramsMap.put("note", "note");
            role = roleMapper.findRoleByteMap1("name", "note");
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
    long endTime = System.currentTimeMillis(); //獲取結束時間

%>

<%
    Iterator iterator = role.iterator();
    while(iterator.hasNext()){
        %>
            <%=((Role)iterator.next()).getNote()%>

        <%
    }
%>
</body>
</html>

運行結果

2019-04-14-07-03-44----