1. 程式人生 > >MyBatis詳解

MyBatis詳解

esp resources myba 用法 管理 build oct ace 詳細信息

本文用例下載地址

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 }

MyBatis詳解