MyBatis学习二 MyBatis的配置文件详解

本文详细介绍了MyBatis全局配置文件及SQL映射配置文件的各项配置细节,包括属性配置、设置选项、类型别名、类型处理器等内容,并深入探讨了mapper映射文件的不同配置方式。

一.xml映射配置文件(全局配置文件)

1.XML 文档的高层级结构如下(再写配置文件的时候不能更改此顺序):

 configuration 配置
      properties 属性
      settings 设置

      typeAliases 类型命名
      typeHandlers 类型处理器
      objectFactory 对象工厂
      plugins 插件
      environments 环境
                   environment 环境变量
                   transactionManager 事务管理器
                   dataSource 数据源
       映射器

1.1properties 属性

properties的配置有三种方式:

第一种

<properties>
<property name="password" value="123456"/>
</properties>

第二种:在db,properties文件中配置,然后加载此资源

<properties resource="db.properties" >
</properties>

第三种

//编写Properties
		Properties properties = new Properties();
		properties.setProperty("password", "1234");
		//建立sqlsessionFactory
		SqlSessionFactory  sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream,properties);

如果三种都配置,那么加载顺序是:第一种——>第二种——>第三种

1.2settings 设置

settings配置会影响MyBatis的运行方式

<!-- 是否使用缓存 -->
<setting name="cacheEnabled" value="true"/>
<!--是否启用延迟加载  -->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="enhancementEnabled" value="false"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25000"/>
</settings>

1.3typeAliases

类型别名就是为java类型设置一个短的名称

<!-- 单个别名定义 -->
<typeAlias type="com.study.mybatis.Customer" alias="customer"/>
<!--
包别名定义:指定包名称为该包下的po类声明别名,默认别名就是类名(不区分大小写)
  -->
<package name="com.study.mybatis"/>
</typeAliases>

1.4typeHandlers

无论是 MyBatis 在预处理语句中设置一个参数,还是从结果集中取出一个值时,类型处理器被用来将获取的值以合适的方式转换成 Java 类型,如果我们想将获取的值按照自己的方式转换,那么就得自己写一个类型处理器.

重写TypeHandler 接口

1.5objectFactory

Mybatis每次创建一个新的结果对象实例时,它使用一个 ObjectFactory 实例来完成,我们可以重写该实例,以自己的方式创建

继承 ObjectFactory

1.6plugins

添加插件

1.7environments

environments可以配置我们的数据库连接池,事物管理等

<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC"></transactionManager>
    <!--配置数据源,采用mybatis连接池,使用POOLED方式  -->
    <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>

1.7.1transactionManager

在MyBatis中有两种事物管理,JDBC ,MANAGED

JDBC – 这个配置直接简单使用了 JDBC 的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围。
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期(比如 Spring 或 JEE 应用服务器的上下文)

1.7.2dataSsource

数据源的配置,有三种配置:

第一种:UNPOOLED – 这个数据源的实现是每次被请求时简单打开和关闭连接

第二种:POOLED – 这是 JDBC 连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间

第三种:JNDI – 这个数据源的实现是为了使用如 Spring 或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用

1.8Mappers

有四种种配置mapper映射文件路径的方式

第一种:<mapper resource=""/>  相对于类路径的资源

<mapper resource="OrdersExtMapper.xml"/>

第二种:<mapper url=""/>  使用完全限定路径

<mapperurl="file:///D:\workspace1\mybatis_01\config\sqlmap\User.xml"/>

第三种:<mapper class=""/> 使用接口的全限定名

<mapper class="cn.itcast.mybatis.mapper.UserMapper"/>

此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下;

第四种:<mapper package=""/> 指定包下的所有映射文件

<packagename="com.study.mybatis.mapper"/>

注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下



二.SqlMapper映射配置文件

结构如下:

cache - 配置给定命名空间的缓存。
cache-ref – 从其他命名空间引用缓存配置。
resultMap – 最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象。
parameterMap – 已经被废弃了!老式风格的参数映射。
sql – 可以重用的 SQL 块,也可以被其他语句引用。
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句

主要详解insert中的一些配置属性,update,delete,insert和select一样。sql片段,resultMap

1.select

1.1输入类型

输入类型有四种,简单类型,pojo类型,包装pojo类型,map类型,主要来看下map类型

map类型:

sqlMapper配置文件

<select id="findUserByHashMap" parameterType="java.util.Map" resultMap="userByMap">
SELECT * FROM t_customer WHERE id=#{id}
</select>

mapper接口:

  public Customer findUserByHashMap(Map<String, Object> hashmap) throws Exception;
  

测试代码:

@Test
	public void test6() throws Exception{
		
		 Map<String, Object> hash=new HashMap<String, Object>();
		 hash.put("id", 4);
		 
		String resource="SqlMapConfig.xml";
		//读取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//建立sqlsessionFactory
		SqlSessionFactory  sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
		//创建session
		SqlSession session=sqlSessionFactory.openSession();
		//调用session的增删改查
		CustomerMapper mapper = session.getMapper(CustomerMapper.class);
		//传入map类型的参数
	    System.out.println(mapper.findUserByHashMap(hash).getCname());
		//提交事物
		session.commit();
		session.close();
		
	}

1.2输出类型

1.2.1resultType

使用resultType映射的规范:

使用resultType进行结果映射时,需要查询出的列名和映射的对象的属性名一致,才能映射成功。

如果查询的列名和对象的属性名全部不一致,那么映射的对象为空。

如果查询的列名和对象的属性名有一个一致,那么映射的对象不为空,但是只有映射正确那一个属性才有值。

如果查询的sql的列名有别名,那么这个别名就是和属性映射的列名。


简单类型

使用简单类型规则:

查询的列必须是一列,才能映射为简单类型,比如,统计计数

po类

po类在MyBatis学习一中有概述


1.2.2resultMap

resultMap进行结果映射时,不需要其列名和属性名一致,但须声明一个resultMap,来对列名和属性名进行映射

resultMap配置:


<!-- 
id:专门为查询结果中唯一的映射
result:映射查询结果中的普通列
 -->
<resultMap type="com.study.mybatis.Customer" id="userByMap">
<id column="id" property="id"/>
<result column="cname" property="cname"/>
</resultMap>

<select id="findUserByHashMap" parameterType="java.util.Map" resultMap="userByMap">
SELECT * FROM t_customer WHERE id=#{id}
</select>

Customer类:

public class Customer {

	private Integer id;
	private String cname;

	public Integer getId() {
		return id;
	}

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

	public String getCname() {
		return cname;
	}

	public void setCname(String cname) {
		this.cname = cname;
	}
}

测试:

@Test
	public void test6() throws Exception{
		
		 Map<String, Object> hash=new HashMap<String, Object>();
		 hash.put("id", 4);
		 
		String resource="SqlMapConfig.xml";
		//读取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//建立sqlsessionFactory
		SqlSessionFactory  sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
		//创建session
		SqlSession session=sqlSessionFactory.openSession();
		//调用session的增删改查
		CustomerMapper mapper = session.getMapper(CustomerMapper.class);
		//传入map类型的参数
	    System.out.println(mapper.findUserByHashMap(hash).getCname());
		//提交事物
		session.commit();
		session.close();
		
	}

2.sql片段

Sql片段可以让代码有更高的可重用性

Sql片段需要先定义后使用

定义:

<sql id="sqlFindId">
SELECT * FROM t_customer WHERE =#{id}
</foreach>

调用:

<select id="findById" parameterType="int" resultType="customer">
<include refid="sqlFindId"></include>
</select>

3.动态sql

例:foreach

<!--  
collection:pojo集合中的属性名称
item:遍历出的结果声明结果名称
open:遍历开始时的连接符
close:遍历结束时的连接符
separator:分隔符
-->

<sql id="sqlForeach">
SELECT * FROM t_customer WHERE id IN
<foreach collection="idList" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</sql>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值