mybatis 詳解(二)------入門實例(基於XML)

經過上一小節,mybatis 和 jdbc 的區別:http://www.cnblogs.com/ysocean/p/7271600.html,咱們對 mybatis有了一個大體的瞭解,下面咱們經過一個入門實例來對mybatis有更近一步的瞭解。html

  咱們用 mybatis 來對 user 表進行增刪改查操做。java

   ps:本篇博客源代碼連接:http://pan.baidu.com/s/1eSEfc8i 密碼:j480mysql

一、建立MySQL數據庫:mybatisDemo和表:user

  這裏咱們就不寫腳本建立了,建立完成後,再向其中插入幾條數據便可。spring

  user 表字段以下:sql

  

 

  

 

二、創建一個Java工程,並導入相應的jar包,具體目錄以下

  注意:log4j和Junit不是必須的,可是咱們爲了查看日誌以及便於測試,加入了這兩個jar包數據庫

  

 

三、在 MyBatisTest 工程中添加數據庫配置文件 mybatis-configuration.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version= "1.0"  encoding= "UTF-8" ?>
<!DOCTYPE configuration PUBLIC  "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
 
<!-- 注意:environments標籤,當mybatis和spring整合以後,這個標籤是不用配置的 -->
 
<!-- 能夠配置多個運行環境,可是每一個 SqlSessionFactory 實例只能選擇一個運行環境  
   1、development:開發模式
    2、work:工做模式-->
  <environments  default = "development" >
  <!--id屬性必須和上面的 default 同樣  -->
     <environment id= "development" >
     <!--事務管理器
         1、JDBC:這個配置直接簡單使用了 JDBC 的提交和回滾設置。它依賴於從數據源獲得的鏈接來管理事務範圍
         2、MANAGED:這個配置幾乎沒作什麼。它歷來不提交或回滾一個鏈接。而它會讓容器來管理事務的整個生命週期
             好比 spring 或 JEE 應用服務器的上下文,默認狀況下,它會關閉鏈接。然而一些容器並不但願這樣,
             所以若是你須要從鏈接中中止它,就能夠將 closeConnection 屬性設置爲  false ,好比:
             <transactionManager type= "MANAGED" >
                 <property name= "closeConnection"  value= "false" />
             </transactionManager>
       -->
       <transactionManager type= "JDBC" />
       <!--dataSource 元素使用標準的 JDBC 數據源接口來配置 JDBC 鏈接對象源  -->
       <dataSource type= "POOLED" >
         <property name= "driver"  value= "com.mysql.jdbc.Driver" />
         <property name= "url"  value= "jdbc:mysql://localhost:3306/mybatisdemo" />
         <property name= "username"  value= "root" />
         <property name= "password"  value= "root" />
       </dataSource>
     </environment>
   </environments>
   
</configuration>

  

四、定義表所對應的實體類

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package  com.ys.po;
 
import  java.util.Date;
 
public  class  User {
     private  int  id;
     private  String username;
     private  String sex;
     private  Date birthday;
     private  String address;
     public  int  getId() {
         return  id;
     }
     public  void  setId( int  id) {
         this .id = id;
     }
     public  String getUsername() {
         return  username;
     }
     public  void  setUsername(String username) {
         this .username = username;
     }
     public  String getSex() {
         return  sex;
     }
     public  void  setSex(String sex) {
         this .sex = sex;
     }
     public  Date getBirthday() {
         return  birthday;
     }
     public  void  setBirthday(Date birthday) {
         this .birthday = birthday;
     }
     public  String getAddress() {
         return  address;
     }
     public  void  setAddress(String address) {
         this .address = address;
     }
     @Override
     public  String toString() {
         return  "User [id="  + id +  ", username="  + username +  ", sex="  + sex
                 ", birthday="  + birthday +  ", address="  + address +  "]" ;
     }
}

 

 

五、定義操做 user 表的sql映射文件userMapper.xml  

  

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?xml version= "1.0"  encoding= "UTF-8"  ?>
<!DOCTYPE mapper
   PUBLIC  "-//mybatis.org//DTD Mapper 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace= "com.ys.po.userMapper" >
 
     <!-- 根據 id 查詢 user 表中的數據
        id:惟一標識符,此文件中的id值不能重複
        resultType:返回值類型,一條數據庫記錄也就對應實體類的一個對象
        parameterType:參數類型,也就是查詢條件的類型
     -->
     <select id= "selectUserById"
             resultType= "com.ys.po.User"  parameterType= "int" >
         <!-- 這裏和普通的sql 查詢語句差很少,對於只有一個參數,後面的 #{id}表示佔位符,裏面不必定要寫id,寫啥均可以,可是不要空着,若是有多個參數則必須寫pojo類裏面的屬性 -->
         select * from user where id = #{id}
     </select>
   
     
     <!-- 查詢 user 表的全部數據
         注意:由於是查詢全部數據,因此返回的應該是一個集合,這個集合裏面每一個元素都是User類型
      -->
     <select id= "selectUserAll"  resultType= "com.ys.po.User" >
         select * from user
     </select>
     
     <!-- 模糊查詢:根據 user 表的username字段
             下面兩種寫法均可以,可是要注意
             1 、${value}裏面必需要寫value,否則會報錯
             2 、${}表示拼接 sql 字符串,將接收到的參數不加任何修飾拼接在sql語句中
             3 、使用${}會形成 sql 注入
      -->
     <select id= "selectLikeUserName"  resultType= "com.ys.po.User"  parameterType= "String" >
         select * from user where username like  '%${value}%'
         <!-- select * from user where username like #{username} -->
     </select>
     
     <!-- 向 user 表插入一條數據 -->
     <insert id= "insertUser"  parameterType= "com.ys.po.User" >
         insert into user(id,username,sex,birthday,address)
             value(#{id},#{username},#{sex},#{birthday},#{address})
     </insert>
     
     <!-- 根據 id 更新 user 表的數據 -->
     <update id= "updateUserById"  parameterType= "com.ys.po.User" >
         update user set username=#{username} where id=#{id}
     </update>
     
     <!-- 根據 id 刪除 user 表的數據 -->
     <delete id= "deleteUserById"  parameterType= "int" >
         delete from user where id=#{id}
     </delete>
</mapper>

  

 

六、向 mybatis-configuration.xml 配置文件中註冊 userMapper.xml 文件

  

1
2
3
4
5
<mappers>
        <!-- 註冊userMapper.xml文件,
        userMapper.xml位於com.ys.mapper這個包下,因此resource寫成com/ys/mapper/userMapper.xml-->
        <mapper resource= "com/ys/mapper/userMapper.xml" />
</mappers>

  

 

 七、建立測試類

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package  com.ys.test;
 
import  java.io.InputStream;
import  java.util.List;
 
import  org.apache.ibatis.session.SqlSession;
import  org.apache.ibatis.session.SqlSessionFactory;
import  org.apache.ibatis.session.SqlSessionFactoryBuilder;
import  org.junit.Before;
import  org.junit.Test;
 
import  com.ys.po.User;
 
public  class  CRUDTest {
     //定義 SqlSession
     SqlSession session = null ;
     
     @Before
     public  void  init(){
         //定義mybatis全局配置文件
         String resource =  "mybatis-configuration.xml" ;
         //加載 mybatis 全局配置文件
         InputStream inputStream = CRUDTest. class .getClassLoader()
                                     .getResourceAsStream(resource);
         //構建sqlSession的工廠
         SqlSessionFactory sessionFactory =  new  SqlSessionFactoryBuilder().build(inputStream);
         //根據 sqlSessionFactory 產生 session
         session = sessionFactory.openSession();
     }
     
     //根據id查詢user表數據
     @Test
     public  void  testSelectUserById(){
         /*這個字符串由 userMapper.xml 文件中 兩個部分構成
             <mapper namespace="com.ys.po.userMapper"> 的 namespace 的值
             <select id="selectUserById" > id 值*/
         String statement =  "com.ys.po.userMapper.selectUserById" ;
         User user = session.selectOne(statement,  1 );
         System.out.println(user);
         session.close();
     }
     
     //查詢全部user表全部數據
     @Test
     public  void  testSelectUserAll(){
         String statement =  "com.ys.po.userMapper.selectUserAll" ;
         List<User> listUser = session.selectList(statement);
         for (User user : listUser){
             System.out.println(user);
         }
         session.close();
     }
     
     //模糊查詢:根據 user 表的username字段
     @Test
     public  void  testSelectLikeUserName(){
         String statement =  "com.ys.po.userMapper.selectLikeUserName" ;
         List<User> listUser = session.selectList(statement,  "%t%" );
         for (User user : listUser){
             System.out.println(user);
         }
         session.close();
         
     }
     //向 user 表中插入一條數據
     @Test
     public  void  testInsertUser(){
         String statement =  "com.ys.po.userMapper.insertUser" ;
         User user =  new  User();
         user.setUsername( "Bob" );
         user.setSex( "女" );
         session.insert(statement, user);
         //提交插入的數據
         session.commit();
         session.close();
     }
     
     //根據 id 更新 user 表的數據
     @Test
     public  void  testUpdateUserById(){
         String statement =  "com.ys.po.userMapper.updateUserById" ;
         //若是設置的 id不存在,那麼數據庫沒有數據更改
         User user =  new  User();
         user.setId( 4 );
         user.setUsername( "jim" );
         session.update(statement, user);
         session.commit();
         session.close();
     }
     
 
     //根據 id 刪除 user 表的數據
     @Test
     public  void  testDeleteUserById(){
         String statement =  "com.ys.po.userMapper.deleteUserById" ;
         session.delete(statement, 4 );
         session.commit();
         session.close();
     }
}

  

補充:如何獲得插入數據以後的主鍵值?

第一種:數據庫設置主鍵自增機制apache

    userMapper.xml 文件中定義:服務器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- 向 user 表插入一條數據 -->
     <insert id= "insertUser"  parameterType= "com.ys.po.User" >
         <!-- 將插入的數據主鍵返回到 user 對象中
              keyProperty:將查詢到的主鍵設置到parameterType 指定到對象的那個屬性
              select LAST_INSERT_ID():查詢上一次執行insert 操做返回的主鍵id值,只適用於自增主鍵
              resultType:指定 select LAST_INSERT_ID() 的結果類型
              order:AFTER,相對於 select LAST_INSERT_ID()操做的順序
          -->
         <selectKey keyProperty= "id"  resultType= "int"  order= "AFTER" >
             select LAST_INSERT_ID()
         </selectKey>
         insert into user(username,sex,birthday,address)
             value(#{username},#{sex},#{birthday},#{address})
     </insert>

    測試:session

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//向 user 表中插入一條數據並獲取主鍵值
     @Test
     public  void  testInsertUser(){
         String statement =  "com.ys.po.userMapper.insertUser" ;
         User user =  new  User();
         user.setUsername( "Bob" );
         user.setSex( "女" );
         session.insert(statement, user);
         //提交插入的數據
         session.commit();
         //打印主鍵值
         System.out.println(user.getId());
         session.close();
     }

  

第二種:非自增主鍵機制mybatis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 向 user 表插入一條數據 -->
     <insert id= "insertUser"  parameterType= "com.ys.po.User" >
         <!-- 將插入的數據主鍵返回到 user 對象中
         流程是:首先經過 select UUID()獲得主鍵值,而後設置到 user 對象的id中,在進行 insert 操做
              keyProperty:將查詢到的主鍵設置到parameterType 指定到對象的那個屬性
              select UUID():獲得主鍵的id值,注意這裏是字符串
              resultType:指定 select UUID() 的結果類型
              order:BEFORE,相對於 select UUID()操做的順序
          -->
         <selectKey keyProperty= "id"  resultType= "String"  order= "BEFORE" >
             select UUID()
         </selectKey>
         insert into user(id,username,sex,birthday,address)
             value(#{id},#{username},#{sex},#{birthday},#{address})
     </insert>

  

    

 

總結:

  ①、parameterType:指定輸入參數的類型

  ②、resultType:指定輸出結果的類型,在select中若是查詢結果是集合,那麼也表示集合中每一個元素的類型

  ③、#{}:表示佔位符,用來接收輸入參數,類型能夠是簡單類型,pojo,HashMap等等

    若是接收簡單類型,#{}能夠寫成 value 或者其餘名稱

    若是接收 pojo 對象值,經過 OGNL 讀取對象中的屬性值,即屬性.屬性.屬性...的方式獲取屬性值

  ④、${}:表示一個拼接符,會引發 sql 注入,不建議使用  

    用來接收輸入參數,類型能夠是簡單類型,pojo,HashMap等等

    若是接收簡單類型,${}裏面只能是 value

    若是接收 pojo 對象值,經過 OGNL 讀取對象中的屬性值,即屬性.屬性.屬性...的方式獲取屬性值

相關文章
相關標籤/搜索