Mybatis之相关配置说明(三)

一、SqlMapConfig.xml

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。配置的内容和顺序如下:

properties (属性)
  property

settings(全局配置参数)
  setting

typeAliases (类型别名)
  typeAliase
  package

typeHandlers(类型处理器)

objectFactory(对象工厂)

plugins(插件)

environments(环境集合属性对象)
  environment(环境子属性对象)
     transactionManager(事务管理)
     dataSource(数据源)

databaseIdProvider(数据库厂商标识)

mappers (映射器)
  mapper
  package

1.properties属性

使用 properties 标签配置时,可以采用两种方式指定属性配置

第一种:直接在内部配置属性

  <properties>
        <property name="driver" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property>
        <property name="username" value="root"></property>
        <property name="password" value="123456"></property>
    </properties>

第二种:这些属性可以在外部进行配置,并可以进行动态替换.

在 classpath 下定义 db.properties 文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123456
properties 标签配置指定配置文件
方式一:
<properties resource="jdbcConfig.properties"></properties>

方式二
<properties url="file:///C:/Users/Root/Desktop/jdbcConfig.properties"></properties>
 dataSource 标签引用配置
<!--配置连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"></property>
                <property name="url" value="${jdbc.url}"></property>
                <property name="username" value="${jdbc.username}"></property>
                <property name="password" value="${jdbc.password}"></property>
            </dataSource>

2.settings(全局配置参数)

是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

<settings>
	<!--全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。-->
  <setting name="cacheEnabled" value="true"/>
  <!--延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。-->
  <setting name="lazyLoadingEnabled" value="true"/>
  <!--
  	一系列setting 配置
   <setting name="" value=""/>
    <setting name="" value=""/>
    .........
  -->
<settings>

3.typeAliases (类型别名)

Mybatis 支持默认别名,我们也可以采用自定义别名方式来开发。

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML配置,意在降低冗余的全限定类名书写。

  <!--使用typeAliases配置别名,只能配置实体类所在包中类的别名 -->
    <typeAliases>
        <!--typeAlias用于配置别名。
        type属性指定实体类全限定类名。
        alias属性指定别名,当指定了别名就不在区分大小写-->
        <typeAlias type="cn.ybzy.domain.User" alias="user"></typeAlias>

        <!-- 用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写-->
        <!--指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean-->
        <package name="cn.ybzy.domain"></package>
    </typeAliases>

每一个在包中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如domain.User的别名为 user;若有注解,则别名为其注解值。

@Alias("users")
public class User {
   
}

以下为常见的 Java 类型内建的类型别名。它们都不区分大小写。

为了应对原始类型的命名重复,采取了特殊的命名风格。

在这里插入图片描述
源码中对别名的定义:
在这里插入图片描述

4.typeHandlers(类型处理器)

MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。

默认的类型处理器
在这里插入图片描述

5.objectFactory(对象工厂)

每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。 如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。

6.plugins(插件)

MyBatis 允许在映射语句执行过程中的某一点进行拦截调用。

通过 MyBatis 提供的强大机制,使用插件是非常简单的,只需实Interceptor 接口,并指定想要拦截的方法签名即可。

7.environments(环境配置)

MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中。

尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。如果想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。

8.databaseIdProvider(数据库厂商)

MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis会加载带有匹配当前数据库 databaseId 属性和所有不带 databaseId 属性的语句。 如果同时找到带有 databaseId和不带 databaseId 的相同语句,则后者会被舍弃。

9.mappers(映射器)

使用定义 SQL 映射语句。告诉 MyBatis 到哪里去找到这些语句。

 <!-- 配置映射文件的位置 -->
    <mappers>
    	<!--使用相对于类路径的资源-->
    	<!-- 使用相对于类路径的资源引用 -->
        <mapper resource="cn/ybzy/dao/IUserDao.xml"></mapper>
        
        <!--使用接口类路径,要求 r mapper 接口名称和 r mapper 映射文件名称相同,且放在同一个目录中-->
        <!-- 使用映射器接口实现类的完全限定类名 -->
        <mapper class="cn.ybzy.dao.IUserDao"/>
        
        <!-- package标签是用于指定dao接口所在的包,当指定了之后就不需要在写mapper以及resource或者class了 -->
        <!--同样要求 mar pper 接口名称和 r mapper 映射文件名称相同,且放在同一个目录中-->
        <!-- 将包内的映射器接口实现全部注册为映射器 -->
        <package name="cn.ybzy.dao"></package>

		<!-- 使用完全限定资源定位符(URL) -->
		<mappers>
		  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
		</mappers>
    </mappers>

二、映射配置文件

1.parameterType配置参数类型

	属性:
		表示参数的类型,取值可以是基本类型,引用类型(String 类型)、实体类类型(POJO 类)、实体类的包装类。
		
		若传入的是一个类的对象,则类型就写类的全名称。
		
	注意点:
		基本类型和String可以直接写类型名称,也可以使用包名. 类名的方式 ,例如 :java.lang.String。
		
		实体类类型,只能使用全限定类名。 
		
		mybaits 在加载时已经把常用的数据类型注册了别名,从而在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。

2.resultType配置结果类型

指定结果集的类型,它支持基本类型和实体类类型

resultType和 parameterType 一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须
使用全限定类名。

当resultType是实体类名称时,要求实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装。

实体名称userName与数据库列名username能实现封装,因为mysql在windows 系统中不区分大小写,Linux中区分大小写就不行。

3.resultMap结果类型

resultMap 标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。

在 select 标签中使用 resultMap 属性指定引用即可。

同时 resultMap 可以实现将查询结果映射为复杂类型的 pojo,比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询。
type 属性:指定实体类的全限定类名
id 属性:给定一个唯一标识,是给查询 select 标签引用用的。

<resultMap type="cn.ybzy.domain.User" id="userMap">
	id 标签:用于指定主键字段
	result 标签:用于指定非主键字段
	column 属性:用于指定数据库列名
	property 属性:用于指定实体类属性名称
	<id column="id" property="userId"/>
	<result column="username" property="userName"/>
</resultMap>

4.sql 语句中使用#{}字符

	代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。具体的数据是由#{}里面的内容决定的。
	
#{}中内容的写法:
	例如保存方法的参数是 一个 User 对象,此处就要写 User 对象中的属性名称。用的是 ognl 表达式。

5.#{} 与${}的区别

#{} 表示一个占位符号

通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,

#{}可以有效防止 sql 注入。

#{}可以接收简单类型值或 pojo 属性值。
 
如果 parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称。

${} 表示拼接 sql 串

通过${}可以将 parameterType 传入的内容拼接在 sql中且不进行 jdbc 类型转换,

${}可以接收简单类型值或 pojo 属性值,
 
如果 parameterType 传输单个简单类型值,${}括号中只能是 value。

示例说明

select * from user where name = #{name};
select * from user where name = ${name};

其解析之后的结果均为
	select * from user where name = '小白';
但是#{} 和 ${} 在预编译中的处理是不一样的。

#{} 在预处理时,会把参数部分用一个占位符 ? 代替变成如下的sql语句:
	select * from user where name = ?;

而 ${} 则只是简单的字符串替换,在动态解析阶段,该 sql 语句会被解析成:
	select * from user where name = '小白';

反例说明

select * from ${tableName} where name = #{name}

如果tableName表名为: user; delete user; --  。则动态解析之后sql变成:select * from user; delete user; -- where name = ?;

--之后的语句被注释掉,而原本查询用户的语句变成了查询所有用户信息+删除用户表的语句

6.ognl 表达式

它是 apache 提供的一种表达式语言,全称是:Object Graphic Navigation Language 对象图导航语。	
	
它是按照一定的语法格式来获取数据的。语法格式就是使用 #{对象.对象}的方式。
	
#{user.username}它会先去找 user 对象,然后在 user 对象中找到 username 属性,并调用getUsername()方法把值取出来。
		
但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user,而直接写 username

三、Mybatis的连接池

Mybatis连接池提供了3种方式的配置,一般采用的是 POOLED 数据源 。在Mybatis的SqlMapConfig.xml 配置文件中,通过<dataSource type=”pooled”>来实现Mybatis中连接池的配置。

连接池分类

UNPOOLED 不使用连接池的数据源,采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。

POOLED 使用连接池的数据源,采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现

JNDI 使用 JNDI 实现的数据源,采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样。

使用POOLED
在这里插入图片描述
使用UNPOOLED
在这里插入图片描述

数据源的配置

MyBatis 在初始化时,会根据的 type 属性来创建相应类型的的数据源 DataSource。

type=”POOLED”:MyBatis 会创建 PooledDataSource 实例

type=”UNPOOLED” : MyBatis 会创建 UnpooledDataSource 实例

type=”JNDI”:MyBatis 会从 JNDI 服务上查找 DataSource 实例,然后返回使用
<dataSource type="POOLED">
	<property name="driver" value="${jdbc.driver}"/>
	<property name="url" value="${jdbc.url}"/>
	<property name="username" value="${jdbc.username}"/>
	<property name="password" value="${jdbc.password}"/>
</dataSource>

四、Mybatis的事务控制

在JDBC 中可以通过setAutoCommit()方法将事务的提交改为手动方式,Mybatis 框架因为是对 JDBC 的封装,所以 Mybatis 框架的事务控制方式,本身也是用 JDBC的setAutoCommit()方法来设置事务提交方式。

事务提交方式

因为setAutoCommit()方法,在执行时它的值被设置为 false 了, 所以在 CUD 操作中, 必须通过sqlSession.commit()方法来执行提交操作。

    public static void main(String[] args)throws Exception {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建 SqlSessionFactory 的构建者对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.使用构建者创建工厂对象 SqlSessionFactory
        SqlSessionFactory factory = builder.build(in);
        //4.使用工厂生产SqlSession对象
        SqlSession session = factory.openSession();
        //5.使用SqlSession创建Dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //6.使用代理对象执行方法
        userDao.deleteUser(2);
        //7.提交事务
        sqlSession.commit();
        //8.释放资源
        session.close();
        in.close();
    }

自动提交事务

因为在连接池中取出的连接,都会调用 connection.setAutoCommit(false)方法,所有就必须使用 sqlSession.commit()方法,相当于使用JDBC 中的 connection.commit()方法实现事务提交。factory.openSession(true),开启事务自动提交。

    public static void main(String[] args)throws Exception {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建 SqlSessionFactory 的构建者对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.使用构建者创建工厂对象 SqlSessionFactory
        SqlSessionFactory factory = builder.build(in);
        //4.使用工厂生产SqlSession对象
        SqlSession session = factory.openSession(true);
        //5.使用SqlSession创建Dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //6.使用代理对象执行方法
        userDao.deleteUser(2);
        //7.释放资源
        session.close();
        in.close();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeDevMaster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值