zoukankan      html  css  js  c++  java
  • 03.Mybatis优化

    对动态代理方式的代码进行进一步优化:

    1.将conf.xml文件中对数据库的配置信息以db.properties的形式抽离出来

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/person?serverTimezone=UTC
    username=root
    password=root
    <configuration>
        <properties resource="db.properties" />      //把抽离出去的properties文件加载进来
      <environments default="development">
        <environment id="development">
          <transactionManager type="JDBC"/>
          <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>   //用类似el表达式的方式进行引用
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
          </dataSource>
        </environment>
      </environments>
      <mappers>
        <mapper resource="com/offcn/mapper/personMapper.xml"/>
      </mappers>
    </configuration>

    2.配置全局参数:(作为入门一般不对全局参数进行设置)

    <configuration>
        <properties resource="db.properties" />
        <!-- 设置全局参数
        <settings>
            <setting name="cacheEnabled" value="false" />
            <setting name="lazyLoadingEnabled" value="false" />
        </settings> 

    所有的全局参数:

    设置参数描述有效值默认值
    cacheEnabled 该配置影响的所有映射器中配置的缓存的全局开关。 true | false true
    lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 true | false false
    aggressiveLazyLoading 当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载(参考lazyLoadTriggerMethods). true | false false (true in ≤3.4.1)
    multipleResultSetsEnabled 是否允许单一语句返回多结果集(需要兼容驱动)。 true | false true
    useColumnLabel 使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。 true | false true
    useGeneratedKeys 允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 true | false False
    autoMappingBehavior 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。 NONE, PARTIAL, FULL PARTIAL
    autoMappingUnknownColumnBehavior 指定发现自动映射目标未知列(或者未知属性类型)的行为。
    • NONE: 不做任何反应
    • WARNING: 输出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior'的日志等级必须设置为 WARN)
    • FAILING: 映射失败 (抛出 SqlSessionException)
    NONE, WARNING, FAILING NONE
    defaultExecutorType 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。 SIMPLE REUSE BATCH SIMPLE
    defaultStatementTimeout 设置超时时间,它决定驱动等待数据库响应的秒数。 任意正整数 Not Set (null)
    defaultFetchSize 为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖。 任意正整数 Not Set (null)
    safeRowBoundsEnabled 允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为false。 true | false False
    safeResultHandlerEnabled 允许在嵌套语句中使用分页(ResultHandler)。如果允许使用则设置为false。 true | false True
    mapUnderscoreToCamelCase 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 true | false False
    localCacheScope MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。 SESSION | STATEMENT SESSION
    jdbcTypeForNull 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER OTHER
    lazyLoadTriggerMethods 指定哪个对象的方法触发一次延迟加载。 A method name list separated by commas equals,clone,hashCode,toString
    defaultScriptingLanguage 指定动态 SQL 生成的默认语言。 A type alias or fully qualified class name. org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
    defaultEnumTypeHandler Specifies the TypeHandler used by default for Enum. (Since: 3.4.5) A type alias or fully qualified class name. org.apache.ibatis.type.EnumTypeHandler
    callSettersOnNulls 指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成 null 的。 true | false false
    returnInstanceForEmptyRow 当返回行的所有列都是空时,MyBatis默认返回null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集 (i.e. collectioin and association)。(从3.4.2开始) true | false false
    logPrefix 指定 MyBatis 增加到日志名称的前缀。 Any String Not set
    logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING Not set
    proxyFactory 指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。 CGLIB | JAVASSIST JAVASSIST (MyBatis 3.3 or above)
    vfsImpl 指定VFS的实现 自定义VFS的实现的类全限定名,以逗号分隔。 Not set
    useActualParamName 允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的工程必须采用Java 8编译,并且加上-parameters选项。(从3.4.1开始) true | false true
    configurationFactory 指定一个提供Configuration实例的类. 这个被返回的Configuration实例是用来加载被反序列化对象的懒加载属性值. 这个类必须包含一个签名方法static Configuration getConfiguration(). (从 3.2.3 版本开始) 类型别名或者全类名. Not set

    3.多参数的几种处理方式:

    接口:

    1    Student queryStudentByNameAndAge(String name,int age);
    2     Student queryStudentWithHashMap(Map<String, Object> map);
    3     Student queryStudentWithParam(@Param("sname") String sname,@Param("age") int age);
    4     Student queryStudentWithObject(Student student);

    映射文件:

     1 <!-- sql片段 -->
     2     <sql id="queryStudent">
     3         select sid,sname,sex,age from student
     4     </sql>
     5     <!-- 多参数 -->
     6     <!--1. 通过下标的方式进行传参 -->
     7   <select id="queryStudentByNameAndAge" resultType="student">
     8       <include refid="queryStudent" /> where sname = #{0} and age = #{1}
     9   </select>
    10     <!--   2.通过HashMap进行传参 -->
    11   <select id="queryStudentWithHashMap" resultType="student">
    12      <include refid="queryStudent" /> where sname = #{sname} and age = #{age}
    13  </select>
    14  <!--   3.通过注解的方式进行传参 ,同时注解也能对对象进行注解,取值的时候用别名点属性名-->
    15   <select id="queryStudentWithParam" resultType="student">
    16      <include refid="queryStudent" /> where sname = #{sname} and age = #{age}
    17  </select>
    18  
    19  <!--   4.通过对象的方式进行传参 -->
    20   <select id="queryStudentWithObject" parameterType="student" resultType="student">
    21      <include refid="queryStudent" /> where sname = #{sname} and age = #{age}
    22  </select>

    测试类:

     1 public static void queryStudentByNameAndAge() throws IOException {
     2         //读取配置文件
     3         Reader reader = Resources.getResourceAsReader("conf.xml");
     4         //创建sqlSessionFactory
     5         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
     6         //创建session
     7         SqlSession session = sessionFactory.openSession();
     8         //定位映射文件
     9         studentMapper studentMapper = session.getMapper(studentMapper.class);
    10         //定位sql语句并执行sql语句
    11         Student student = studentMapper.queryStudentByNameAndAge("馒头",22);
    12         System.out.println(student);
    13         //提交事务
    14         session.commit();
    15         session.close();
    16     }
    17     public static void queryStudentWithHashMap() throws IOException {
    18         //读取配置文件
    19         Reader reader = Resources.getResourceAsReader("conf.xml");
    20         //创建sqlSessionFactory
    21         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
    22         //创建session
    23         SqlSession session = sessionFactory.openSession();
    24         //定位映射文件
    25         studentMapper studentMapper = session.getMapper(studentMapper.class);
    26         //定位sql语句并执行sql语句
    27         Map<String, Object> map = new HashMap<String, Object>();
    28         map.put("sname", "馒头");
    29         map.put("age", 23);
    30         Student student = studentMapper.queryStudentWithHashMap(map);
    31         System.out.println(student);
    32         //提交事务
    33         session.commit();
    34         session.close();
    35     }
    36     public static void queryStudentWithParam() throws IOException {
    37         //读取配置文件
    38         Reader reader = Resources.getResourceAsReader("conf.xml");
    39         //创建sqlSessionFactory
    40         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
    41         //创建session
    42         SqlSession session = sessionFactory.openSession();
    43         //定位映射文件
    44         studentMapper studentMapper = session.getMapper(studentMapper.class);
    45         //定位sql语句并执行sql语句
    46         Student student = studentMapper.queryStudentWithParam("馒头",22);
    47         System.out.println(student);
    48         //提交事务
    49         session.commit();
    50         session.close();
    51     }
    52     public static void queryStudentWithObject() throws IOException {
    53         //读取配置文件
    54         Reader reader = Resources.getResourceAsReader("conf.xml");
    55         //创建sqlSessionFactory
    56         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
    57         //创建session
    58         SqlSession session = sessionFactory.openSession();
    59         //定位映射文件
    60         studentMapper studentMapper = session.getMapper(studentMapper.class);
    61         //定位sql语句并执行sql语句
    62         Student stu = new Student();
    63         stu.setSname("馒头");
    64         stu.setAge(22);
    65         Student student = studentMapper.queryStudentWithObject(stu);
    66         System.out.println(student);
    67         //提交事务
    68         session.commit();
    69         session.close();
    70     }
  • 相关阅读:
    linux安装python串口工具pyserial遇到不能成功导入的问题
    yum rpm apt-get wget 辨析
    系统时间不一致导致memcached的session不共享
    ERROR: transport error 202: bind failed: Address already in use
    The user specified as a definer ('root'@'%') does not exist
    IE比Chrome强的一个地方
    电脑突然死机,系统日志记录事件ID=6008
    mysql 查询多个id
    tomcat登陆WEB显示无权限问题&& tomcat无限循环启动问题
    MySql中把一个表的数据插入到另一个表中的实现代码
  • 原文地址:https://www.cnblogs.com/man-tou/p/11335048.html
Copyright © 2011-2022 走看看