1. 程式人生 > >Mybatis學習第一天——Mybatis的安裝配置以及基本CURD操作

Mybatis學習第一天——Mybatis的安裝配置以及基本CURD操作

1.Mybatis下載
  Mybatis是開源的持久層框架,能夠度jdbc進行簡單的封裝,但其並不是完全的ORM(Object Relational Mapping,物件關係對映),無法脫離資料庫進行適配。目前Mybatis能夠在githup上直接下載:https://github.com/mybatis/mybatis-3/releases,有多個版本可以選擇。

2.Mybatis檔案介紹

lib:mybatis依賴包;mybatis-3.4.6.jar:核心包;

3.mybatis配置

建立一個專案,網站/後臺隨意,將核心包和lib中的依賴包全都新增到專案中的lib下,沒有lib自己建立,建立路徑build path。
匯入mybatis包後,別忘了匯入資料庫連線包。

4.建立配置檔案

建立config配置資料夾,首先配置SqlMapConfig.xml。該檔案主要用來配置資料庫連線環境,在沒有spring進行管理的同時對資料來源進行配置,同時設定與表的對映物件。

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
6 <!-- 和spring整合後 environments配置將廢除 --> 7 <environments default="development"> 8 <environment id="development"> 9 <!-- 使用jdbc事務管理 --> 10 <transactionManager type="JDBC" /> 11 <!-- 資料庫連線池 --> 12 <
dataSource type="POOLED"> 13 <property name="driver" value="com.mysql.jdbc.Driver" /> 14 <property name="url" 15 value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /> 16 <property name="username" value="root" /> 17 <property name="password" value="xxxx" /> 18 </dataSource> 19 </environment> 20 </environments> 21 22 <mappers> 23 <mapper resource="sqlmap/User.xml"/> 24 </mappers> 25 26 </configuration>

更多mybatis中SqlMapConfig.xml配置可以參考http://blog.knowsky.com/197049.htm,有詳細的介紹。(具體關於dtd是從哪裡找的,還在研究。。。)
其中<mapper>是作為對映關係。具體下面介紹。

建立log4j.properties日誌設定檔案:

1 # Global logging configuration
2 log4j.rootLogger=DEBUG, stdout
3 # Console output...
4 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
5 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
6 log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

全域性的日誌設定,主要用來列印在控制檯中。

5.建立對映關係類

 1 package com.mybatis.pojo;
 2 
 3 import java.io.Serializable;
 4 import java.util.Date;
 5 
 6 public class User implements Serializable {
 7     private int id;
 8     private String username;// 使用者姓名
 9     private String sex;// 性別
10     private Date birthday;// 生日
11     private String address;// 地址

在src目錄下建立User類,新增幾個簡單的資料。注意:Mybatis無法像hibernate那樣根據類自動建立表,訪問資料庫時必須保證資料庫存在。

6.配置對映關係檔案

可以下config目錄下建立sqlmap資料夾,在其中建立User.xml SQL對映檔案:

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper
 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <!-- namespace:名稱空間,用於隔離sql,還有一個很重要的作用,後面會講 -->
 6 <mapper namespace="test">
 7 
 8     <select id="findUserById" 
 9     parameterType="Integer"
10     resultType="com.mybatis.pojo.User"
11     >
12     select * from user where id = #{v}
13     </select>
14
15 </mapper>

(同樣這裡還是不知道dtd哪裡找的),mapper標籤內主要寫sql語句,用過select、update、delete標籤進行區別,其中namespace屬性為了區分相同id的SQL語句。

設定完之後在SqlMapConfig.xml檔案中載入配置檔案:

7.執行測試程式

測試程式步驟:
1. 建立SqlSessionFactoryBuilder物件
2. 載入SqlMapConfig.xml配置檔案
3. 建立SqlSessionFactory物件
4. 建立SqlSession物件
5. 執行SqlSession物件執行查詢,獲取結果User
6. 列印結果
7. 釋放資源

 1 package com.mybatis.junit;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import java.io.File;
 6 import java.io.InputStream;
 7 import java.util.Properties;
 8 
 9 import javax.annotation.Resource;
10 
11 import org.apache.ibatis.io.Resources;
12 import org.apache.ibatis.session.SqlSession;
13 import org.apache.ibatis.session.SqlSessionFactory;
14 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
15 import org.junit.Test;
16 
17 import com.mybatis.pojo.User;
18 import com.mysql.jdbc.interceptors.SessionAssociationInterceptor;
19 
20 public class MybatisFirstTest {
21     @Test
22     public void testName() throws Exception {
23         //載入核心配置檔案
24         String resource = "SqlMapConfig.xml";
25         InputStream in = Resources.getResourceAsStream(resource);
26         
27         //sessionFactory類
28         SqlSessionFactory sessionFactory =  new SqlSessionFactoryBuilder().build(in);
29         
30         //sqlSession
31         SqlSession sqlSession = sessionFactory.openSession();
32         
33         //執行sql語句
34         User user = sqlSession.selectOne("test.findUserById", 1);
35         
36         System.out.println(user.getBirthday());
37         
38         sqlSession.close();
39     }
40 }

在執行sql語句過程中"test.findUserById"就是查詢的User.xml檔案中test域下的id為findUserById的SQL語句。

 

8.CURD操作

瞭解mybatis的執行流程,接下來分析下增刪改查操作,測試程式碼都差不多,主要是執行sql語句的區別:

8.1 查詢

dao層根據名字模糊查詢,返回需要list。

在User.xml中如下:

1     <!-- id表示dao層中根據這個呼叫
2         parameterType:傳入資料的型別
3         resultType:返回結果型別(這裡返回list,mybatis會自動轉成User的集合型別)
4         ${value}:對於字串拼接中的佔位符,必須用value
5         #{ss}:普通佔位符,ss和任意取
6      -->
7     <select id="findUserByUsername" parameterType="String" resultType="com.mybatis.pojo.User">
8         select * from user where username like '%${value}%'
9     </select>

8.2 新增

1         //執行sql語句
2         User user = new User();
3         user.setUsername("li");
4         user.setBirthday(new Date());
5         user.setAddress("北京");
6         user.setSex("女");
7         sqlSession.insert("test.insertUser", user);
8         sqlSession.commit();

通過呼叫insert方法進行插入操作,注意需要進行提交操作

 1     <insert id="insertUser" parameterType="com.mybatis.pojo.User">
 2         
 3         <!-- selectKey 標籤實現主鍵返回 -->
 4         <!-- keyColumn:主鍵對應的表中的哪一列 -->
 5         <!-- keyProperty:主鍵對應的pojo中的哪一個屬性 -->
 6         <!-- order:設定在執行insert語句前執行查詢id的sql,孩紙在執行insert語句之後執行查詢id的sql -->
 7         <!-- resultType:設定返回的id的型別 -->
 8         <selectKey keyColumn="id" keyProperty="id" order="AFTER"
 9             resultType="int">
10             select last_insert_id()
11         </selectKey>
12         <!--傳入的是User類,只要 #{username}中佔位符名字與User類中的屬性名一致,那麼Mybatis會自動匹配 -->
13         insert into user(username,sex,birthday,address) 
14         values(#{username},#{sex},#{birthday},#{address})
15     </insert>

8.3 更新

1         //執行sql語句
2         User user = new User();
3         user.setId(1);
4         user.setUsername("lihhhhh");
5         user.setBirthday(new Date());
6         user.setAddress("北京2");
7         user.setSex("女2");
8         sqlSession.update("updateUserById",user);
9         sqlSession.commit();
1 <update id="updateUserById" 
2     parameterType="com.mybatis.pojo.User"
3     >
4     update user 
5     set username=#{username},sex=#{sex} where id = #{id}
6     </update>

8.4 刪除

呼叫語句:sqlSession.delete("deleteUserById", 1);

User.xml中:<delete id="deleteUserById" parameterType="Integer">

delete user where id = #{x}
</delete>

9.Mybatis解決jdbc的問題

  1、資料庫連線建立、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用資料庫連線池可解決此問題。

  解決:在SqlMapConfig.xml中配置資料連線池,使用連線池管理資料庫連結。

  2、Sql語句寫在程式碼中造成程式碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java程式碼。

  解決:將Sql語句配置在XXXXmapper.xml檔案中與java程式碼分離。

  3、向sql語句傳引數麻煩,因為sql語句的where條件不一定,可能多也可能少,佔位符需要和引數一一對應。

  解決:Mybatis自動將java物件對映至sql語句,通過statement中的parameterType定義輸入引數的型別。

  4、對結果集解析麻煩,sql變化導致解析程式碼變化,且解析前需要遍歷,如果能將資料庫記錄封裝成pojo物件解析比較方便。

  解決:Mybatis自動將sql執行結果對映至java物件,通過statement中的resultType定義輸出結果的型別。