zoukankan      html  css  js  c++  java
  • mybatis 学习二 conf xml 配置信息

    xml映射配置文件

         这个xml文件主要包括一下节点信息
         * properties 属性
         * settings 设置
         * typeAliases 类型命名
         * typeHandlers 类型处理器
         * objectFactory 对象工厂
         * plugins 插件
         * environments 环境
              * environment 环境变量
                   * transactionManager 事务管理器
                   * dataSource 数据源
         * databaseIdProvider 数据库厂商标识
         * mappers 映射器

    1,properties 属性

         这个标签可以实现一处设置,多处使用,指定一个资源文件路径后,既可以直接使用文件里配置的信息,同时还可以在这个标签里自己定义属性。例如
         <properties resource="properties/db.properties">
              <property name="driver" value="xxxxxxxxx"/>
         </properties>
    使用的时候
          <property name="password" value="${password}" />
    注意资源配置文件里的key如果和标签设置的key相同了,以资源配置文件里的为准。

    2,settings 设置

         这个设置 会改变 MyBatis 的运行时行为,类似这样设置,
        <setting name="cacheEnabled" value="true"/>
     
        <settings>
                <!-- 默认true 二级缓存是否可以开启,true代表可以开启,需要开启的话就在mapperxml里面增加cache标签即可开启,如果不加,那么那个mapper就不开启 -->
                  <setting name="cacheEnabled" value="true"/>
                  <!--默认false 懒加载开关,如果true那么如果一个所有关联的对象都会延迟加载,用到的时候才去加载,如果false,那么就直接查询出来了 但是注意开启的时候吧cgligjar包给弄过来-->
                  <setting name="lazyLoadingEnabled" value="true"/>
                  <!-- 默认true 有懒加载属性的加载方式,比如class类中有student,teacher两个对象属性,并且class开启懒加载,如果这个为true的话,当我只使用student对象的时候,整个class类都会
                  被加载出来,但是这个为false的话,就只会架子啊student对象,teacher对象不加载 -->
                  <setting name="aggressiveLazyLoading" value="false"/>
        </settings>

     

    3,typeAliases 类型命名

         就是给类设置别名,这样在sql配置文件中就不用写全路径了,也支持直接配置一个包名的方式,例如
     
    <typeAliases>
            <package name="com.cn.liubb"/>
    </typeAliases>
    
    <typeAliases>
        <typeAlias alias="Author" type="domain.blog.Author"/>
    </typeAliases>

    并且mybatis已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理。比如 string》String之类的

     

    4,typeHandlers 类型处理器

    类型处理器,就是将db里的字段类型自动转换成java类型,这个也可以自己定义一个,具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 然后可以选择性地将它映射到一个 JDBC 类型。
    public class BooleanHandler implements TypeHandler<Boolean> {
    
        @Override
        public void setParameter(PreparedStatement ps, int i, Boolean parameter,
                JdbcType jdbcType) throws SQLException {
            if(parameter){
                ps.setString(i, "Y");
            }else{
                ps.setString(i, "N");
            }
        }
        @Override
        public Boolean getResult(ResultSet rs, String columnName)
                throws SQLException {
            String a = rs.getString(columnName);
            return "Y".equals(a)?true:false;
        }
    
        @Override
        public Boolean getResult(ResultSet rs, int columnIndex) throws SQLException {
            
            return "Y".equals(rs.getString(columnIndex))?true:false;
        }
    
        @Override
        public Boolean getResult(CallableStatement cs, int columnIndex)
                throws SQLException {
            return "Y".equals(cs.getString(columnIndex))?true:false;
        }
    }

    将每个方法里面多做一层转换即可实现自己要的类型。

    需要在confxml中注册
        <typeHandlers>
              <typeHandler handler="com.cn.liubb.BooleanHandler" jdbcType="VARCHAR"  javaType="boolean"/>
        </typeHandlers>

    并且需要在mapperxml里指定一下才行

        <resultMap type="User" id="usermap">
            <result column="id" property="id"/>
            <result column="name" property="name"/>
            <result column="age" property="age"/>
            <result column="hiredate" property="hiredate"/>
            <result column="flag" property="flag" typeHandler="com.cn.liubb.BooleanHandler"/>
        </resultMap>
        <select id="getAllUsers" resultMap="usermap">
            select * from users
        </select>

    5,对象工厂

    每一次MyBatis创建一个结果对象的实例,都是用ObjectFactory来实现的。默认的对象工厂(我把ObjectFactory称为对象工厂)做的很少,只是通过类的默认构造方法来实例化类,或者通过一个有参构造方法如果参数映射存在。如果想要覆盖默认的对象工厂,你可以创建自己的类。

    6,插件

          Mybatis采用责任链模式,通过动态代理组织多个拦截器(插件),通过这些拦截器可以改变Mybatis的默认行为(诸如SQL重写之类的),由于插件会深入到Mybatis的核心,因此在编写自己的插件前最好了解下它的原理,以便写出安全高效的插件。

    7,环境

         在这个标签里主要配置db连接信息
         
        <!-- 环境里可以配置多个db信息,这里有个默认的即可 -->
        <environments default="development">
        
        <!-- 每一个配置的环境都有一个id 这个id在创建session工厂的时候会用到  sqlSessionFactoryBuilder.build(reader, environment);-->
            <environment id="development">
    
                <!-- 配置数据库连接信息 JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
    MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。
    默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为 -->
                <transactionManager type="JDBC" />
                
                <!-- 这里配置使用数据源的几种类型 UNPOOLED 不适用连接池,来一个链接一个用完了断掉一个,POOLED 使用连接池,JNDI 有的web容器自己可以配置数据源 这个和他对应id一样就行 -->
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}" />
                    <property name="username" value="${name}" />
                    <property name="password" value="${password}" />
                </dataSource>
            </environment>
            
            <environment id="product">
                <transactionManager type="JDBC" />
                <!-- 配置数据库连接信息 -->
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}" />
                    <property name="username" value="aaaa" />
                    <property name="password" value="aaaa" />
                </dataSource>
            </environment>
        </environments>

    使用的时候如下代码:

        
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
    
            SqlSessionFactory sessionFactory2 = new SqlSessionFactoryBuilder().build(is1,"product");

    8,mapper信息

          既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等
        <mappers>
            <mapper resource="mapperxml/userMapper.xml"/>
            <mapper resource="mapperxml/classMapper.xml"/>
            <mapper class="com.cn.liubb.UserMapperI"/>
        </mappers>
  • 相关阅读:
    org.json.JSONObject的optXXX方法
    android Fragment的数据传递
    android .9图片的制作
    android handler
    CSS中的!important属性用法
    JS中的prototype
    JavaScript 函数创建思想
    css笔记
    Frameset使用教程
    HDU 5536 Chip Factory 【01字典树删除】
  • 原文地址:https://www.cnblogs.com/liouwei4083/p/6020637.html
Copyright © 2011-2022 走看看