03.Mybatis優化

對動態代理方式的代碼進行進一步優化:mysql

1.將conf.xml文件中對數據庫的配置信息以db.properties的形式抽離出來sql

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> 

全部的全局參數:apache

設置參數 描述 有效值 默認值
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.多參數的幾種處理方式:緩存

接口:session

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);

映射文件:app

 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     }
相關文章
相關標籤/搜索