MyBatis 映射器

6次阅读

共计 6290 个字符,预计需要花费 16 分钟才能阅读完成。

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

然后创建数据库
这次使用的是开发环境创建的数据库数据库类型如下
编写映射文件
<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>

数据库中大概有一万多条记录, 时间较长

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>

运行结果

正文完
 0