Mybatis3源码分析(01)-前期准备

背景


我们大多项目都使用了Mybatis。Mybatis的中的sql大多都是配置在xml文件中的,我们为了方便dba对sql统一的管理需要将sql保存在数据库中。这样就要求Mybatis从数据库中加载配置,同时dba优化sql之后还得实现让Mybatis在不重启应用的情况下动态加载。要实现这些功能,需要对Mybatis进行扩展,所以本人花了一些时间分析一Mybatis3源码,在此记录。

分析计划

主要分析如下三大内容:
  1. 分析Mybatis是怎么解析配置文件
  2. 分析Mybatis是如何执行Sql并映射结果
  3. 分析Mybatis是如何使用缓存的

技术要求

  1. core java。尤其是jdbc部分。
  2. 基本的xml知识。
  3. 以上都具备的话,还需要花点时间看看Mybatis:http://mybatis.org/mybatis-3/zh/


环境准备

在eclipse中新建一个普通的maven工程,并加上Mybatis的依赖


  4.0.0
  com.ashan
  mybatis
  0.0.1-SNAPSHOT
  
  	
  		org.mybatis
  		mybatis
  		3.2.6
  	
  	
  		mysql
  		mysql-connector-java
  		5.1.26
  	
  	
  		commons-lang
  		commons-lang
  		2.5
  	
  

数据模型

电信行业最简单的三户模型:客户、用户、账户
  1. 客户:即一个证件对应一个客户
  2. 用户:一个电话号码或宽带账号对应一个用户
  3. 账户:一个银行账户对应一个账户
这里假定这个情形:你拿身份证去电信运营商里办了一个号码,并且提供了两个银行账户,每个月都可以使用这两个账号自动交话费。

用户定义

package com.ashan.mybatis;

import java.util.List;

/**
 * 用户
 * 
 * @author ashan
 *
 */
public class User
{
	
	/**
	 * 用户id,主键
	 */
	private String id;
	
	private String username;
	
	/**
	 * 用户号码
	 */
	private String svcnum;
	
	private String password;
	
	/**
	 * 一个用户只能对应一个客户
	 */
	private Cust cust;
	
	/**
	 * 一个用户可以有多个账户
	 */
	private List accts;
	
	/**
	 * 用户类型,两种:普通用户和重要用户
	 */
	private UserType type;
	
	

	public User(String id, String username)
	{
		super();
		this.id = id;
		this.username = username;
	}

	public String getId()
	{
		return id;
	}

	public void setId(String id)
	{
		this.id = id;
	}

	public String getUsername()
	{
		return username;
	}

	public void setUsername(String username)
	{
		this.username = username;
	}

	public String getPassword()
	{
		return password;
	}

	public void setPassword(String password)
	{
		this.password = password;
	}

	public Cust getCust()
	{
		return cust;
	}

	public void setCust(Cust cust)
	{
		this.cust = cust;
	}

	public List getAccts()
	{
		return accts;
	}

	public void setAccts(List accts)
	{
		this.accts = accts;
	}

	public UserType getType()
	{
		return type;
	}

	public void setType(UserType type)
	{
		this.type = type;
	}

	public String getSvcnum()
	{
		return svcnum;
	}

	public void setSvcnum(String svcnum)
	{
		this.svcnum = svcnum;
	}
	
	
	
	
}


用户定义

package com.ashan.mybatis;

public class Cust
{
	private String id;
	
	private String custname;
	
	/**
	 * 证件号码
	 */
	private String certNo;

	public String getId()
	{
		return id;
	}

	public void setId(String id)
	{
		this.id = id;
	}

	public String getCustname()
	{
		return custname;
	}

	public void setCustname(String custname)
	{
		this.custname = custname;
	}

	public String getCertNo()
	{
		return certNo;
	}

	public void setCertNo(String certNo)
	{
		this.certNo = certNo;
	}
	
	
	
}

账户定义

package com.ashan.mybatis;

public class Acct
{
	private String id;
	
	private String payName;
	
	/**
	 * 银行账号
	 */
	private String bankNo;

	public String getId()
	{
		return id;
	}

	public void setId(String id)
	{
		this.id = id;
	}

	public String getPayName()
	{
		return payName;
	}

	public void setPayName(String payName)
	{
		this.payName = payName;
	}

	public String getBankNo()
	{
		return bankNo;
	}

	public void setBankNo(String bankNo)
	{
		this.bankNo = bankNo;
	}
	
	
}

用户类型

package com.ashan.mybatis;

public enum UserType
{
	
	/**
	 * 普通用户
	 */
	GENERAL,
	
	
	/**
	 * 重要用户
	 */
	IMPORTANT
}

Mybatis配置

mybatis-config.xml



  


	
	
	
		
			
			
				
				
				
				
			
		
	
	
	
	
		
	




UserMapper.xml




	
		
			
			
		
		
		
		
		
		
		
			
			
			
		
		
		
			
			
			
		
	
	
	
	
	
	




跑跑试试看有没有问题

package com.ashan.mybatis;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SqlSesstionFactoryTest
{

	public static void main(String[] args) throws Exception
	{
		String resouce="mybatis-config.xml";
		InputStream is=Resources.getResourceAsStream(resouce);
		SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
		System.out.println(sqlSessionFactory.getConfiguration());
	}
}

运行没有异常说明配置OK!

其他说明

搭建这个环境的作用是为了在分析代码过程中进行Debuger,有些时候源代码很难明白,Debuger一下能知道代码的走向,有时源代码看明白了,Debuger一下也能帮助验证自己的理解是否有错。Debuger对分析源码非常有用。
使用Maven构建这个工程除了方便jar导入之后,还有一个用处就是在eclipse中查看源代码非常方便。在eclipse使用maven工程,eclipse会自动下载并关联源代码。 

你可能感兴趣的:(Mybatis)