mybatis的各个标签详解

本文参考mybatis官方文档,做出大致解析

mybatis的git地址:https://github.com/mybatis/mybatis-3

官方文档url:https://mybatis.org/mybatis-3/

mybatis框架是什么?有什么优点?

mybaties==》也叫Ibaties     它是一个开源,持久化,轻量级的框架

 JDBC – SQL夹在Java代码块里,耦合度高导致硬编码内伤 – 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见

Hibernate和JPA – 长难复杂SQL,对于Hibernate而言处理也 不容易 – 内部自动生产的SQL,不容易做特殊优化。 – 基于全映 射的全自动框架,大量字段的POJO进行部分映射时比较困难。 导致数据库性能下降。

对开发人员而言,核心sql还是需要自己优化

sql和java编码分开,功能边界清晰,一个专注业务、 一个专注数据。

 

  1. 全局配置文件详解:configuration(配置)

  • 编写前准备:
  1. 导入mybaties所需要的jar包:mybatis-3.4.1.jar
  2. 导入访问数据库所需要的jar包:mysql-connector-java-5.1.37-bin.jar
  3.  编写全局配置文件,导入dtd
  • 举例说明导入dtd文件,具有提示功能

eclipse或者myeclipse,找到window-->Preferences-->搜索xml-->xml Catalog后,如下图操作:

mybatis的各个标签详解_第1张图片

标签详解

properties(属性):

mybatis可以使用properties来引入外部properties配置文件的内容;

  1.         resource:引入类路径下的资源,类路径就是源码包下的文件,如src根目录下
  2.         url:引入网络路径或者磁盘路径下的资源

举例说明

 

settings包含很多重要的设置项

 

  1.             setting:用来设置每一个设置项
  2.             name:设置项名
  3.             value:设置项取值

举例说明

开启驼峰命名,如数据库列表是dept_name==>javabean中就可以写成,deptId,由于mybatis中有自定义高级映射【基于了解程度】








 -->

 

typeAliases:别名处理器:可以为我们的java类型起别名,别名不区分大小写

举例说明


		
		
		
		
		
		
		
	

 

environments:环境们,mybatis可以配置多种环境 ,default指定使用某种环境。可以达到快速切换环境。

 

  1. environment:配置一个具体的环境信息;必须有两个标签;id代表当前环境的唯一标识
  2. transactionManager:事务管理器;
  3. type:事务管理器的类型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory), 自定义事务管理器:实现TransactionFactory接口.type指定为全类名
  4. dataSource:数据源,

                    type:数据源类型;UNPOOLED(UnpooledDataSourceFactory)
                                |POOLED(PooledDataSourceFactory)
                                |JNDI(JndiDataSourceFactory)
                    自定义数据源:实现DataSourceFactory接口,type是全类名

举例说明


  
  
  
    
      
      
        
        
        
        
      
    
  

 

databaseIdProvider:支持多数据库厂商的;


         type="DB_VENDOR":VendorDatabaseIdProvider
             作用就是得到数据库厂商的标识(驱动getDatabaseProductName()),mybatis就能根据数据库厂商标识来执行不同的sql;
             MySQL,Oracle,SQL Server,xxxx

举例说明

 



  
  
  
 

 

mappers:将sql映射注册到全局配置中 -->


    
        

 

数据库映射文件,即:开发过程中,带有命名xxxMapper.xml的文件配置详解

在这个文件中,我们以前可以用数据库直接映射javaBean属性,只要数据库列表与javaBean的属性名字相同或者驼峰命名法,我们就能够查到数据,在开发过程中,注意:我们经常是映射数据库接口,即dao层,下面我举例说明,映射dao层

简单的举例说明文件配置

 
 


  


   

dao层传参说明:

  • 单个参数:mybatis不会做特殊处理,

    #{参数名/任意名}:取出参数值。
    

  • 多个参数:mybatis会做特殊处理。

    多个参数会被封装成 一个map,
        key:param1...paramN,或者参数的索引也可以
        value:传入的参数值
    #{}就是从map中获取指定的key的值;

注意:抛出异常

org.apache.ibatis.binding.BindingException: 
    Parameter 'id' not found. 
    Available parameters are [1, 0, param1, param2]

操作:
        方法:public Employee getEmpByIdAndLastName(Integer id,String lastName);
        取值:#{id},#{lastName}==>正确如下

【命名参数】:明确指定封装参数时map的key;@Param("id")
    多个参数会被封装成 一个map,
        key:使用@Param注解指定的值
        value:参数值
    #{指定的key}取出对应的参数值

举例说明

//多参数取值,传值,dao层
	public Customer getCustomer(@Param("id")int id,@Param("cus")Customer customer);

对应的mapper文件

  • 返回list集合:

	//通过id查询多条记录,dao层
	public List getCustomers(String customer_name);

    对应的mapper文件

   

 

  • 返回map集合,没有指定封装规则
//传值map,dao层
	public Map getMap(int id);

//对应的mapper文件
 
	

 

  • 返回map集合,指定封装规则,主键为map的key,当前javaBean为value
//查询customer,键值对改变,对应的dao层

	//指定你需要的键,设置注解@MapKey("键名"),这个可以自己指定其他列作为key
	@MapKey("id")
	public Map getMaps(int id);

//对应的mapper文件

	

 

  • 参数获取

    #{}:可以获取map中的值或者pojo对象属性的值;
    ${}:可以获取map中的值或者pojo对象属性的值;
select * from tbl_employee where id=${id} and last_name=#{lastName}
Preparing: select * from tbl_employee where id=2 and last_name=?
    区别:
        #{}:是以预编译的形式,将参数设置到sql语句中;PreparedStatement;防止sql注入
        ${}:取出的值直接拼装在sql语句中;会有安全问题;
        大多情况下,我们去参数的值都应该去使用#{};
        
        原生jdbc不支持占位符的地方我们就可以使用${}进行取值
        比如分表、排序。。。;按照年份分表拆分
            select * from ${year}_salary where xxx;
            select * from tbl_employee order by ${f_name} ${order}

#{}:更丰富的用法:
    规定参数的一些规则:
    javaType、 jdbcType、 mode(存储过程)、 numericScale、
    resultMap、 typeHandler、 jdbcTypeName、 expression(未来准备支持的功能);

    jdbcType通常需要在某种特定的条件下被设置:
        在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。比如Oracle(报错);
        
        JdbcType OTHER:无效的类型;因为mybatis对所有的null都映射的是原生Jdbc的OTHER类型,oracle不能正确处理;
        
        由于全局配置中:jdbcTypeForNull=OTHER;oracle不支持;两种办法
        1、#{email,jdbcType=OTHER};
        2、jdbcTypeForNull=NULL
            

 

mybatis高级映射,resultMap映射【开发重点】

  • 级联属性:数据库1对1关系,数据库的关系如下图所示:

 

mybatis的各个标签详解_第2张图片

 

举例如下操作:association关键字查询

Emploee类中,有一个属性

//vo层,级联属性
    private Deptartment dept;

//查询员工所对应的的部门,dao层
	public Customer getCusDept(int id);


//对应的mapper文件


	
	
	
	
	
	
	
	
	
	
	
	



	

 

 

数据库1对n,在javaBean,Deptartment类中,有一个属性

//多个员工
    private List emploee;

举例如下操作:collection关键字查询

	//查询当前部门中所有的员工信息,dao层
	public Deptartment getDept(int id);
	

    //对应的mapper文件


	
	
	
	
	
	
	
	
	
	


大家有什么问题,欢迎在下方留言喔

你可能感兴趣的:(javaee)