mybatis结果集映射的工具类

说明

mybatis最重要的最强大的功能就是结果集映射,它的结果集映射能力是远远超过其他orm工具。

本博客就是利用mybatis代码中的结果集映射,形成一个工具类。

依赖:3.5

<dependency>
    	<groupId>org.mybatis</groupId>
    	<artifactId>mybatis</artifactId>
    	<version>3.5.0</version>
</dependency>

工具

该工具需要三个元素,1.config 2.mapper_xml,3工具类

mybatis-config.xml在classpath下

<?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>
  <mappers>
    <mapper resource="ccc.xml"/>
    <!-- <mapper resource="ddd.xml"/> -->
  </mappers>
</configuration>

 ccc.xml在classpath下

<?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="ccc">
	 <resultMap type="com.bai.btsql.domin.Stu" id="stuResult">
		<id column="sid" property="sid" jdbcType="INTEGER"/>
		<result column="sname" property="sname" jdbcType="VARCHAR"/>
		<association property="te" javaType="com.bai.btsql.domin.Te">
			<id column="tid" property="tid" jdbcType="INTEGER"/>
			<result column="tname" property="tname" jdbcType="VARCHAR"/>
		</association>
	</resultMap> 
	
	<resultMap type="com.bai.btsql.domin.User" id="userResult">
		<id column="iiid" property="id" jdbcType="INTEGER"/>
	</resultMap>
</mapper>

工具类:

package com.bai.btsql.mybatis;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.executor.SimpleExecutor;
import org.apache.ibatis.executor.resultset.DefaultResultSetHandler;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.MappedStatement.Builder;
import org.apache.ibatis.mapping.ResultMap;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
 * mybatis的结果集映射做成一个工具
 * 本类在真正调用之后不要忘记关闭流
 * @author Administrator
 *
 */
public class MybatisResultHandler {
	public static String configSource = "mybatis-config.xml";
	public static Configuration configuration;
	static {
		init();
	}
	public static void init() {
		
		InputStream inputStream = null;
		try {
			inputStream = Resources.getResourceAsStream(configSource);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
				.build(inputStream);
		configuration = sqlSessionFactory.getConfiguration();
		
	}
	
	
	/**
	 * 根据resultid对Statement进行处理映射
	 * @param resultid 格式为"${namespace}.${resultMapid}"
	 * @param st
	 * @return
	 * @throws SQLException 
	 */
	public static List<Object> handleResult(String resultMapid, Statement st) throws SQLException  {
		List<ResultMap> maps = new ArrayList<>();
		ResultMap map = configuration.getResultMap(resultMapid);
		maps.add(map);
		
		MappedStatement.Builder builder = new Builder(configuration, "", null,
				null).resultMaps(maps);
		
		DefaultResultSetHandler handler = new DefaultResultSetHandler(
				new SimpleExecutor(configuration, null), builder.build(), null,
				null, null, new RowBounds());
		
		return handler.handleResultSets(st);
	}
	/**
	 * 测试
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		String JDBC_DRIVER = "com.mysql.jdbc.Driver";
		String DB_URL = "jdbc:mysql://localhost/test1";
		String USER = "root";
		String PASS = "123456";

		Connection conn = null;
		Statement stmt = null;
		
		Class.forName(JDBC_DRIVER);
		
		conn = DriverManager.getConnection(DB_URL, USER, PASS);

		stmt = conn.createStatement();
		String sql;
		sql = " select id iiid from user where id = 20";
		stmt.executeQuery(sql);
		
		List<Object> list = handleResult("ccc.user", stmt);
	}

	
}

解析:

1.该工具类的init方法是进行初始化,加载config,以及加载mapper_xml,

  并将mapper_xml的resultMaps解析成 HashMap<String resultMapid,ResultMap>。

 注意hashmap的键,每一个ResultMap都会生产两个Entry,分别是Entry<resultMapid,ResultMap>和Entry<namespace.resultMapid,ResultMap>,第二个会在resultMapid的前面加上xml的namespace以及一个逗点。

这也是为了防止不同的xml里的resultMapid是相同的,导致map出现覆盖现象。

所以在使用的时候,为了以防万一,我们一律要传递的是${namespace}.${resultMapid}

2.handleResult的方法就是处理statement的方法。

它需要传入一个resultMapid,然后从 HashMap<String resultMapid,ResultMap>里获取到它的ResultMap.

由于Mybatis进行的结果映射处理类及方法是:DefaultResultSetHandler.handleResultSets,所以我们还需要去构建一个DefaultResultSetHandler。

DefaultResultSetHandler构造时又需要一个MappedStatement,所以还要构建一个MappedStatement顺便把ResultMap传进去。至于其他的参数,均只是为了防止DefaultResultSetHandler.handleResultSets报错的。不影响报错的参数都已经置为null了。

3.最后一个main方法是测试的,使用jdbc获取statement使用本方法,执行映射成功

 4.使用完请注意关闭流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值