MyBatis詳解

来源:http://www.cnblogs.com/gaofei-1/archive/2017/07/28/7247565.html
-Advertisement-
Play Games

MyBatis配置文件、操作sql語句(本文全是代碼,代碼中包含詳細註釋) ...


本文用例下載地址,裡面還有一個MyBatis實現分頁的例子

http://files.cnblogs.com/files/gaofei-1/MyBatisDemo.rar 


 

本文使用的是MySQL資料庫,所需SQL腳本如下

 1 CREATE DATABASE demo;
 2 USE demo;
 3 CREATE TABLE `user`(
 4     `id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '編號',
 5     `name` VARCHAR(20) NOT NULL COMMENT '名稱',
 6     `password` VARCHAR(20) NOT NULL COMMENT '密碼',
 7     `phone` VARCHAR(11) COMMENT '聯繫電話',
 8     `address` VARCHAR(100) COMMENT '住址'
 9 );
10 
11 INSERT INTO `user` VALUES(DEFAULT,'admin','admin',NULL,NULL),(DEFAULT,'ttt','ttt',NULL,NULL),(DEFAULT,'aaa','aaa',NULL,NULL)
12     ,(DEFAULT,'ddd','ddd',NULL,NULL),(DEFAULT,'xxx','xxx',NULL,NULL);

MyBatis核心配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration PUBLIC "//UNKNOWN/" "mybatis-3-config.dtd">
 3 <!-- 1:配置文件根節點 -->
 4 <configuration>
 5     <!-- 2:設置mybatis運行行為 -->
 6     <settings>
 7         <!-- 2.1:設置mybatis日誌實現為log4j -->
 8         <setting name="logImpl" value="LOG4J"/>
 9         <!-- 2.2:MyBatis對於resultMap自動映射的匹配級別 -->
10         <setting name="autoMappingBehavior" value="FULL"/>
11         <!-- 2.3:設置全局懶載入 -->
12         <setting name="lazyLoadingEnabled" value="false"/>
13     </settings>
14     <!-- 3:設置自定義類型別名,這樣就不用寫全限定名了 -->
15     <typeAliases>
16         <!-- 3.1:將src/pojo文件夾下的所有類都自動設置別名    自動設置的別名格式:src/pojo/User.java     別名:User -->
17         <package name="pojo" />
18         <!-- 3.2:單獨設置某個類的別名 -->
19         <!-- <typeAlias type="pojo.User" alias="User" /> -->
20     </typeAliases>
21     <!-- 4:設置mybatis的環境,預設為demo,必須設置預設環境,可以有多個環境 -->
22     <environments default="demo">
23         <!-- 4.1:設置單個環境 -->
24         <environment id="demo">
25             <!-- 4.1.1:設置事務管理器為jdbc -->
26             <transactionManager type="JDBC" />
27             <!-- 4.1.2:設置數據源,POOLED:mybatis自帶的數據源、JNDI:基於Tomcat的數據源 -->
28             <dataSource type="POOLED">
29                 <!-- 配置驅動類,資料庫連接語句,用戶名和密碼,name屬性的值不能寫錯,特殊字元需要轉義 -->
30                 <property name="driver" value="com.mysql.jdbc.Driver"/>
31                 <property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&amp;useSSL=true&amp;usecharacterEncoding=utf-8"/>
32                 <property name="username" value="root"/>
33                 <property name="password" value="111111"/>
34             </dataSource>
35         </environment>
36     </environments>
37     <!-- 5:配置映射器,映射sql語句 -->
38     <mappers>
39         <!-- 5.1:逐個配置 -->
40             <!-- 方式1,指定引用文件 -->
41             <mapper resource="mapper/UserMapper.xml" />
42             <!-- 方式2,指定類 -->
43             <!-- <mapper class="mapper.UserMapper"/> -->
44             <!-- 方式3,指定磁碟下的文件路徑 -->
45             <!-- <mapper url="file///...文件絕對路徑..."/> -->
46         <!-- 5.2:自動掃描,但必須保證   mapper文件和與之對應的介面   名稱相同併在同一文件夾下 -->
47             <!-- <package name="dao"/> -->
48     </mappers>
49 </configuration>

 

  註:mybatis核心配置文件中的各個節點的順序不能亂寫。詳細信息可以去dtd文件中查看。dtd文件位置:mybatis的jar包下的org/apache/ibatis/builder/xml


MyBatis映射器用法(mapper文件,映射sql語句)

  常用語法,在任何語句中都可以靈活使用及嵌套使用

1 <trim prefix="首碼" suffix="尾碼" suffixOverrides="每個短句的尾碼">這個標簽幾乎是全能的</trim>   
2 <if test="條件"></if>
3 <foreach collection="迭代的類型,可為array|list|map" item="指代當前項" open="首碼" close="尾碼" separator="每個短句之間的分隔符"></foreach>
4 <choose>
5     <when test="條件"></when>        <!-- 滿足任意when則退出,不執行其他when -->
6     <otherwise></otherwise>            <!-- 如果所有when都沒有執行,則執行otherwise -->
7 </choose>

  外部resultMap用法,如果查詢結果返回多行並且類包含引用類型屬性的話,則resultMap內的所有屬性都必須手動指定。

 1 <resultMap type="User" id="userMap">
 2     <!-- 指定id -->
 3     <id column="列名" property="與實體類中的屬性名對應"/>
 4     <!-- 指定與列名對應的屬性名 -->
 5     <result column="列名" property="與實體類中的屬性名對應"/>
 6     <!-- 指定實體類中類型為引用類型的屬性 -->
 7     <association property="與實體類中的屬性名對應" javaType="自定義類型" resultMap="引用另外自定義的resultMap">
 8         <result column="列名" property="與實體類中的屬性名對應"/>
 9         ...        
10     </association>
11     <!-- 指定實體類中類型為集合的屬性 -->
12     <collection property="與實體類中的屬性名對應" javaType="自定義類型" resultMap="引用另外自定義的resultMap">
13         <result column="列名" property="與實體類中的屬性名對應"/>
14         ...
15     </collection>
16 </resultMap>

  SQL語句用法

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper PUBLIC "//UNKNOWN/" "mybatis-3-mapper.dtd">
 3 
 4 <!-- 映射文件根節點      如果調用時使用介面方式的話,命名空間需為對應介面的命名空間-->
 5 <mapper namespace="dao.UserDao">
 6     <!-- 1:添加語句 -->
 7         <insert id="addUser" parameterType="User">
 8             <!-- 方式1:直接寫添加語句 -->
 9             <!-- INSERT INTO `user` VALUES(DEFAULT,#{name},#{password},#{phone},#{address}) -->
10             <!-- 方式2:使用if+trim -->
11             INSERT INTO `user`
12             <trim prefix="(" suffix=")" suffixOverrides=",">
13                 <if test="name!=null and name!=''">name,</if>
14                 <if test="password!=null and password!=''">password,</if>
15                 <if test="phone!=null and phone!=''">phone,</if>
16                 <if test="address!=null and address!=''">address,</if>
17             </trim> 
18             VALUES
19             <trim prefix="(" suffix=")" suffixOverrides=",">
20                 <if test="name!=null and name!=''">#{name},</if>
21                 <if test="password!=null and password!=''">#{password},</if>
22                 <if test="phone!=null and phone!=''">#{phone},</if>
23                 <if test="address!=null and address!=''">#{address},</if>
24             </trim>
25         </insert>
26     <!-- 2:修改語句 -->
27         <update id="updUserById" parameterType="User">
28             <!-- 方式1:直接寫修改語句,如果只有一個參數並且參數為基本數據類型的話,則不用寫parameterType -->
29             <!-- UPDATE `user` SET `name`='abc' WHERE id=#{id} -->
30             <!-- 方式2:使用set+if -->
31             UPDATE `user`
32             <set>
33                 <if test="name!=null and name!=''">name=#{name}</if>
34             </set>
35             WHERE id=#{id}
36         </update>
37     <!-- 3:刪除語句 -->
38         <delete id="delUserById">
39             delete from `user` where `id`=#{id}
40         </delete>
41     <!-- 4:查詢語句 -->
42         <!-- 1:根據單個基本數據類型參數查詢,如果只有一個參數並且參數為基本數據類型的話,則不用寫parameterType -->
43         <select id="getUserById" resultType="User">
44             SELECT * FROM `user` WHERE `id`=#{id}
45         </select>
46         <!-- 2:使用foreach查詢 -->
47         <select id="getUserByIds_foreach" resultType="User">
48             select * from `user` where `id` in
49             <foreach collection="array" item="id" open="(" close=")" separator=",">
50                 #{id}
51             </foreach>
52         </select>
53         <!-- 3:使用choose查詢 -->
54         <select id="getUserById_choose" resultType="User">
55             select * from `user`
56             <choose>
57                 <when test="name!=null and name!=''">where name like '%${name}%'</when>
58             </choose>
59         </select>
60 </mapper>

 

 測試類

  1 package test;
  2 
  3 import java.io.IOException;
  4 import java.util.List;
  5 
  6 import org.apache.ibatis.io.Resources;
  7 import org.apache.ibatis.session.SqlSession;
  8 import org.apache.ibatis.session.SqlSessionFactory;
  9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 10 import org.junit.Test;
 11 
 12 import pojo.User;
 13 import dao.UserDao;
 14 
 15 /**
 16  * 測試類
 17  * 本類中所有方法都使用介面的方式實現的,若要使用sql映射語句實現的話,格式如下
 18  * session.selectOne("mapper文件的namespace+SQL語句的id", 參數)
 19  * session.selectList("mapper文件的namespace+SQL語句的id", 參數)
 20  * session.update("mapper文件的namespace+SQL語句的id", 參數)
 21  * session.insert("mapper文件的namespace+SQL語句的id", 參數)
 22  * session.delete("mapper文件的namespace+SQL語句的id", 參數)
 23  * @author Gawain
 24  */
 25 public class Demo {
 26     static SqlSessionFactory fac;            //sqlsession工廠
 27     static {
 28         //創建sqlsession工廠
 29         try {
 30             fac = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
 31         } catch (IOException e) {
 32             e.printStackTrace();
 33         }
 34     }
 35     @Test
 36     public void test() {
 37         //創建sqlsession會話,傳true為自動提交事務
 38         SqlSession session = fac.openSession(true);
 39         
 40         //添加用戶信息
 41 //        addUser(session);
 42 //        //修改用戶信息
 43 //        updUser(session);
 44 //        //刪除用戶信息
 45 //        delUser(session);
 46 //        //根據單個基本數據類型參數查詢
 47 //        getUserById(session);
 48 //        //使用foreach查詢
 49 //        getUserByIds_foreach(session);
 50         //使用choose查詢
 51         getUserById_choose(session);
 52         
 53         session.close();
 54     }
 55     /**
 56      * 使用choose查詢
 57      * @param session
 58      */
 59     private void getUserById_choose(SqlSession session) {
 60         List<User> users = session.getMapper(UserDao.class).getUserById_choose("a");
 61         for (User item : users) {
 62             System.out.println(item);
 63         }
 64     }
 65     /**
 66      * 使用foreach查詢
 67      * @param session
 68      */
 69     private void getUserByIds_foreach(SqlSession session) {
 70         int[] ids = {1,2,3};
 71         List<User> users = session.getMapper(UserDao.class).getUserByIds_foreach(ids);
 72         for (User item : users) {
 73             System.out.println(item);
 74         }
 75     }
 76     /**
 77      * 根據單個基本數據類型參數查詢
 78      * @param session
 79      */
 80     private void getUserById(SqlSession session) {
 81         List<User> users = session.getMapper(UserDao.class).getUserById(2);
 82         for (User item : users) {
 83             System.out.println(item);
 84         }
 85     }
 86     /**
 87      * 刪除用戶信息
 88      * @param session
 89      */
 90     private void delUser(SqlSession session) {
 91         String result = session.getMapper(UserDao.class).delUserById(4) > 0?"刪除成功":"刪除失敗";
 92         System.out.println(result);
 93     }
 94     /**
 95      * 修改用戶信息
 96      * @param session
 97      */
 98     private void updUser(SqlSession session) {
 99         User user = new User();
100         user.setId(2);
101         user.setName("update");
102         String result = session.getMapper(UserDao.class).updUserById(user) > 0?"修改成功":"修改失敗";
103         System.out.println(result);
104     }
105     /**
106      * 添加用戶信息
107      * @param session
108      * @return
109      */
110     private void addUser(SqlSession session) {
111         User user = new User();
112         user.setName("Gawain");
113         user.setPassword("123456");
114         String result = session.getMapper(UserDao.class).addUser(user) > 0?"添加成功":"添加失敗";
115         System.out.println(result);
116     }
117 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 可能很多Java的初學者對String的存儲和賦值有迷惑,以下是一個很簡單的測試用例,你只需要花幾分鐘時間便可理解。 1.在看例子之前,確保你理解以下幾個術語: 棧:由JVM分配區域,用於保存線程執行的動作和數據引用。棧是一個運行的單位,Java中一個線程就會相應有一個線程棧與之對應。 堆:由JVM ...
  • 解決python2.7中re模塊的search使用utf8的str出問題,然後做個總結。 ...
  • * 在頁面中使用el表達式如${param.username},相當於在後臺程式(如Servlet)中調用request.getParameter("username"); * 編程中,在頁面中使用el表達式,如 ${param.username} 也可以取到ValueStack中Property ...
  • CyclicBarrier類似於CountDownLatch也是個計數器, 不同的是CyclicBarrier數的是調用了CyclicBarrier.await()進入等待的線程數, 當線程數達到了CyclicBarrier初始時規定的數目時,所有進入等待狀態的線程被喚醒並繼續。 CyclicBar... ...
  • 加 Golang學習 QQ群共同學習進步成家立業工作 ^-^ 群號:96933959 文件讀取 os.File 封裝了文件相關操作 type File File代表一個打開的文件對象。 func Create(name string) (file *File, err error) Create採用 ...
  • 1.電腦語言的發展 機器語言:其實就是二進位0和1,最小為00000000,最大為11111111,8位比特為1個位元組(byte),1k=1024byte,1m=1024k,1g=1024m[第一代] 彙編語言:大白話就是用對應的標識字母單詞來替換掉龐大的機器語言[第二代] 高級語言:其中還分為第 ...
  • 附新手工具: python新手工具下載鏈接:http://pan.baidu.com/s/1eS8WMR4 密碼:7eso 註冊碼:http://idea.liyang.io py和編輯器安裝教程鏈接:http://pan.baidu.com/s/1hsoCmhQ 密碼:rpru py和編輯器安裝教 ...
  • 使用函數的意義 首先必須要認識到的是函數在python使用過程中是十分重要的,對於我們經常寫代碼時發生的多次重覆的某些代碼,我們時常會使用函數來解決諸如此類問題。 這是因為函數在解決代碼重用方面具有很大的優勢,並且這些定義好的函數在面臨修改代碼時的操作也減輕了很大一部分的工作量,並且程式可讀性也很好 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...