Mybatis 配置文件SqlMapConfig.xml和映射文件Mapper.xml

一、SqlMapConfig.xml

(一)properties(属性)
  将数据库连接参数单独配置在db.properties中,只需要在SqlMapConfig.xml中加载db.properties的属性值。在SqlMapConfig.xml中就不需要对数据库连接参数硬编码。
db.properties配置文件内容

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123456

SqlMapConfig.xml中配置



SqlMapConfig.xml中通过${参数名}引用db.properties文件中配置的参数


(二)settings(全局配置参数)
  主要的配置参数有如下这些,作用于整个 Mybatis :
Mybatis 配置文件SqlMapConfig.xml和映射文件Mapper.xml_第1张图片
在SqlMapConfig.xml中配置



	

(三)typeAliases(类型别名)
  在 Mapper.xml 中需要定义很多的 Statement,如果在指定类型时输入类型全路径,不方便进行开发,可以针对 parameterType 或 resultType 指定的类型定义一些别名,在 SqlMapConfig.xml 中通过别名定义,方便开发。
其中 Mybatis 提供了一些默认别名的定义:
Mybatis 配置文件SqlMapConfig.xml和映射文件Mapper.xml_第2张图片
当然我们还可以自定义别名单个别名定义和批量定义



	
	

引用单个别名的定义


	
		SELECT LAST_INSERT_ID()
	
	INSERT INTO USER(USERNAME,SEX,BIRTHDAY,ADDRESS) VALUES(#{username},#{sex},#{birthday},#{address})



	
	

  批量定义的别名的引用和单个定义的是一样的,建议使用批量别名定义各pojo的别名,提高开发效率。

(四)typeHandlers(类型处理器)
  Mybatis 中通过 typeHandlers 完成 jdbc 类型和 java 类型的转换。通常情况下,Mybatis 提供的类型处理器满足日常需要,不需要自定义,如果需要定义,如下:



	

Mybatis 支持类型处理器:
Mybatis 配置文件SqlMapConfig.xml和映射文件Mapper.xml_第3张图片

(五)objectFactory(对象工厂)
  MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。
6. plugins(插件)
  简单理解为拦截器,既然是拦截器说白了一般都是动态代理来实现对目标方法的拦截,在前后做一些操作。 在mybatis将这种东西,称之为plugin,配置在SqlMapConfig.xml 配置文件中,通过 plugins 标签配置。在Mybatis中,可以被拦截的目标主要是:
1. StatementHandler(SQL语句处理器);
2. ParameterHandler(参数处理器 );
3. ResultSetHandler(结果集处理器 );
4. Executor(执行器 );

(七) environments(环境集合属性对象)
  MyBatis 可以配置多种环境。但每个数据库对应一个 SqlSessionFactory。

  1. environment(环境子属性对象)


	
	

  1. transactionManager(事务管理)


  1. dataSource(数据源)


	
	
	
	

将这三个合一块就是:



	
		
		
		
		
			
			
			
			
		
	

(八)mappers(映射器)
  Mappers 标签是用来加载映射文件的,可通过下列四种方式加载映射文件
(1)通过resource加载单个mapper



(2)通过使用完全限定路径



(3)通过mapper接口加载单个mapper



(4)批量加载mapper(推荐使用)



二、Mapper.xml

  映射文件 Mapper.xml 是 Mybatis 的核心,映射文件中需要定义操作数据库的SQL语句,每个SQL就是一个statement。

1. insert、update、delete

  三个的属性差不多,意思也一样。下面以insert为例。在实际使用过程中并不需要都进行配置,可根据自己的需要删除部分配置项。


      
      id="addUser"
      
      
      
      parameterType="user"
      
      
      
      flushCache="true"
      
      
      
      statementType="PREPARED"
      
      
      
      keyProperty=""
      
      
      
      keyColumn=""
      
      
      
      useGeneratedKeys="false"
     
      
      timeout="20" >
	   
	   
		   SELECT LAST_INSERT_ID()
	   
	   INSERT INTO USER(USERNAME,SEX,BIRTHDAY,ADDRESS) VALUES(#{username},#{sex},#{birthday},#{address})

在insert时,如果数据库的主键不能自增,可以使用下面的配置来实现相同的功能:


         
       
             select SEQ_USER_ID.nextval as id from dual
       
          INSERT INTO USER(ID,USERNAME,SEX,BIRTHDAY,ADDRESS) VALUES(#{id},#{username},#{sex},#{birthday},#{address})

2. select

  在实际使用过程中并不需要都进行配置,可根据自己的需要删除部分配置项。


3. resultType 和 resultMap

  在实际使用过程中并不需要都进行配置,可根据自己的需要删除部分配置项。
  使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
  如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
  只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。


  如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。步骤:
1、定义resultMap
2、使用resultMap作为statement的输出映射类型



	
	
	
	
	
	




  使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。

4. resultType 和 resultMap 的区别

  resultType:实现简单,查询出来的列名不包含在POJO中需增加列名对应的属性才能完成映射。如果没有查询结果的特殊要求建议使用resultType。
  resultMap:需单独定义resultMap,实现麻烦,但如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
  resultMap可实现延迟加载,而 resultType无法实现。

[1] Mybatis中Mapper映射文件详解 https://blog.csdn.net/majinggogogo/article/details/72123185

你可能感兴趣的:(#,Mybatis,➤,框架技术)