MyBatis核心配置(持续更新)

MyBatis的核心配置

MyBatis的核心对象

SqlSessionFactory

SqlSessionFactory是线程安全的,一旦被创建在整个应用执行期间都会存在。如果多次创建同一个数据库的SqlSessionFactory,那么此数据库的资源将很容易被耗尽。所以,通常每一个数据库都会只对应一个SqlSessionFactory,所以在构建SqlSessionFactory实例时,通常使用单例模式。

SqlSession

SqlSession是MyBatis框架中另一个重要的角色,他是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作,SqlSession对象包含了数据库中所有执行SQL操作的方法,由于其底层封装JDBC连接,所以可以直接使用其实例来执行已映射的SQL语句。

但同时SqlSession实例也是线程不安全的,因此其使用范围最好在一次请求或者一个方法中,绝不能将其放在一个类的静态字段、实例字段或者任何类型的管理范围中使用。使用完SqlSession对象之后,要及时地关闭,通常可以放在finally块中关闭。

SqlSession对象中包含了很多方法,其常用方法如下所示:

  • 查询方法:selectOne(String statement , Object parameter),selectOne(String statement );查询方法,parameter是查询所需的参数。使用该方法后,会返回执行SQL语句查询结果的泛型对象的集合。
常用方法作用
selectOne(String statement )/selectOne(String statement,Object parameter)查询方法,参数Statement是在配置文件中定义的元素的的id,parameter是查询所需的参数。使用该方法后,会返回执行SQL语句查询结果的一条泛型对象
List selectList(String Statement)/List selectList(String Statement,Object parameter)查询方法,和上面的差不多,但返回的结果是SQL语句查询的泛型对象的集合
void select (String statement,Object parameter,ResultHandler handler )查询方法。参数statement实在配置文件中定义的元素的id,parameter是查询所需的参数,ResultHandler对象用于处理查询返回的复杂结果集,通常是用于多表查询
int insert (String statement)/int insert (String statement,Object parameter)插入方法,使用该方法后,会返回SQL语句所影响的行数,parameter是插入所需的参数
int update (String statement )/int update (String statement,Object parameter)更新操作,使用该方法后,会返回执行SQL语句所影响的行数
int delete(String statement )/int delete(String statement,Object parameter)删除方法,使用后返回执行SQL语句所影响的行数
void commit()提交事务的方法
void close()关闭session对象
void rollback回滚事务
T getMapper(Class type)该方法会返回Mapper接口的代理对象,该对象关联了SqlSession对象
Connection getConnection获取JDBC数据库连接对象的方法

配置文件

主要元素

在MyBatis框架的核心配置文件中,元素是配置文件的根元素,其他元素都要在元素内配置

configuration
properties
settings
typeAliases
typeHandlers
objectFactory
plugins
environments
databaseIdProvider
mappers
environment
transaction
dataSource

的子元素必须按照上图中由上到下的顺序进行配置,否则在解析XML文件的时候会出错

properties元素

是一个配置属性的元素,该元素通常用于将内部的配置外在化,即通过外部的配置来动态的替换内部定义的属性

  1. 在项目的src目录下,添加一个全名为db.properties的配置文件,编辑后的代码如下所示。

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
    jdbc.username=root
    jdbc.password=root
    
  2. 在MyBatis配置文件mybatis-config.xml中配置元素,具体如下

    <properties resource="db.properties"/>
    
  3. 修改配置文件中数据库连接的信息,具体如下

    <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>
    

完成上述配置后,dataSource中连接数据库的4个属性(driver,url,username和password)值将会由db.properties文件中对应的值来动态替换。

settings元素

元素主要用于改变MyBatis运行时的行为,例如开启二级缓存、开启延迟加载等。虽然不配置元素,也可以正常运行MyBatis,但是熟悉的配置内容以及它们的作用还是十分必要的。

元素中的常见配置及配置如下所示

img

img

这些参数在设置的时候都遵循的方式

typeAliases元素

元素用于为配置文件中的Java类型设置一个简短的名字,即设置别名。别名的设置与XML配置相关,其使用的意义在于减少全限定类名的冗余。

使用元素配置别名的方法如下

<!-- 定义别名-->
<typeAliases>
    <typeAlias alias="user" type="com.itheima.po.user"/>
</typeAliases>

上述示例中,如果省略alias属性,MyBatis会默认将类名首字母小写后的名称作为别名

当POJO类过多时,还可以通过自动扫描包的形式自定义别名

<!-- 使用自动扫描包来定义别名-->
<typeAliases>
    <package name="com.itheima.po"/>
</typeAliases>

上述示例中,元素中的子元素中的name属性用于指定要被定义别名的包,MyBatis会将所有com.itheima.po包中的POJO类以首字母小写的非限定类名来作为它的别名。比如com.itheima.po.User的别名为user,com.itheima.po.Customer的别名为customer

需要注意的是,上述方式的别名只适用于没有使用注解的情况。如果程序中使用了注解,则别名为其注解的值。

@Alias(value="user")
public class user{
    ........
}

typeHandler元素

typeHandler的作用就是将预处理语句中传入的参数从java类型转换为jdbc类型,或者从数据库去除结果时将jdbc类型转换为java类型

<configuration>
    <typeHandlers>
      <!-- 
          当配置package的时候,mybatis会去配置的package扫描TypeHandler
          <package name="com.dy.demo"/>
       -->
      
      <!-- handler属性直接配置我们要指定的TypeHandler -->
      <typeHandler handler=""/>
      
      <!-- javaType 配置java类型,例如String, 如果配上javaType, 那么指定的typeHandler就只作用于指定的类型 -->
      <typeHandler javaType="" handler=""/>
      
      <!-- jdbcType 配置数据库基本数据类型,例如varchar, 如果配上jdbcType, 那么指定的typeHandler就只作用于指定的类型  -->
      <typeHandler jdbcType="" handler=""/>
      
      <!-- 也可两者都配置 -->
      <typeHandler javaType="" jdbcType="" handler=""/>
      
  </typeHandlers>
  
  ......
  
</configuration>

objectFactory元素

MyBatis框架每次创建结果对象的新实例时,都会使用一个对象工厂(ObjectFactory)的实例来完成

MyBatis默认的ObjectFactory的作用就是实例化目标类,它既可以通过默认构造方法来实例化,也可以在参数映射存在的时候通过参数构造方法来实例化。

在通常情况下,我们使用默认的ObjectFactory即可,MyBatis中默认的ObjectFactory大部分情况下都不用配置和修改,但如果想覆盖ObjectFactory的默认行为,则可以通过自定义ObjectFactory来实现,具体方式如下。

  1. 自定义一个对象工厂,自定义的对象工厂需要实现ObjectFactory接口,或者继承DefaultObjectFactory类。由于DefaultObjectFactory类已经实现了ObjectFactory接口,所以通继承DefaultObjectFactory类实现即可。

  2. 在配置文件中使用元素配置自定义的ObjectFactory,如下所示

    <objectFactory type="com.itheima.factory.MyObjectFactory">
        <property name="name" value ="MyObjectFactory"/>
    </objectFactory>
    

plugins元素

元素的作用就是配置用户所开发的插件。

environments元素

在配置文件中,元素用于对环境进行配置。MyBatis的环境配置实际上就是数据源的配置,我们可以通过元素配置多种数据源、即配置多种数据库。

使用元素进行环境配置的实例如下

<environments default="development">
    <environment id ="development">
        <!-- 使用JDBC事务管理-->
        <transactionManager type="JDBC"/>
        <!--配置数据源 -->
        <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>
    </environment>
</environments>

在上述示例代码中, 是环境配置的根元素,它包含一个default属性,该属性用于指定默认的环境。是元素的子元素,它可以定义多个,其属性用于表示所定义环境的ID值。在元素内,包含事务管理和数据源的配置信息,其中元素用于配置事务管理,它的type属性用于指定事务管理的方式,即使用哪种事务管理器;元素用于配置数据源,它的type属性用于指定使用哪种数据源

在MyBatis中。可以配置两种类型的事务管理器,分别是JDBC和MANAGED

  • JDBC: 此配置直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务的作用域
  • MANAGED: 此配置从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。在默认情况下,它会关闭连接,但一些容器并不希望这样,为此可以将closeConnection属性设置为false来阻止它默认的关闭行为。

对于数据源的配置,MyBatis框架提供了UNPOOLED、POOLED和JNDI三种数据源类型

  • UNPOOLED类型的数据源需要配置5种属性
属性说明
driverJDBC驱动的Java类的完全限定名
url数据库的url地址
username登录数据库的用户名
password登录数据库的密码
defaultTransactionlsolationLevel默认的连接事务隔离级别
  • POOLED

此数据源利用"池"的概念将JDBC连接对象组织起来,避免了在创建新的连接实例时所需要初始化和认证的时间。这种方式使得并发Web应用可以快速地相应请求。

  • JNDI

此数据源可以在EJB(Enterprise Java Beans)或应用服务器等容器种使用。容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。

配置JNDI数据源时,只需要配置两个属性

属性说明
initial_context此属性主要用于在IntialContext种寻找上下文,在忽略此属性时,data_source属性会直接从InitialContext中寻找
data_source此属性表示引用数据源实例位置的上下文的路径。如果提供了Initial_context配置,那么程序会在其返回的上下文中进行查找;如果没有提供,则直接在InitialContext中查找
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值