Mybatis学习——Mybatis核心配置

MyBatis的核心配置

  在使用MyBatis框架时,设计两个核心的d对象:SqlSessionFactory和SqlSession.java

SqlsessionFactorymysql

  SqlSessionFactory是单个数据库映射关系通过编译后的内存镜像,其主要做用用来建立SqlSession对象,SqlSessionFactory实例对象是能够经过SqlSessionFactoryBulider对象来构建,而SqlSessionFactoryBulider对象能够经过XML文件或者Configuration实例来建立SqlSessionFactory实例,其代码以下:web

//1.读取配置文件
 String resource ="mybatis-config.xml";
InputStream inputStream
=Resources.getResourceAsStream(resource); //2.获取会话工厂对象 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

 

  注意:SqlSessionFactory对象是线性安全的,它一旦被建立,在整个应用程序间都会存在,若是咱们屡次的建立同一个SqlSessionFactory对象,那么数据库的资源很快就会被应用完,为了解决这个问题,一般,一个数据库是建一个SqlSessionFactory对象的。
spring

 

SqlSessionsql

  SqlSession对象是应用层和持久层之间进行数据库操做的一个单线程对象,其中主要做用是执行持久化操做,SqlSession对象中包含了全部执行数据库操做的方法,因为底层封装了JDBC的链接,因此能够直接使用SqlSession对象来执行已经映射的SQL语句。数据库

  注意:每个线程都应该有本身的SqlSession实例,而且该SqlSession实例是不可共享的,同时,SqlSession是线程不安全的,所以,其使用范围最好是在一个请求中,或者一个方法中,绝对不能将其放入一个类的静态字段中,实例字段或者任何类型的管理范围中,使用完SqlSession后,要及时的关闭它,一般能够将其放入finally块中关闭。apache

Sqlsession sqlSession=sqlSessionFactory.openSession(); try{ //执行操做
}finally{ //关闭sqlSession
 sqlSession.close(); }

 

 

使用工具类来建立SqlSession对象缓存

  因为每一个方法执行都须要获取配置文件,并根据配置文件的信息来构建SqlSessionFactory对象,而后建立SqlSession对象,这致使了大量重复的代码,为了简化开发,能够将重复的代码封装到一个工具类中,而后经过这个工具类来建立SqlSession安全

package com.itheima.util; /** * 工具类 * @author 12428 * */

import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.jdbc.Null; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MyBatisUtils { private static SqlSessionFactory sqlSessionFactory=null; //获取sqlSessionFactory对象
    static { try { //使用MyBatis提供的Resource类加载配置文件
            Reader reader =Resources.getResourceAsReader("mybatis-config.xml"); //构建SqlSessionFactory对象
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader); }catch(Exception e) { e.printStackTrace(); } } //获取SqlSession对象的静态方法
    public static SqlSession getSession() { return sqlSessionFactory.openSession(); } }

 

 

二.配置文件服务器

主要元素

  在MyBatis核心配置文件中,<configuration>元素是配置文件的根元素,其余的元素都要在其中配置,MyBatis的配置文件mybatis-config.xml中的主要元素以下:

 

        

 

 

   注意:<configuration>的子元素中必须按照由上到下的顺序进行配置,不然MyBatis在解析XML配置文件的时候会出错。

<properties>元素

  该元素是一个配置属性的元素,该元素一般是用于将内部的配置外在化,既经过外部的配置来动态的替换内部定义的属性。例如,数据库的来链接属性,就能够经过Java文件中配置文件来替换,具体以下:

1.在src下建立一个db.properties属性文件,内容以下:

jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/spring jdbc.username=root jdbc.password=abc

 

2.在MyBatis配置文件mybatis-config.xml中的configuration元素中配置子元素<properties>

<properties resource="db.properties"/> //映入外部配置文件

 

3.修改<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>

 

  完成了上面的配置后,dataSource中链接数据库的4个属性,就能够由db.properties文件中的对应的值来动态的替换。

  因为使用properties配置文件来配置属性值能够方便的在多个配置文件中使用这些属性,而且方便往后的维护和修改,因此在实际开发中,使用properties配置文件来配置属性值是最经常使用的方法。

 

 <typeHandler> 元素

  MyBatis在预处理语句(PrparedStatement)中设置了一个参数或者从结果集中取出一个值时,都会使用其框架内部的注册了的typeHandler(类型处理器)进行相关的处理,typeHandler是将预处理语句中传入的参数从javaType(java类型)装换为jdbcType(JDBC)类型,或者从数据库中取出结果时将jdbcType转换为javaType类型。MyBatis框架提供了一些默认的类型转换器,若是提供的类型转换器不能知足需求时,能够自定义类型转换器,自定义类型转换器能够经过实现TypeHandler接口或者继承BaseTypeHandle类来定义。

1.注册一个类的类型处理器:

<typeHandlers>
    <!--以单个类的形式来配置:handler属性是用指定在程序中自定义的类型处理器类--> <typeHandler handler="com.itheima.type.CustomtypeHandler"/> </typeHandlers>

 

2.注册一个包中的全部类型处理器:

<typeHandlers>
    <!--注册一个包中全部的typeHandler,系统会在启动时会自动扫描包下的全部文件-->
    <package name="com.itheima.type"/>
</typeHandlers>

 

 

<environments>元素

  在配置文件中,<environments>元素用于对环境进行配置。MyBatis的环境配置其实是数据源的配置,咱们能够经过<environments>元素来配置多种数据源。既配置多种数据库。

  使用该元素进行环境配置时的实例以下:

<!--由于一个environments元素中能够配置多个数据-库环境<environment>,default属性是指定使用哪一个数据库环境,该属性值是<environment>元素的id值->
<environments default="mysql">
<!-- 配置id为mysql的数据库环境 --> <environment id="mysql">
<!-- 使用JDBC的事务管理 --> <transactionManager type="JDBC"/> <!-- 数据库链接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/spring"/> <property name="username" value="root"/> <property name="password" value="abc"/> </dataSource> </environment> </environments>

 

  <environment>元素是<environments>的子元素,该元素能够有多个。在<environment>中包含了事务管理和数据源的配置信息,其中<teansactionManager>是用于配置事务管理,其中它的type属性是用于指定使用哪一种事务管理器;<dataSource>是用于配置数据源,其中的type属性是用于指定使用哪一种数据源。  

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

  (1)UNPOOLED:配置此数据源后,在每次被请求时会打开和关闭链接,此配置适用于对性能没有要求的简单应用程序是一个很好的选择。

  (2)POOLED:此数据源是利用”池“的概念将JDBC链接对象组织起来,避免了在建立新的实例时所须要初始化和认证的时间,这种方法使得并发web应用能够快速的响应,是当前流行的处理方法。

  (3)JNDI:此数据源是能够在EJB或者应用服务器上使用,(是从TOMCAT内部来获取一个内置的数据库链接池)

 

<mappers>元素

  在配置文件中,<mappers>元素是用来指定Mapper配置文件的位置,通常是使用以下四种方法引入:

  1.使用类路劲引入

<mappers>
    <mapper resource="com/itheima/mapper/UserMapper.xml"/>
</mappers>

  2.使用本地文件路劲引入

<mappers>
    <mapper url="file:///D:/com/itheima/mapper/UserMapper.xml"/>
</mappers>

  3.使用接口类来引入

<mappers>
    <mapper class="com.itheima.mapper.UserMapper"/>
</mappers>

  4.使用包名来引入文件

<mappers>
    <package name="com.itheima.mapper"/>
</mappers>

 

  

 三.映射文件

  映射文件是框架中的重要文件,能够说,此框架的强大之处就在于映射文件的编写上,

1.主要元素

  在映射文件中,<mapper>元素是映射文件的根元素,其余元素都是它的子元素,

   
   

  

 

2.<select>元素

  该元素是用于映射查询语句,它能够帮助咱们从数据库中读取出数据,并组装数据库给业务开发人员

  使用select元素执行查询操做很是简单,其示例以下

<select id="findCustomerById" parameterType="Integer" resultType="com.itheima.po.Customer"> select * from t_customer where id=#{id} </select>

  select元素的经常使用属性以下:

属性 说明
id 表示命名空间中的惟一标识符,常常和命名空间namespace一块儿使用,组合namespace一块儿使用后若是不惟一,就会抛出错误。
parameterType 该属性是表示传入sql参数类的全限定名或者别名,它是一个可选属性。
resultType 该属性是表示从sql语句中返回结果的类型的全限定名或者别名,若是是集合类型,那么返回的应该是集合里能够包含的类型,而不是集合自己。
resultMap 该属性是表示外部resultMap的命名引用,返回时可使用resultMap或者resultType
flushCache 表示在调用SQL语句后,是否清除缓以前查询的本地缓存和二级缓存,默认时false
useCache 用于控制二级缓存的开启和关闭,其值为布尔型,默认为true,表示将查询结果放在二级缓存里
timeout 用于设置超时参数,单位为秒,超时时将抛出异常
fetchSize 获取记录的总条数设置,其默认值是unset(依赖于驱动)
statementType 用于设置MyBatis使用哪一个JDBC的Statement工做。
resultSetType 表示结果集的类型

 

3<insert>元素

  insert元素是用于映射插入语句,在执行完元素中定义的SQL语句后,就会返回一个表示插入记录数的整数,insert元素的配置实例以下

<insert id="addCustomer" parameterType="com.itheima.po.Customer" flushCache="true" statmentType="PREPARED" keyProperty="" keyColumn="" useGeneratedKeys="" timeout="20">
</insert>

  insert元素的属性大部分和select相同,可是它由三个特定是属性,这三个属性以下:

  

属性 说明
keyProperty (仅对insert和update有用)此属性的做用是将插入或者更新操做时的返回值赋给PO类的某个属性,一般会设置为主键对应的属性,若是须要设置联合主键,能够在多个值之间用逗号分开
keyColumn (仅对insert和update有用)此属性的做用是用于设置第几行是主键,当主键列不是表中的第一列是,是须要设置这个属性,在须要使用主键联合时,值可使用逗号分开
useGeneratedKeys (仅对insert和update有用)此属性会使MyBatis使用JDBC的getGeneratedKeys()方法来获取由数据库内部产生的主键,如MYSql和sql Server等自动生成的主键

 

  执行查询操做后,不少时候咱们须要返回插入成功的数据生成的主键,此时就能够经过上面所讲解的3个属性来实现。

  当使用的数据库支持自动增加时,咱们能够经过keyproperty属性来指定PO类的某个属性接受主键的返回值,同时设置useGeneratedKeys的属性值为true,其使用以下:

<insert id="addCustomer" parameterType="com.itheima.po.Customer" keyProperty="id" useGeneratedKeys="true"> insert into t_customer(username,jobs,phone) values(#{username},#{jobs},#{phone}) </insert>

   使用以上的配置后执行插入操做后,就会返回插入成功的行数,以及插入行的主键值,为了验证配置,可使用以下代码测试:

@Test public void addCustomer(){ //获取SqlSession对象
    SqlSession sqlSession=MyBatisUtis.getSession(); Customer customer=new Customer(); customer.setUsername("rose"); customer.setJobs("student"); customer.setPhone("11111111"); int rows=sqlSession.insert("som.itheima.mapper.CustomerMapper.addCustomer",customer); //输出插入数据的主键
 System.out.println(customer.getId()); if(rows>0){ system.out.println("您成功插入了"+rows+"行数据!"); }else{ system.out.println("插入失败!"); } //执行提价事务
 sqlSession.commit(); //关闭资源
 sqlSession.close(); }

  当数据库不能够支持自动增加时,如Oracle,或者自动增加的数据库取消了自动增加的规则时,可使用MyBatis提供的另外一种方法来自定义生成主键,具体配置以下:

<insert id="addCustomer" parameterType="com.itheima.po.Customer" >
    <selectKey keyProperty="id" resultType="Integer" order="BEFORE"> select if(max(id) is null,1, max(id)+1) as newId from t_customer </selectKey> insert into t_customer(id,username,jobs,phone) values(#{id},#{username},#{jobs},#{phone}) </insert>

 

  在执行上面代码时,会先执行<selectKey>中的语句,他会经过自定义的语句来设置主键的值,若是t_customer表中的没有记录,就将id的值设置为1,若是有id值,就将id值加上1,做为新的主键,而后在调用插入语句。

  selectKey能够设置的属性以下:

<selectKey keyProperty="id" resultType="Integer" order="BEFORE" statmentType="PREPARED">
</selectKey>

 

 

  order属性能够被设置为BEFORE或者AFTER,若是设置为BREFORE,那么它会先执行<selectKey>中的配置来设置主键,而后执行插入语句,若是设置为AFTER,那么它会先执行插入语句,而后再执行<selectKey>中的配置内容。

 

4.<update>和<delete>元素

  这两个元素的执行很是简单,它们的配置也基本相同,与<insert>元素同样,这里两个元素在执行后,也会返回一个表示影响记录条数的整数。

 

5.<sql>元素

  <sql>元素是用于定义可重用的SQL片断,而后在其余的语句中引用这一片代码,例如定义一个包含了id,username,jobs,phone字段的代码片断以下:

<sql id="customerColumns">id,username,jobs,phone</sql>

 

  引用此代码以下:

<select id="findCustomerById" parameterType="Integer" resultType="com.itheima.po.Customer"> select <include refid="customerColumns"/> from t_customer where id=#{id} </select>

  使用<include>元素的refid属性能够引用自定义的代码片断,refid属性值自定义代码段的id值。

 

6.<resultMap>元素

  该元素是用于配置查询返回的结果与JavaBean类之间的映射关系,是MyBatis中最强大的元素。它的主要做用是定义映射规则,级联的更新,以及定义类型转换器。

  <resultMap>元素包含了一些子元素,他的结构以下:

<!--resultMap元素的结构 -->
<resultMap type="" id="">
    <!--类在实例化时,用来注入结果到构造方法中-->
    <constructor>
        <idArg/>    <!--ID参数:标记结果做为Id-->
        <arg/>        <!--注入到构造方法中的一个普通结果-->
    </constructor>
    
    <id/>    <!--用来表示哪一个列示主键-->
    <result> <!--注入到字段或者JavaBean属性的普通结果--> 
    <association property=""/>  <!--用于一对一关联-->
    <collection property=""/>    <!--用于一对多关联-->
    <discriminator javaType="">
        <case value=""/>        <!--基于某些值的结果映射-->
    </discriminator>
</resultMap>

 

  该元素的type属性是表示须要映射的POJO,id属性是这个resultMap的惟一标识,它的子元素<constructor>用于配置构造方法,当一个POJO中未定义无参数的构造方法时,就可使用<constructor>配置。子元素<id>是用于表示哪一个键是主键,而<result>是用于表示普通POJO和数据表中普通列的映射关系,<association>和<collection>用于配置处理多表时的关联关系。而<discriminator>是用于处理一个单独的数据库查询返回不少不一样数据类型结果集的状况。

  在默认的状况下,MyBatis程序在运行时会自动的将查询到 的结果和须要返回的对象的属性进行匹配复制(须要表中的列和对象的属性名彻底一致。然而,在现实中,数据表中的列和须要返回的对象属性可能并非彻底同样,这时,就可使用该元素进行处理。

相关文章
相关标签/搜索