为了账号安全,请及时绑定邮箱和手机立即绑定

MyBatis 映射器

标签:
Java

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

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消