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;
}
}
然后创建数据库
这次使用的是开发环境创建的数据库
数据库类型如下
编写映射文件
<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>
运行结果
在无知的道路上缓步前行