MyBatis詳解
阿新 • • 發佈:2017-07-28
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) NOTNULL 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&useSSL=true&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詳解