mybatis的配置一

来源:互联网 发布:人工智能在高校的开展 编辑:程序博客网 时间:2024/06/05 06:56

    前面学习了mybatis的组成和基本的用法,下面学习下mybatis的配置。mybatis的配置文件对整个mybatis体系结构产生深远的影响,需要认真学习下,下面看看mybatis的层次结构。注意这些层次结构是不能够颠倒顺序的,如果颠倒了顺序,mybatis在解析xml文件的时候就会出现异常,mybatis的层次结构如下所示:

<?xml version="1.0" encoding="UTF-8"?><configuration><!-- 配置 --><properties/><!-- 属性 --><settings/><!-- 设置 --><typeAliases/><!-- 类型别名 --><typeHandlers/><!-- 类型处理器 --><objectFactory/><!-- 对象工厂 --><plugins/><!-- 插件 --><enviroments><!-- 配置环境 -->  <enviroment><!-- 环境变量 -->    <transactionManager/><!-- 事务管理器 -->    <dataSource/><!-- 数据源 -->  </enviroment></enviroments><databaseIdProvider/><!-- 数据库厂商标识 --><mappers/><!-- 映射器 --></configuration>

    上面就是mybatis全部的配置元素,需要了解它们具体的配置方法和使用方法,才能知道mybatis有什么用,它们的功能是什么。


一:properties元素

      properties是一个配置属性的元素,让我们能在配置文件的上下文中使用它。

      mybatis提供了3钟配置方式:

      1)property子元素

      2)properties配置文件

      3)程序参数传递

      1,proerty子元素

     在mybatis-config下面进行property的配置,配置代码如下所示:

   

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

  上配置好了我们就可以在上下文中使用已经配置好的属性值了,下面是使用上面的配置的代码:

<!-- 配置数据库连接信息 -->      <dataSource type="POOLED">        <property name="driver" value="${driver}"/>        <property name="url" value="${url}"/>        <property name="username" value="${username}"/>        <property name="password" value="${password}"/>      </dataSource>

   完整的mybatis的配置代码如下所示:

<?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><property name="driver" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/mybatis" /><property name="username" value="root" /><property name="password" value="root" /></properties><!-- 定义类的别名 --><typeAliases><typeAlias type="org.mybatis.pojo.Role" alias="role"/></typeAliases><!-- 定义数据库信息,默认使用development数据库构建环境 -->  <environments default="development">    <environment id="development">    <!--采用jdbc事务管理  -->      <transactionManager type="JDBC">      <property name="autoCommit" value="false"/>      </transactionManager>      <!-- 配置数据库连接信息 -->      <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="org/mybatis/mapper/RoleMapper.xml"/>  </mappers></configuration>

  2,proerties配置文件

      注:新创建了一个web项目,代码结构基本和前面的项目一样,但是运行mybatis不打印日志,查找资料发现需要加:

<settings><setting name="logImpl" value="LOG4J" /></settings>

   这是参考地址:http://blog.csdn.net/boss_kun/article/details/51874342

  更多的时候,我们希望使用properties配置文件来配置属性值,以便在多个配置文件中复用,也便于日后的维护和修改,这些在mybatis中很容易做到,我们先看下properties文件的代码,文件名为database.properties,如下所示:

#数据库配置文件driver=com.mysql.jdbc.Driverurl=jdbc\:mysql\://localhost\:3306/mybatisusername=rootpassword=root

 然后在mybatis-config.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="org/mybatis/config/database.properties"/> <settings><setting name="logImpl" value="LOG4J" /></settings> <!-- 定义类的别名 --><typeAliases><typeAlias type="org.mybatis.pojo.Role" alias="role" /></typeAliases><!-- 定义数据库信息,默认使用development数据库构建环境 --><environments default="development"><environment id="development"><!--采用jdbc事务管理 --><transactionManager type="JDBC"><property name="autoCommit" value="false" /></transactionManager><!-- 配置数据库连接信息 --><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="org/mybatis/mapper/RoleMapper.xml" /></mappers></configuration>

   主要改动的地方是上面红色标志的地方。

    3,程序参数传递

   在实际的工作中,系统是运维人员去配置的,生产数据库的用户密码对开发者而言是保密的,而且为了安全,运维人员要求对配置文件中的数据库密码进行加密,这样我们的配置文件往往配置的是加密过后的数据库信息,而无法通过加密的字符串去连接数据库,这个时候我们通过编码的形式来满足我们遇到的场景。

   下面假设database.properties文件中的username和password两个属性使用了加密的字符串,这个时候我们需要在生成SqlSessionFactory之前将它转换为明文,而系统已经提供了解密的方法decode(str),下面来看看如果使用代码的方式来完成SqlSessionFactory的创建,代码如下所示:

package org.mybatis.util;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Reader;import java.util.Properties;import java.util.logging.Level;import java.util.logging.Logger;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;/*我们希望SqlSessionFactory对于一个数据库而言只有一个实例,所以我们采用单例模式 * 这里构建单例是通过initSqlSessionFactory方法实现的。首先将构造函数私有化,其目的是避免使用者使用new的方式去创建多个对象。 * 然后使用synchronized 对SqlSessionFactoryUtil类加锁,其目的是避免在多线程的环境中,多次初始化造成对象的不唯一。 * 使用单例的好处在于可以重复使用这个唯一的对象,而对象在内存中读取和运行都比较快,同时节约内存。 *  * 还实现了openSqlSession方法,利用构建好的SqlSessionFactory创建SqlSession *  * *///SqlSessionFactory工具类,用来获取SqlSessionFactorypublic class SqlSessionFactoryUtil2 {// SqlSessionFactory对象private static SqlSessionFactory sqlSessionFactory = null;// 类线程锁private static final Class CLASS_LOCK = SqlSessionFactoryUtil2.class;// 私有话构造函数private SqlSessionFactoryUtil2() {}// 构建SqlSessionFactorypublic static SqlSessionFactory initSqlSessionFactory() {// mybatis配置文件路径String resource = "org/mybatis/config/mybatis-config.xml";// 输入流,读取mybatis的配置文件InputStream inputStream = null;Reader mtsReader = null;// 读取mybatis的ReaderInputStream proStream = null;// 读取数据库配置属性文件的输入流database.propertiesReader proReader = null;Properties properties = null;try {// 获取mybatis配置文件的输入流inputStream = Resources.getResourceAsStream(resource);mtsReader = new InputStreamReader(inputStream);// 读取数据库配置的属性文件proStream = Resources.getResourceAsStream("org/mybatis/config/database.properties");proReader = new InputStreamReader(proStream);// 创建属性对象properties = new Properties();properties.load(proReader);// 加载数据库配置信息到属性对象中// 解密为明文properties.setProperty("username", decode(properties.getProperty("username")));// 假设存在解密函数decodeproperties.setProperty("password", decode(properties.getProperty("password")));// 假设存在解密函数decode} catch (IOException e) {// TODO Auto-generated catch block// e.printStackTrace();Logger.getLogger(SqlSessionFactoryUtil2.class.getName()).log(Level.SEVERE, null, e);}synchronized (CLASS_LOCK) {if (sqlSessionFactory == null) {// 使用属性来创建sqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(mtsReader, properties);}}// 返回return sqlSessionFactory;}// 打开SqlSessionpublic static SqlSession openSqlSession() {if (sqlSessionFactory == null) {initSqlSessionFactory();}return sqlSessionFactory.openSession();}}

   这样就完全可以在database.properties配置密文,满足对系统安全的要求

   属性配置总结:mybatis支持3种方式配置属性,并且属性还会重复配置。这三种方式是存在优先级的,mybatis按照下面的顺序来加载:

   1)在proerties元素体内指定的属性首先被读取

   2)根据properties元素中的resource属性读取类路径下的属性文件,或者根据url属性指定的路径读取属性文件,并覆盖已读取的同名属性。

   3)读取作为方法参数传递的属性,并覆盖已读取的同名属性

    因此通过方法参数传递的属性具有最高优先级,resource/url属性中指定的配置文件次之,最低优先级的是properties属性中指定的属性。因此平时运用的时候注意:不要使用混合的方式,这会使得管理很混乱;首选的方式是properties文件的方式;如果需要对其进行加密解密的特殊要求,就使用参数的方式。


 二:设置

     设置(settings)在mybatis中是最复杂的配置,同时也是最为重要的配置内容,它会改变mybatis运行时的行为,即使不配置settings,mybatis也可以正常的工作,不过了解settings的配置内容,以及它们的作用仍然重要。下面简单的说几个配置属性:

    cacheEnabled  :该配置影响所有映射器中配置的缓存全局开关

    lazyLoadingEnabled : 延迟加载的全局开关

   useGenerateKeys :允许jdbc支持自动生成主键,需要驱动兼容。如果设置为true,则这个设置强制使用自动生成主键,尽管一些驱动不兼容但仍然可以正常工作。

    设置还有很多,需要话在进行网上查找资料,看文档就不细说了。


  三 :别名

     别名(typeAliases)是一个指代的名称。因为有时候我们遇到的类名的全限定名过长,所以希望用一个简短的名称去指代它,而这个名称可以在mybatis上下文中使用。别名在mybatis里面分为系统定义别买和自定义别名两类。注意:在mybatis中别名是不分大小写的。一个typeAliases的实例是在解析配置文件时生成的,然后长期保存在Configuration对象中,当我们使用它时,在把他拿出来,这样就没必要运行时再次生成它的实例。

     1,系统定义别名

      mybatis系统定义了一些常用类型的别名,比如数值,字符串,日期,集合等,在mybatis中可以直接使用。支持数组类型的只要加“[]”即可,比如Date数组别名可以用date[]代替。

    在mybatis的源码中:org.apache.ibatis.type.TypeAliasRegistry中可以看出自定义注册的信息,代码清单如下:

public TypeAliasRegistry() {    registerAlias("string", String.class);    registerAlias("byte", Byte.class);    registerAlias("long", Long.class);    registerAlias("short", Short.class);    registerAlias("int", Integer.class);    registerAlias("integer", Integer.class);    registerAlias("double", Double.class);    registerAlias("float", Float.class);    registerAlias("boolean", Boolean.class);    registerAlias("byte[]", Byte[].class);    registerAlias("long[]", Long[].class);    registerAlias("short[]", Short[].class);    registerAlias("int[]", Integer[].class);    registerAlias("integer[]", Integer[].class);    registerAlias("double[]", Double[].class);    registerAlias("float[]", Float[].class);    registerAlias("boolean[]", Boolean[].class);    registerAlias("_byte", byte.class);    registerAlias("_long", long.class);    registerAlias("_short", short.class);    registerAlias("_int", int.class);    registerAlias("_integer", int.class);    registerAlias("_double", double.class);    registerAlias("_float", float.class);    registerAlias("_boolean", boolean.class);    registerAlias("_byte[]", byte[].class);    registerAlias("_long[]", long[].class);    registerAlias("_short[]", short[].class);    registerAlias("_int[]", int[].class);    registerAlias("_integer[]", int[].class);    registerAlias("_double[]", double[].class);    registerAlias("_float[]", float[].class);    registerAlias("_boolean[]", boolean[].class);    registerAlias("date", Date.class);    registerAlias("decimal", BigDecimal.class);    registerAlias("bigdecimal", BigDecimal.class);    registerAlias("biginteger", BigInteger.class);    registerAlias("object", Object.class);    registerAlias("date[]", Date[].class);    registerAlias("decimal[]", BigDecimal[].class);    registerAlias("bigdecimal[]", BigDecimal[].class);    registerAlias("biginteger[]", BigInteger[].class);    registerAlias("object[]", Object[].class);    registerAlias("map", Map.class);    registerAlias("hashmap", HashMap.class);    registerAlias("list", List.class);    registerAlias("arraylist", ArrayList.class);    registerAlias("collection", Collection.class);    registerAlias("iterator", Iterator.class);    registerAlias("ResultSet", ResultSet.class);  }

   上面的就是mybatis系统定义的别名,我们无需重复注册它们就可以直接使用。


    2,自定义别名

    系统所定义的别名往往是不够的,因为不同的应用有着不同的需要,所以mybatis允许自定义别名,之前就给Role类注册了别名,下面是使用typeAliases配置别名,实例如下:

<!-- 定义类的别名 --><typeAliases><typeAlias type="org.mybatis.pojo.Role" alias="role" /></typeAliases>

    这样我们就可以在mybatis的上下文中使用“role”来代替其全路径了,减少配置的复杂度。

    如果POJO过多的时候,配置也是非常多的。比如我们可能面对的不单单是角色role,还有用户user,单位company,和部门department等信息,大的系统信息量巨大,所以这样的配置会大大增加工作量。mybatis考虑到这样的场景了,因此允许我们通过自动扫描的形式自定义别名,代码清单入下所示:

<!-- 定义类的别名 --><typeAliases><package name="org.mybatis.pojo"/></typeAliases>

    我们需要自己定义别名,它是使用注解@Alias,这里我们定义角色的别名为role,

package org.mybatis.pojo;import org.apache.ibatis.type.Alias;@Alias("role")public class Role {private Long id;private String roleName;private String note;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getRoleName() {return roleName;}public void setRoleName(String roleName) {this.roleName = roleName;}public String getNote() {return note;}public void setNote(String note) {this.note = note;}}

    当配合上面的配置,mybatis就会自动扫描包,将扫描到的类转载到上下文中,以便将来使用。这样就算多个pojo也可以通过包扫描的方式装载到mybatis的上下文中。

     当然配置了包扫描的路径,而没有注解@Alias的mybatis也会装载,只是说它将把你的类名的第一个字母变为小写,作为mybatis的别名,要注意避免出现重名的场景,建议使用部分包名加类名的限定。

























0 1