zoukankan      html  css  js  c++  java
  • mybatis配置

    一 前言

    这篇文章涵盖了大量的mybatis配置,读懂一篇,收益终身。

    二 properties配置

    之前发布的文章中配置数据库连接信息是直接写入到mybatis-config.xml;为了使用灵活方便,和动态修改配置,我们将配置内容提取到配置文件db.properties(放在resource目录下,也可自定义)中,然后在 配置文件中的<properties> 标签引入 db.properties 所在的位置,然后就可以在 配置文件中使用 ${key} 获得 db.properties 中对应 key 的 value; 为此以后修改配置文件仅修改外面的 db.properties 中内容即可;

    2.1 mybatis-config.xml

    配置文件修改内容如下, MyBatis 3.4.2 之后还支持 默认属性例如:${username:root} ,当配置文件中未定义该属性时会读取默认属性root,更多详细的属性配置看官网;

    	<!-- 引入resource目录下的配置文件 -->
        <properties resource="db.properties">
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </properties>
    
        <!-- 全局环境配置-->
        <environments default="development">
            <environment id="development">
                <!-- 事物 -->
                <transactionManager type="JDBC"/>
                <!-- 配置数据源 -->
                <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>
    

    2.2 db.properties

    属性文件内如如下;

    driver = com.mysql.jdbc.Driver
    username = root
    url = jdbc:mysql://192.168.0.100:3306/mybatis
    password = 123456
    

    三 typeAliases配置

    typeAliases也就是别名的意思,我们之前查询的结果有个 resultType 属性,每次返回时都要使用类的全限定名(例如:com.zszxz.config.entity.Student),这种配置方式比较繁琐,mybatis 可以通过配置别名的方式使用简单类名代替类的全限定名;

    3.1 配置方式一

    第一种配置比较繁琐,也就是你有多少个返回类型的实体类,就在 mybatis-config.xml 的属性 <typeAliases>中配置多少个类名的映射;

    mybatis-config.xml代码片段如下,需注意的标签的放置位置

        <typeAliases>
            <typeAlias type="com.zszxz.config.entity.Student" alias="student"></typeAlias>
        </typeAliases>
    

    mapper.xml 配置如下:

    	<!-- 查询学生-->
        <select id="getStudent" resultType="student">
            select * from student
        </select>
    

    3.2 配置方式二

    第二种配置方式就是使用包名配置,mybaits就会进行自动映射,我们在mapper.xml中就可以使用类的简单名称表示全类名,这种方式比较简洁,推荐使用;

    mybatis-config.xml代码片段如下

     <typeAliases>
            <package name="com.zszxz.config.entity"/>
     </typeAliases>
    
    

    mapper.xml 配置如下:

        <!-- 查询学生-->
        <select id="getStudent" resultType="student">
            select * from student
        </select>
    

    3.3 配置方式三

    第三种配置方式是使用注解配置,这种配置方式基于第二种的配置方式上,能够修改默认别名(默认是使用类的简单类名);在返回类型的实体上使用注解 @Alias可以指定别名;

    实体如下:

    /**
     * @Author lsc
     * @Description <p> </p>
     * @Date 2019/12/1 20:07
     */
    @Alias("stu")
    public class Student {
    
        // id
        private String id;
        // 学生姓名
        private String name;
        // 学生编号
        private String number;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getNumber() {
            return number;
        }
    
        public void setNumber(String number) {
            this.number = number;
        }
    }
    

    mapper.xml如下:

        <!-- 查询学生-->
        <select id="getStudent" resultType="stu">
            select * from student
        </select>
    

    3.4 mybatis内置别名

    mybatis 内置了多别名类型,即有些数据类型不需要配置别名也可以使用类的简单名称,比如java的8中基本数据类型和对应的包装类型,集合,迭代器,String类,大数值,日期等;

    四 setting 配置说明

    seetting 的配置 说明如下

    属性 说明 默认值
    cacheEnabled 开启全局缓存 false
    lazyLoadingEnabled 全局延迟加载,所有关联对象都会延迟加载;特定的关联可以使用fetchType属性配置 false
    aggressiveLazyLoading 开启后,无论调用何种方法加载对象,都会加载该对象的所有属性,否则按需加载 false
    multipleResultSetsEnabled 是否允许单一语句返回多结果集(需要驱动支持) teue
    useColumnLabel 使用列标签代替列名 false
    useGeneratedKeys 允许 JDBC 支持自动生成主键,需要驱动支持 false
    autoMappingBehavior MyBatis 自动映射列到字段或属性;NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义结果集映射的结果集。 FULL 会自动映射任意复杂的结果集; PARTIAL
    autoMappingUnknownColumnBehavior 通知自动映射目标未知列(或者未知属性类型)的行为;NONE: 不做任何反应;WARNING: 输出提醒日志;FAILING: 映射失败抛出 SqlSessionException NONE
    defaultExecutorType 设置默认的执行器。SIMPLE 是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新 SIMPLE
    defaultStatementTimeout 设置超时时间,决定驱动等待数据库响应的秒数
    defaultFetchSize 为驱动的结果集获取数量(fetchSize)设置一个提示值;
    safeRowBoundsEnabled 允许在嵌套语句中使用分页(RowBounds);如果允许使用则设置为 false false
    safeResultHandlerEnabled 允许在嵌套语句中使用分页(ResultHandler);如果允许使用则设置为 false false
    mapUnderscoreToCamelCase 是否开启自动驼峰命名规则 false
    localCacheScope MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。SESSION会缓存一个会话中执行的所有查询;STATEMENT本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据 SESSION
    jdbcTypeForNull 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型 OTHER
    lazyLoadTriggerMethods 指定哪个对象的方法触发一次延迟加载 equals,clone,hashCode,toString
    defaultScriptingLanguage 指定动态 SQL 生成的默认语言。 org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
    defaultEnumTypeHandler 指定 Enum 使用的默认 TypeHandler org.apache.ibatis.type.EnumTypeHandler
    callSettersOnNulls 指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,依赖于 Map.keySet() 或 null 值初始化的时候比较有用。 false
    returnInstanceForEmptyRow 当返回行的所有列都是空时,MyBatis默认返回 null。 当开启这个设置时,MyBatis会返回一个空实例;(新增于 3.4.2) false
    logPrefix 指定 MyBatis 增加到日志名称的前缀 unset
    logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找 unset
    proxyFactory 代理工厂。指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。 JAVASSIST (MyBatis 3.3 以上)
    vfsImpl 指定 VFS 的实现 unset
    useActualParamName 使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的项目必须采用 Java 8 编译,并且加上 -parameters 选项。(新增于 3.4.1) true
    configurationFactory 指定一个提供 Configuration 实例的类。 这个被返回的 Configuration 实例用来加载被反序列化对象的延迟加载属性值。 这个类必须包含一个签名为static Configuration getConfiguration() 的方法。(新增于 3.2.3) unset

    官方完整示例如下,实际开发中并非如此配置,按需配置;

    <settings>
      <setting name="cacheEnabled" value="true"/>
      <setting name="lazyLoadingEnabled" value="true"/>
      <setting name="multipleResultSetsEnabled" value="true"/>
      <setting name="useColumnLabel" value="true"/>
      <setting name="useGeneratedKeys" value="false"/>
      <setting name="autoMappingBehavior" value="PARTIAL"/>
      <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
      <setting name="defaultExecutorType" value="SIMPLE"/>
      <setting name="defaultStatementTimeout" value="25"/>
      <setting name="defaultFetchSize" value="100"/>
      <setting name="safeRowBoundsEnabled" value="false"/>
      <setting name="mapUnderscoreToCamelCase" value="false"/>
      <setting name="localCacheScope" value="SESSION"/>
      <setting name="jdbcTypeForNull" value="OTHER"/>
      <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
    </settings>
    
    

    五 typeHandlers 类型处理器

    类型处理器故名思意,也就是可以在java类型和数据库jdbc类型之间转换;如果要自定义类型处理器就需要编写类型处理器类,然后在配置文件中配置,在SQL映射文件mapper.xml中使用。

    5.1 自定义TypeHandle

    本次示例就以字符串类型演示,需要继承BaseTypeHandler类,重写里面的方法,具体的代码清单如下,使用注解 @MappedJdbcTypes 会覆盖 泛型的String类型;

    /**
     * @Author lsc
     * <p> 知识追寻者,字符串类型处理器</p>
     */
    // 指定关联jdbc会改变泛型指定
    //@MappedJdbcTypes(JdbcType.VARCHAR)
    public class StringTypeHandler extends BaseTypeHandler<String> {
    
        public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
            // 指定java参数类型(String)对应数据库类型(varchar)
            preparedStatement.setString(i,s);
        }
    
        public String getNullableResult(ResultSet resultSet, String s) throws SQLException {
            return resultSet.getString(s);
        }
    
        public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
            return resultSet.getString(i);
        }
    
        public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
            return callableStatement.getString(i);
        }
    }
    
    

    5.2 mybatis-config.xml

    在 mybaits的配置文件中配置自定义的类型处理器

     <!--配置类型处理器,会覆盖默认的类型处理器 -->
        <typeHandlers>
            <typeHandler handler="com.zszxz.config.handler.StringTypeHandler"></typeHandler>
        </typeHandlers>
    
    

    也可以使用包名全局扫描,减轻配置过程;

     <!--配置类型处理器,会覆盖默认的类型处理器 -->
        <typeHandlers>
            	<package name="com.zszxz.config.handler"/>
        </typeHandlers>
    
    

    如果配置了jdbc的映射属性会覆盖泛型指定类型

      <typeHandlers>
            <!--指定关联jdbc会改变泛型指定 -->
            <typeHandler handler="com.zszxz.config.handler.StringTypeHandler" javaType="java.lang.String" jdbcType="VARCHAR"></typeHandler>
        </typeHandlers>
    
    

    5.3 SQL映射文件

    使用 jdbcType=VARCHAR,javaType=String 指定类型转换;

        <insert id="addStudent" parameterType="stu">
            insert into student(`name`,`number`)
            values (#{name,jdbcType=VARCHAR,javaType=String},#{number})
        </insert>
    
    

    六 mappers映射器

    mappers映射器就是配置引入SQL映射文件,也很简单,这边就给出官方示例,不再具体试验,有四种方式,通常我们掌握一至两种就足够日常开发使用;

    6.1 相对于类路径方式

    <mappers>
      <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
      <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
      <mapper resource="org/mybatis/builder/PostMapper.xml"/>
    </mappers>
    
    

    6.2 资源绝对路径方式

    <mappers>
      <mapper url="file:///var/mappers/AuthorMapper.xml"/>
      <mapper url="file:///var/mappers/BlogMapper.xml"/>
      <mapper url="file:///var/mappers/PostMapper.xml"/>
    </mappers>
    
    

    6.3 接口实现类的完全限定类名方式

    <mappers>
      <mapper class="org.mybatis.builder.AuthorMapper"/>
      <mapper class="org.mybatis.builder.BlogMapper"/>
      <mapper class="org.mybatis.builder.PostMapper"/>
    </mappers>
    
    

    6.4 接口实现类的包名方式

    <mappers>
      <package name="org.mybatis.builder"/>
    </mappers>
    
    
  • 相关阅读:
    优酷网的架构学习笔记
    同网关劫持与不同网关劫持实例
    .flv和.swf格式文件flash播放器代码
    让IE6显示透明PNG背景图片
    新手买车的九大原则
    服务器不支持FLV视频播放的原因
    功能强大易用的Web视频播放器——Flowplayer(使用方法及演示)
    一个不错的媒体网页播放器(国外的)
    网页表格中单元格线条及边框的设置
    20多个漂亮的使用jQuery交互的网站设计欣赏
  • 原文地址:https://www.cnblogs.com/zszxz/p/12065734.html
Copyright © 2011-2022 走看看