Mybatis学习笔记 - - MyBatis配置

目录

Hibernate & Mybatis

Mybatis 核心组件

 SqlSessionFactory构建

SqlSession 创建

映射器

全局配置置


Hibernate & Mybatis

前一段时间算是接触了Hibernate,这是自己接触的第一个ORM模型,学习的过程中了解到Hibernate是一个持久层的框架,其主要的功用就是封装JDBC来访问数据库,使用过它之后是真的感受到了其带来的飞速体验,配置过的hibernate/cfg.xml可以重复使用,基本一次配置循环使用,即使是切换底层访问的数据库也只是改变一点配置信息。还有很多优点不一一赘述

当然它也不是完美的存在,它有着自己的弊端,众所周知hibernate只适合操作少量的数据,因为其对于SQL语句的性能优化很差,还有hibernate的事务管理,很损耗性能。大型互联网环境中,灵活、SQL优化,减少数据的传递是最基本的优化方法,Hibernate无法满足要求,而MyBatis提供了灵活、方便的方式,是一个半自动映射的框架。

MyBatis需要手工匹配提供POJO、SQL和映射关系,而全表映射的Hibernate只需要提供POJO和映射关系。MyBatis可以配置动态SQL,可以解决Hibernate的表名根据时间变化,不同的条件下列明不一样的问题。可以优化SQL,通过配置决定SQL映射规则,也能支持存储过程,对于一些复杂和需要优化性能的SQL的查询它更加方便。

Mybatis 核心组件

  • SqlSessionFactoryBuilder:会根据配置信息或代码来生成SqlSessionFactory;
  • SqlSessionFactory:依靠工厂来生成SqlSession;
  • SqlSession:是一个既可以发送SQL去执行并返回结果,也可以获取Mapper的接口;
  • SQL Mapper:是MyBatis新设计的组件,由一个Java接口和XML文件构成,需要给出对应的SQL和映射规则。它负责发送SQL去执行,并返回结果。

 SqlSessionFactory构建

看到SessionFactory相比会联想到什么,是的,如果接触过Hibernate那么一定会对这个组件有很深的印象,其扮演的角色相当于一个能执行各种数据库操作的管理员一般的存在。一切的一切都是起源于会话工厂,由其为中心发散。

Mybatis中的SqlSessionFactory这个组件也是异曲同工之妙,两种构建方式,其一是通过Java类调用,另一种则是XML配置,使用XML配置要更优,配置需要创建"mybatis-confih.xml"配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
	<properties resource="db.properties" />
	<!-- 配置别名 -->
	<typeAliases>
		<!-- <typeAlias alias="User" type="com.ozc.entity.User"/> -->
		<!-- 查找类时,默认到该包下找 -->
		<package name="com.zc.entity" />
	</typeAliases>
	<!-- 连接JDBC -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${username}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
	</environments>
	<!-- 映射文件配置 -->
	<mappers>
		<mapper resource="com/ozc/entity/UserMapper.xml" />
	</mappers>
</configuration>

 下面列出MyBatis配置XML文件的层次结构,这些层次是不能够颠倒顺序的。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <properties/>
    <settings/>
    <typeAliases/>
    <typeHandles/>
    <objectFactory/>
    <plugins/>
    <environments>
        <environment>
            <transanctionManager/> <!-- 配置事务管理器 -->
            <dataSource/> <!-- 配置数据源 -->
        </environment>
    </environments>
    <databaseIdProvider/> <!-- 数据库厂商标识 -->
    <mappers/> <!-- 映射器 -->
</configuration>

配置了基本配置,接着就是如何去在工程中去使用这个SqlSessionFactory了,创建一个类来读取XML配置以及获取SqlSession,具体实现如下。

SqlSession 创建

SqlSession是一个接口类,扮演者门面的作用,真正干活的是Executor接口。需要保证每次用完正常关闭它。

	public static SqlSessionFactory sf;
	static SqlSession sqlSession = null;
	static {
		// 加载mybatis配置文件
		try {
			String resource = "mybatis-config.xml";
			InputStream reader = Resources.getResourceAsStream(resource);
			// Reader reader = Resources.getResourceAsReader(resource);
			sf = new SqlSessionFactoryBuilder().build(reader);
		} catch (Exception e) {
			e.printStackTrace();
		}if(sqlSession!=null){
			sqlSession.close();
		}
	}

映射器

映射器的元素节点

映射器是由Java接口和XML文件(或注解)共同组成的,Java接口主要定义调用者接口,XML文件是配置映射器的核心文件,包括以下元素:

  • select 查询语句,可以自定义参数,返回结果集;
  • insert 插入语句,返回一个整数,表示插入的条数;
  • update 更新语句,返回一个整数,表示更新的条数;
  • delete 删除语句,返回一个整数,表示删除的条数;
  • sql 允许定义一部分SQL,然后再各个地方引用;
  • resultMap 用来描述从数据库结果集中来加载对象,还可以配置关联关系;
  • cache 给定命名空间的缓存配置;

元素节点中的配置项

这里主要说明几个语句操作的节点中的配置项,通过配置定义参数即可实现自动映射

 

  • paramterType:传入的参数类型,可以是基本类型、map、自定义的java bean;
  • resultType:返回的结果类型,可以是基本类型、自定义的java bean;
  • resultMap:它是最复杂的元素,可以配置映射规则、级联、typeHandler等,与ResultType不能同时存在;
  • flushCache:在调用SQL后,是否要求清空之前查询的本地缓存和二级缓存,主要用于更新缓存,默认为false;
  • useCache:启动二级缓存的开关,默认只会启动一级缓存;
  • timeout:设置超时参数,等超时的时候将抛出异常,单位为秒;
  • fetchSize:获取记录的总条数设定;
  • keyProperty:指定哪个列是主键,如果是联合主键可以用逗号隔开;
  • keyColumn:指定第几列是主键,不能和keyProperty共用;
  • useGeneratedKeys:是否使用自动增长,默认为false;

例如下面这个简单的查询语句

<select id="mm1" parameterType="User"  resultType="User">
	select * from t_user t
</select>

当useGeneratedKeys设为true时,在插入的时候,会回填Java Bean的id值,通过返回的对象可获取主键值。

如果想根据一些特殊关系设置主键的值,可以在insert标签内使用selectKey标签,比如:如果t_role没有记录,则需要设置为1,否则取最大id加2

<insert id="insertRole" useGeneratedKeys="true" keyProperty="id" >
    <selectKey keyProperty="id" resultType="int" order="before">
        select if(max(id) is null,1,max(id)+2) as newId from t_role
    </selectKey> 
</insert>

sql元素则是当多个语句操作节点中有很多相似的查询字段或者查询条件,则可以将这些共同点统一的配置在sql元素中,实现重用行。

<!-- 定义:-->
<sql id="role_columns">
    id,role_name,note
</sql>

<!-- 使用:-->
<include refid="role_columns">
    <property name="prefix" value="r" />
</include>

全局配置置

Mybatis中在XML配置中的全局配置中做一定的配置则可以影响到这个运行的行为。

  • cacheEnabled,全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为true;
  • lazyLoadingEnabled,延迟加载的全局开关,当开启时,所有关联对象都会延迟加载,特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态,默认为false;
  • aggressiveLazyLoading,当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载,3.4.1版本之前默认为true,3.4.1之后默认为false;
  • defaultStatementTimeout,设置超时时间,它决定驱动等待数据库响应的秒数;
  • mapUnderscoreToCamelCase,是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射,默认为false;
  • defaultEnumTypeHandler,指定 Enum 使用的默认 TypeHandler,默认为org.apache.ibatis.type.EnumTypeHandler;
  • returnInstanceForEmptyRow,当返回行的所有列都是空时,MyBatis默认返回null。 当开启这个设置时,MyBatis会返回一个空实例,默认为false;
  • localCacheScope,MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据,默认为SESSION;
  • logImpl,指定日志的具体实现,比如SLF4J|LOG4J|COMMONS_LOGGING等;

在XML有如下的配置方式,可根据实际情况去具体配置。

<settings> 
     //对在此配置文件下的所有cache 进行全局性开/关设置,默认true
     <setting name="cacheEnabled" value="true"/> 
     //全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载,默认true
     <setting name="lazyLoadingEnabled" value="true"/> 
     //允许和不允许单条语句返回多个数据集(取决于驱动需求)默认true
     <setting name="multipleResultSetsEnabled" value="true"/> 
     //使用列标签代替列名称,默认true
     <setting name="useColumnLabel" value="true"/> 
     //允许JDBC生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的、主键,有一些驱动器不兼容不过仍然可以执行,默认false
     <setting name="useGeneratedKeys" value="false"/>
     //配置和设定执行器,SIMPLE 执行器执行其它语句。REUSE 执行器可能重复使用prepared statements 语句,BATCH执行器可以重复执行语句和批量更新。默认为simple
     <setting name="defaultExecutorType" value="SIMPLE"/> 
     //设置一个时限,以决定让驱动器等待数据库回应的多长时间为超时
     <setting name="defaultStatementTimeout" value="25000"/> 
</settings>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值