mybatis结果集映射的工具类

说明

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

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

依赖:3.5


    	org.mybatis
    	mybatis
    	3.5.0

工具

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

mybatis-config.xml在classpath下




  
    
    
  

 ccc.xml在classpath下




	 
		
		
		
			
			
		
	 
	
	
		
	

工具类:

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 handleResult(String resultMapid, Statement st) throws SQLException  {
		List 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 list = handleResult("ccc.user", stmt);
	}

	
}
 
  

解析:

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

  并将mapper_xml的resultMaps解析成 HashMap

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

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

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

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

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

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

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

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

 4.使用完请注意关闭流

你可能感兴趣的:([web]服务端)