MyBatis配置文件中的常用配置


一、連接數據庫的配置單獨放在一個properties文件中

  之前,我們是直接將數據庫的連接配置信息寫在了MyBatis的conf.xml文件中,如下:

復制代碼
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
 3 <configuration>
 4     <environments default="development">
 5         <environment id="development">
 6             <transactionManager type="JDBC" />
 7             <!-- 配置數據庫連接信息 -->
 8             <dataSource type="POOLED">
 9                 <property name="driver" value="com.mysql.jdbc.Driver" />
10                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
11                 <property name="username" value="root" />
12                 <property name="password" value="XDP" />
13             </dataSource>
14         </environment>
15     </environments>
16     
17 </configuration>
復制代碼

  其實我們完全可以將數據庫的連接配置信息寫在一個properties文件中,然后在conf.xml文件中引用properties文件,具體做法如下:

  1、在src目錄下新建一個db.properties文件,如下圖所示:

  

  在db.properties文件編寫連接數據庫需要使用到的數據庫驅動,連接URL地址,用戶名,密碼,如下:

1 driver=com.mysql.jdbc.Driver
2 url=jdbc:mysql://localhost:3306/mybatis
3 name=root
4 password=XDP

  2、在MyBatis的conf.xml文件中引用db.properties文件,如下:

復制代碼
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
 3 <configuration>
 4 
 5     <!-- 引用db.properties配置文件 -->
 6     <properties resource="db.properties"/>
 7     <!-- 
 8         development : 開發模式
 9         work : 工作模式
10      -->
11     <environments default="development">
12         <environment id="development">
13             <transactionManager type="JDBC" />
14             <!-- 配置數據庫連接信息 -->
15             <dataSource type="POOLED">
16                 <!-- value屬性值引用db.properties配置文件中配置的值 -->
17                 <property name="driver" value="${driver}" />
18                 <property name="url" value="${url}" />
19                 <property name="username" value="${name}" />
20                 <property name="password" value="${password}" />
21             </dataSource>
22         </environment>
23     </environments>
24     
25 </configuration>
復制代碼

二、為實體類定義別名,簡化sql映射xml文件中的引用

  之前,我們在sql映射xml文件中的引用實體類時,需要寫上實體類的全類名(包名+類名),如下:

<!-- 創建用戶(Create) -->
<insert id="addUser" parameterType="me.gacl.domain.User">
    insert into users(name,age) values(#{name},#{age})
</insert>

  parameterType="me.gacl.domain.User"這里寫的實體類User的全類名me.gacl.domain.User,每次都寫這么一長串內容挺麻煩的,而我們希望能夠簡寫成下面的形式

<insert id="addUser2" parameterType="_User">
    insert into users(name,age) values(#{name},#{age})
</insert>

  parameterType="_User"這樣寫就簡單多了,為了達到這種效果,我們需要在conf.xml文件中為實體類="me.gacl.domain.User"定義一個別名為"_User",具體做法如下:
  在conf.xml文件中<configuration></configuration>標簽中添加如下配置:

<typeAliases>
    <typeAlias type="me.gacl.domain.User" alias="_User"/>
</typeAliases>

  這樣就可以為me.gacl.domain.User類定義了一個別名為_User,以后_User就代表了me.gacl.domain.User類,這樣sql映射xml文件中的凡是需要引用me.gacl.domain.User類的地方都可以使用_User來代替,這就達到了一個簡化實體類引用的目的。

  除了可以使用<typeAlias type="me.gacl.domain.User" alias="_User"/>這種方式單獨為某一個實體類設置別名之外,我們還可以使用如下的方式批量為某個包下的所有實體類設置別名,如下:

復制代碼
<!-- 配置實體類的別名,配置實體類別名的目的是為了在引用實體類時可以使用實體類的別名來代替實體類,達到簡寫的目的 -->
    <typeAliases>
        <!-- 為實體類me.gacl.domain.User配置一個別名_User -->
        <!-- <typeAlias type="me.gacl.domain.User" alias="_User"/> -->
        <!-- 為me.gacl.domain包下的所有實體類配置別名,MyBatis默認的設置別名的方式就是去除類所在的包后的簡單的類名
        比如me.gacl.domain.User這個實體類的別名就會被設置成User
         -->
        <package name="me.gacl.domain"/>
    </typeAliases>
復制代碼

  <package name="me.gacl.domain"/>就表示為這個包下面的所有實體類設置別名。MyBatis默認的設置別名的方式就是去除類所在的包后的簡單的類名,比如me.gacl.domain.User這個實體類的別名就會被設置成User。

 

三、mappers(映射器)

      mapper用於,引入MyBatis關於數據庫操作的映射。Mapper配置的幾種常見的方法
      3.1 使用相對類路徑的資源
  
<!-- 加載 映射文件 -->  
<mappers>  
    <!-- 注冊userMapper.xml文件, 19 userMapper.xml位於com.baowei.mapping/這個包下,所以resource寫成com/baowei/mapping/userMapper.xml -->  
    <mapper resource="com/baowei/mapping/userMapper.xml" />
</mappers> 

       3.2 使用Mapper接口的類路徑(要求mapper接口名稱和mapper映射文件名稱相同,且放在同一個目錄中)

            
  
<!-- 加載 映射文件 -->  
<mappers>  
    <mapper class="com.baowei.mapper.UserMapper" />  
</mappers> 

 

      3.3 注冊指定包下的mapper接口( 要求mapper接口名稱和mapper映射文件名稱相同,且放在同一個目錄中)
           
 
<!-- 加載 映射文件 -->  
<mappers>  
    <package name="com.baowei.mapper" />  
</mappers> 

 

四、Java代碼

首先創建DBHelper,用於封裝SqlSessionFactory

package zdsoft.common;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class DBHelper {
    // GC不理static
    private static SqlSessionFactory factory = null;

    public static SqlSessionFactory getSqlSessionFactory() throws IOException {
        if (factory == null) {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            factory = new SqlSessionFactoryBuilder().build(inputStream);
        }
        return factory;
    }

    // 獲得會話
    public static SqlSession getSession() throws IOException {
        return getSqlSessionFactory().openSession(true);
    }

    /**
     * 獲得得sql會話
     * 
     * @param isAutoCommit
     *            是否自動提交,如果為false則需要sqlSession.commit();rollback();
     * @return sql會話
     * @throws IOException 
     */
    public static SqlSession getSession(boolean isAutoCommit) throws IOException {
        return getSqlSessionFactory().openSession(isAutoCommit);
    }
    
}
View Code

然后單元測試代碼如下:

@Test
public void testInsert() throws IOException {
    // 獲取session
    SqlSession session = DBHelper.getSession();
    // 獲取mapper接口的代理對象
    StudentMapper studentMapper = session.getMapper(StudentMapper.class);
    // 調用代理對象方法
    Student stu = new Student();
    stu.setId(3);
    stu.setName("中華人民共和國");
    stu.setAge(100);
    studentMapper.insert(stu);
    // 關閉session
    session.close();
}
View Code

 

五、知識點的總結

1、  #{}和${}

#{}表示一個占位符號,通過#{}可以實現preparedStatement向占位符中設置值,自動進行java類型和jdbc類型轉換.#{}可以有效防止sql注入。#{}可以接受簡單類型或者pojo屬性值。如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。

${}表示sql的拼接,通過${}接收參數,將參數的內容不加任何修飾拼接在sql中。${}也可以接收pojo數據,可以使用OGNL解析出pojo的屬性值.缺點:不能防止sql注入。

2、  parameterType和resultType

parameterType:指定輸入參數類型,mybatis通過ognl從輸入對象中獲取參數值拼接在sql中。

resultType:指定輸出結果類型,mybatis將sql查詢結果的一行記錄數據映射為resultType指定類型的對象。

 
說明:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM