1. 程式人生 > 實用技巧 >mybatis的配置

mybatis的配置

三、配置檔案

1.namespace

namespace要與我們的介面名一一對應;

2.select

  • id:要與介面的方法名一致,作為一個我們唯一的標識;
  • resultType:返回值,如果是集合,寫集合型別裡面的東西;
  • parameterType:引數的型別
<select id="getUserID" parameterType="int" resultType="com.saxon.pojo.User">
        select * from mybatis.saxon where id=#{id};
    </select>
 public void test () {
        SqlSession sqlSession=null;
        //關閉ssqlsession,這個關閉很重要
        try {
            //獲得sqlsession物件
            sqlSession = MybatisUnit.getSqlSession ();
            //獲得mapper物件,為了得到userdao,使用裡面的方法;
            UserDao mapper = sqlSession.getMapper (UserDao.class);
            User userID = mapper.getUserID (2);
            System.out.println (userID);

        } finally {
           if (sqlSession!=null){
               sqlSession.close ();
           }
        }
    }

3.insert

4.update

5.delete

除了查詢之外,其他的都要提交事務,提交的話就是一句 sqlsession.commit()

6.MAP 的使用

在一個實體類屬性太多的時候,我們就可以用一個集合來新增屬性;

直接利用key-value取出我們要的值;

    <update id="update" parameterType="map">
         update mybatis.saxon set user=#{user} ,pwd=#{pwd} where id=#{id};
    </update>
 public void testMap(){
        SqlSession sqlSession = MybatisUnit.getSqlSession ();
        UserDao mapper = sqlSession.getMapper (UserDao.class);
        Map<String, Object> map = new HashMap<> ();
        map.put ("id",2);
        map.put ("user","saxon");
        map.put ("pwd","441564161");
        mapper.update (map);
        sqlSession.commit ();
        sqlSession.close ();
    }

"#{user}":裡面的值就是你集合裡面設定的值;
使用#{}與*{}的區別就在與前者是預編譯,更加安全,防止sql注入問題

7.模糊查詢

1.在給出變數的時候拼接出來。例如String str="%李%";但是這個會存在sql注入的問題;

2.在我們寫查詢語句的時候,就在值的左右把他寫成固定的;就是“%”#{value}“%”;可以避免一些注入問題;

8.核心配置檔案(mybatis-config.xml)

1.properties 配置

我們的配置檔案可以自己寫成一個配置檔案,也可以自己直接賦值

關於配置properties的位置,一定要放在第一位,他的位置有規定的

1.配置檔案法

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://rm-wz917wbvou67a757quo.mysql.rds.aliyuncs.com:3306/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=true
username=saxon
password=111111

引用:

<properties resource="db.properties">
    
<!-- 讀取配置檔案 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>   

2.直接寫

<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:localhost:3306/smbms?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true"/>
<property name="username" value="root"/>
<property name="password" value=""/>

2.environments 環境

這個標籤是關於環境的標籤,我們可以配置多套環境但是隻能使用一套環境;

 <environments default="development">
        <environment id="development">

environments和environment通過id選擇環境;你可以自定義環境;

3.transactionManager 事務管理

<transactionManager type="JDBC"/>

事務的管理者,有兩種,但是mybatis預設的是JDBC,還有另外一種叫做 MANGED

4.dataSource 資料來源

<dataSource type="POOLED">

預設的是pooled還有其他兩種,一共是[UNPOOLED|POOLED|JNDI]這三種;

5 .typeAliases.別名

第一種:直接配置

<typeAliases>
        <typeAlias type="com.saxon.pojo.User" alias="user"/>
</typeAliases>

第二種:掃描包

<typeAliases>
        <package name="com.saxon.pojo"/>
</typeAliases>

取別名就是為了在我們使用的時候,避免重複的寫一些冗長的程式碼,比如com.saxon.pojo.Use,我們取得別名就是user,那麼我們在resultType要使用com.saxon.pojo.Use就可以使用user。

兩種配置的區別:

1.第一種可以自己寫名字,第二種的預設是類名的首字母大寫,如果要自定義的話,可以在類名上加上一個註解@Aliases("");

2.當我們類名比較少的時候就可以用第一種,當我們類名比較多的時候,直接使用掃描包就可以了,id就是你的類名的小寫;

6.setting設定

1.mapUnderscoreToCamelCase:把only_name變成onlyName,把有下劃線的命名取成駝峰命名;
2.logImpl:日誌的輸出可以取的值有:SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING

7.mapper對映器

第一種:

    <mappers>
        <mapper resource="com/saxon/Dao/UserMapper.xml"/>
    </mappers>

第二種:

 <mappers>
        <mapper class="com.saxon.Dao.UserMapper"/>
</mappers>

使用第二種的時候必須保證兩點:1.對映和實體類必須要在同一個包裡;2.並且要和這個類的名字相符;簡單來說就是通過你繫結的這個類,去找和這個類名一樣的檔案xml檔案

第三種:

<mappers>
       <package name="com.saxon.Dao"/>
 </mappers>

使用第三種的要求和第二種是一樣的;

所以一般推薦使用第一種

8.作用域(Scope)和生命週期SqlSessionFactoryBuilder

SqlSessionFactoryBuilder

這個類可以被例項化、使用和丟棄,一旦建立了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 例項的最佳作用域是方法作用域(也就是區域性方法變數)。 你可以重用 SqlSessionFactoryBuilder 來建立多個 SqlSessionFactory 例項,

SqlSessionFactory

SqlSessionFactory 一旦被建立就應該在應用的執行期間一直存在,沒有任何理由丟棄它或重新建立另一個例項。 使用 SqlSessionFactory 的最佳實踐是在應用執行期間不要重複建立多次,多次重建 SqlSessionFactory 被視為一種程式碼“壞習慣”。因此 SqlSessionFactory 的最佳作用域是應用作用域。 有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。

SqlSession

每個執行緒都應該有它自己的 SqlSession 例項。SqlSession 的例項不是執行緒安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。 絕對不能將 SqlSession 例項的引用放在一個類的靜態域,甚至一個類的例項變數也不行。 也絕不能將 SqlSession 例項的引用放在任何型別的託管作用域中,比如 Servlet 框架中的 HttpSession。 如果你現在正在使用一種 Web 框架,考慮將 SqlSession 放在一個和 HTTP 請求相似的作用域中。 換句話說,每次收到 HTTP 請求,就可以開啟一個 SqlSession,返回一個響應後,就關閉它。 這個關閉操作很重要,為了確保每次都能執行關閉操作,你應該把這個關閉操作放到 finally 塊中。 下面的示例就是一個確保 SqlSession 關閉的標準模式:

每次的一個sqlsession都是為了完成一次的任務,CRUD

9.結果集對映

就是資料庫裡面的欄位和實體類裡面的屬性的對映;

<resultMap id="users" type="com.saxon.pojo.User">
        <result column="pwd" property="password"/>
 </resultMap>
 <select id="getUserList" resultMap="users"><!-- the must match with  a pojo-->
    select * from mybatis.saxon
  </select>
//獲得sqlsession物件
sqlSession = MybatisUnit.getSqlSession ();
//獲得mapper物件,為了得到userdao,使用裡面的方法;
UserMapper mapper = sqlSession.getMapper (UserMapper.class);
List<User> userList = mapper.getUserList ();
User user = userList.get (1);
System.out.println (user.getPassword ());
System.out.println (userList);

自學整理
學習地址:狂神說Java