MyBatis

MyBatis

  • MyBatis是什么
  • MyBatis的相关下载
  • MyBatis
    • MyBatis配置详解

MyBatis是什么

MyBatis是一个简化和实现了Java数据持久化层的开源框架,它抽象了大量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互。
MyBatis的前身是iBATIS。MyBatis流行的主要原因在于它的简单性和易用性。在Java应用程序中,数据可持久化层涉及到的工作有:
将从数据库查询到的数据生成所需要的Java对象
将Java对象中的数据通过SQL持久化到数据库中

MyBatis的相关下载

mybatis在github中的地址
https://github.com/mybatis/mybatis-3
最新版本的mybatis的下载地址
https://github.com/mybatis/mybatis-3/releases
doc文档
http://www.mybatis.org/mybatis-3/

MyBatis

  1. 它消除了大量的JDBC冗余代码
    Java通过JDBC的API来操作关系型数据库,但是JDBC是一个非常底层的API,我们需要书写大量的代码来完成对数据库的操作。但是使用mybatis来完成相同的操作要简单方便灵活的多。
    例如:
    在SQLMapper映射配置文件中配置SQL语句
StudentMapper.xml
	 
  		insert into students(id,name,age)  
  		values(#{id},#{name},#{age}) 
  	 


创建一个StudentMapper接口


	public interface StudentMapper{ 
  		void insertStudent(Student student); 
  	} 

编写Java代码完成插入操作

	SqlSession session = getSqlSessionFactory().openSession(); 
  	StudentMapper mapper = session.getMapper(StudentMapper.class); 
  	mapper.insertStudent(student); 

MyBatis还提供了其他一些特性来简化持久化逻辑的实现。
它支持复杂的SQL结果集数据映射到嵌套的对象结构
它支持一对一和一对多的结果集和Java对象的映射
多表级联查询
它支持根据输入的数据构建
动态的SQL语句

2.低的学习曲线
取决于Java和SQL方面的知识。
3.它能很好的与传统数据库协同工作
4.可以接受SQL语句
5.提供了与spring框架的集成支持
6.提供了与第三方缓存类库的集成支持
MyBatis内建的SqlSession级别的缓存机制,用于缓存Select语句查询出来的结果,除此之外,还有EHCache,OSCache,Hazelacst等
7.MyBatis框架中一般需要两种文件
第一种
mybatis的配置文件:mybatis-config.xml,其中包括数据库连接信息,类型别名等等。

例:
   
   
   
     
      
     
     
       
     	  
     	 
     		
     		 
     		 
     		 
     		 
     	   
     	 
        
        
     	 
        
      

第二种
mybatis的映射文件:XxxxMapper.xml,这个文件中包括Xxxx类所对应的数据库表的各种增删改查sql语句

  
  
     
       
    	 
    	 
    	 
       
       
       
       
    	 INSERT INTO STUDENTS(ID,NAME,EMAIL)  
    		 VALUES(#{id },#{name},#{email}) 
       
     

8.mybatis中的映射接口XxxxMapper.java(对XxxxMapper.xml中的sql语句进行映射)
mybatis中除了必须的jar包,各种xml配置文件之外,一般还需要有调用sql语句执行的接口XxxxMapper.java

例:
 public interface StudentMapper{
    	List findAllStudents(); 
    	Student findStudentById(Integer id); 
    	void insertStudent(Student student); 
    }

注意:接口中的方法的名字和XML文件定义的SQL映射语句的名称要相同。同时我们不需要去实现该接口,因为mybatis中提供了相应的方式在运行期间动态生成该接口的实现类对象。
8.mybatis中的SqlSession接口和SqlSessionFactory接口

  //产生SqlSessionFactory
	SqlSessionFactroyBuilder.build();

SqlSession接口的实现类对象是mybatis中最重要的一个对象,我们可以使用改对象动态获得XxxxMapper.java接口的实现类对象,然后就可以调用到XxxxMapper.java接口中方法所映射的sql语句。

例:
 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); 
   SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
   SqlSession sqlSession = sqlSessionFactory.openSession();

  //第一种执行sql语句的方式  通过XxxxMapper接口的实现类对象来调用
   //动态获得XxxxMapper接口的实现类
   StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
   studentMapper.insertStudent(new Student(1,"tom","[email protected]"));
   
   //第二种执行sql语句的方式  执行调用XxxxMapper.xml中写好的sql语句
   //也可以【不通过】Mapper接口执行映射的SQL
   //然而,使用 Mapper接口是最佳实践
   //sqlSession.selectOne("com.pojo.StudentMapper.findStudentById",1);

MyBatis配置详解

  1. environments元素
    environments是配置mybatis当前工作的数据库环境的地方。
    mybatis支持配置多个dataSource环境,可以通过将默认environments值设置成想要的environment的id值。
    注意:对于environments,我们可以在其中配置多个environment子元素,同时还需要再environment中配置dataSource和transactionManager元素。
  2. dataSource元素
    dataSource表示的是数据源:至少会包括改连接数据库的各种信息。
	
		 
		 
		 
		 
	 

dataSource的类型type属性可以配置成其内置类型之一,如UNPOOLED,POOLED,JNDI.

  • 如果将类型设置成UNPOOLED,MyBatis会为每一个数据库操作创建一个新的连接,使用完了并关闭它,该方式适用于只有小规模数量并发用户的简单应用程序上。
  • 如果将类型设置成POOLED,MyBatis会创建一个数据库连接池,连接池中的一个连接将会被用作数据库操作,一旦数据库操作完成,MyBatis会将此连接返回给连接池。在开发或测试环境中,经常使用此种方式。
  • 如果将类型设置成JNDI,MyBatis从在应用服务器向配置好的JNDI数据源dataSource获取数据库连接。在生产环境中,优先考虑这种方式。
  1. transactionManager元素 :事务管理器
    MyBatis支持两种类型的事务管理器:JDBC和MANAGED。

    • 如果将TransactionManager 属性设置成JDBC,MyBatis内部将使用JdbcTransactionFactory类创建TransactionManager。例如,部署到ApacheTomcat的应用程序,需要应用程序自己管理事务。
    • 如果将TransactionManager属性设置成MANAGED时,MyBatis内部使用ManagedTransactionFactory 类创建事务管理器TransactionManager。例如,当一个Java EE的应用程序部署在类似JBoss,WebLogic,GlassFish应用服务器上时,它们会使用EJB进行应用服务器的事务管理能力。在这些管理环境中,你可以使用MANAGED事务管理器。

    注意:Managed是托管的意思,即我们编写的应用程序本身不去管理事务,而是把事务管理交给应用所在的服务器进行管理。

    4.properties元素
    属性配置元素properties可以将配置值写死到mybatis-config.xml中,也可以具体到一个属性文件中,并且使用属性文件的key名作为占位符。
    将数据库连接属性配置到application.properties文件中,并且driver,url等属性使用了占位符。

application.properties:
	   jdbc.driverClassName=oracle.jdbc.driver.OracleDriver 
       jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:XE
       jdbc.username=username 
       jdbc.password=password

在mybatis-config.xml文件中,为属性使用application.properties文件中定义的占位符。

 
       
         
          
          
        
   
  	  
  	    
  	    
  	      
  	      
  	      
  	      
  	    
  	  
     

5.typeAliases元素:类型别名
在SQLMapper配置文件中,对于resultType和parameterType属性值,我们需要使用javaBean的完全限定名。

例如:
	 
       
      	UPDATE STUDENTS  
      	SET NAME=#{name}, EMAIL=#{email}, DOB=#{dob}  
      	WHERE STUD_ID=#{id} 
       

注意:

  • parameterType表示将来调用这个sql语句的 时候所传的参数的类型(参数值或者参数对象里面的属性值,用来替换sql语句中的占位符)。
  • resultType表示将来调用这个sql语句的时候所返回的结果的类型(方便mybatis给我们自动封装结果集)。

我们可以为完全限定名取一个别名(alias),然后就可以在需要使用完全限定名的地方使用别名,而不是到处使用完全限定名。

	
	  
         
         
     
      

 	  
       
      	UPDATE STUDENTS  
      	SET NAME=#{name}, EMAIL=#{email}, DOB=#{dob}  
      	WHERE STUD_ID=#{id} 
       

还可以为配置出需要取别名的类的所在的包,mybatis会自动扫描包内定义的类 ,然后分别为每个类注册一个小写字母开头的简单类名形式的别名。

例:
	  
         
     

如果Student.java和 Teacher.java 定义在com.pojo包中,则 com.pojo.Student的别名会被注册为student。而com.pojo.Teacher别名将会被注册为teacher。

还有另外一种方式为JavaBeans起别名,使用注解 @Alias
注:@Alias注解将会覆盖配置文件中的定义。

@Alias("stu") 
public class Student{
      	....
} 

6.typeHandlers元素:类型处理器
当MyBatis将一个Java对象作为输入参数执行INSERT语句操作时,他会创建一个PreparedStatement对象,并且使用setXXX()方法对占位符设置相应的参数值。这里XXX可以是int,String,Date等Java对象属性类型的任意一个。
自定义类型处理器:

package com.test;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import com.bean.BriupName;
//类型处理器
public class MyTypeHandler 
		extends BaseTypeHandler{
	@Override
	public BriupName getNullableResult(ResultSet set, String columnName) throws SQLException {
		String value = set.getString(columnName);
		System.out.println("值 : "+value);
		BriupName n = new BriupName();
		n.setFirstName(value.substring(0, 1));
		n.setLastName(value.substring(1));
		return n;
	}
	@Override
	public BriupName getNullableResult(ResultSet set, int columnindex) throws SQLException {
		String value = set.getString(columnindex);
		System.out.println("值 : "+value);
		BriupName n = new BriupName();
		n.setFirstName(value.substring(0, 1));
		n.setLastName(value.substring(1));
		return n;
	}
	@Override
	public BriupName getNullableResult(CallableStatement arg0, int arg1) throws SQLException {
		return null;
	}
	@Override
	public void setNonNullParameter(
			PreparedStatement ps, 
			int index, 
			BriupName name, 
			JdbcType jdbcType)throws SQLException {
		ps.setString(index, name.getFirstName()+"--"+name.getLastName());
	}	
}

配置文件中配置类型处理器信息:




	
	

	
	
	
		
			
			
			
			
				 
				 
				 
				 
			
		
		
	
	
	
		
		
	

映射文件
测试类

7.settings元素:全局参数设置
大多数情况下,这些参数使用它们的默认值即可。MyBatis默认的全局参数设置可以被覆盖掉。


  	  
  	  
  
  	  
  	  
  
  	  
  	   
  
  	  
  	  
  	  
  	  
  	   
  	  
  	  
  	  
  	  
  	  
  	   
  
  	  !-- 设置超时时间,它决定驱动等待一个数据库响应的时间 -->
  	   
  	  
  	  
  	   
  
  	  
  	   
  
  	  
  	   
  
  	  
  	  
  
  	  
  	   
  
  	  
  	  
  	   
  	  
  	   
  		
  	  
  	   
  
  	  
  	   
  
  	  
  	   
  	 

8.mappers元素:SQL映射
SQLMapper文件中包含的SQL映射语句将会被应用通过使用其标签中的id值来执行。我们需要在mybatis-config.xml文件中配置SQLMapper文件的位置。
mapper标签都可以从不同类型的资源中加载映射mapper。

  1. resource属性用来指定在classpath中的mapper文件。
  2. url属性用来通过完全文件系统路径或者web URL地址来指向mapper文件。
  3. class属性用来指向一个mapper接口。
  4. package属性用来指向可以找到Mapper接口的包名。
 
  	   
  	   
  	   
  	   
  	 

你可能感兴趣的:(MyBatis)