深入理解MyBatis

MyBatis工作原理



下面作簡要概述:

  1. SqlMapConfig.xml,此文件作爲mybatis的全局配置文件,配置了mybatis的運行環境等信息。mapper.xml文件即sql映射文件,文件中配置了操作數據庫的sql語句,此文件需要在SqlMapConfig.xml中加載。
  2. 通過mybatis環境等配置信息構造SqlSessionFactory(即會話工廠)。
  3. 由會話工廠創建sqlSession即會話,操作數據庫需要通過sqlSession進行。
  4. mybatis底層自定義了Executor執行器接口操作數據庫,Executor接口有兩個實現,一個是基本執行器、一個是緩存執行器。
  5. MappedStatement也是mybatis一個底層封裝對象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個sql對應一個MappedStatement對象,sql的id即是MappedStatement的id
  6. MappedStatement對sql執行輸入參數進行定義,包括HashMap、基本類型、pojo,Executor通過MappedStatement在執行sql前將輸入的java對象映射至sql中,輸入參數映射就是JDBC編程中對preparedStatement設置參數。
  7. MappedStatement對sql執行輸出結果進行定義,包括HashMap、基本類型、pojo,Executor通過MappedStatement在執行sql後將輸出結果映射至java對象中,輸出結果映射過程相當於JDBC編程中對結果的解析處理過程。

一、理解什麼是MyBatis?

MyBatis 是支持普通 SQL 查詢,存儲過程和高級映射的優秀持久層框架。 MyBatis 消除了幾乎所有的 JDBC 代碼和參數的手工設置以及對結果集的檢索。MyBatis 可以使用簡單的XML 或註解用於配置和原始映射,將接口和 Java 的 POJO( Plain Old Java Objects,普通的Java 對象)映射成數據庫中的記錄.
  1)MyBATIS 目前提供了三種語言實現的版本,包括:Java、.NET以及Ruby。(我主要學習java,就講java的使用)
  2)它提供的持久層框架包括SQL Maps和Data Access Objects(DAO)。
  3)mybatis與hibernate的對比?
   mybatis提供一種“半自動化”的ORM實現。
   這裏的“半自動化”,是相對Hibernate等提供了全面的數據庫封裝機制的“全自動化”ORM實現而言,“全自動”ORM實現了POJO和數據庫表之間的映射,以及 SQL 的自動生成和執行。
    而mybatis的着力點,則在於POJO與SQL之間的映射關係。

 

二、簡單例子(快速入門)

 1)首先建立項目java web

  

2)導入mybatis所需的jar包

mybatis需要jar包:mybatis-3.3.0.jar

mysql驅動jar包:mysql-connector-java-5.1.15.-bin.jar

日誌記錄jar包:log4j.jar

3)創建數據庫數據(mysql)

 

4)mysql驅動配置文件(這樣可以優化性能) 

 我個人喜歡把所需要使用到的包先建立好。配置文件先創建好。

 

 

5)添加mybatis配置文件mybatis.cfg.xml

複製代碼
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
 3 <configuration>
 4 
 5   <!-- 引入外部配置文件 -->
 6   <properties resource="mysql.properties"></properties>
 7    
 8    <!-- 配置mybatis運行環境 -->
 9      <environments default="cybatis">
10         <environment id="cybatis">
11             <!-- type="JDBC" 代表使用JDBC的提交和回滾來管理事務 -->
12             <transactionManager type="JDBC" />
13             
14             <!-- mybatis提供了3種數據源類型,分別是:POOLED,UNPOOLED,JNDI -->
15             <!-- POOLED 表示支持JDBC數據源連接池 -->
16             <!-- UNPOOLED 表示不支持數據源連接池 -->
17             <!-- JNDI 表示支持外部數據源連接池 -->
18             <dataSource type="POOLED">
19                 <property name="driver" value="${jdbc.driver}" />
20                 <property name="url" value="${jdbc.url}" />
21                 <property name="username" value="${jdbc.username}" />
22                 <property name="password" value="${jdbc.password}" />
23             </dataSource>
24         </environment>
25     </environments> 
26     
27 </configuration>
複製代碼

 

 

6)創建對應的實體對象

 

對應的java代碼:

 View Code

 

 

7)創建方法接口UserMapper.java和定義操作t_user表的sql映射文件UserMapper.xml

 提供簡單的增刪改查數據信息。

複製代碼
 1 package com.cy.mybatis.mapper;
 2 
 3 import java.util.List;
 4 
 5 import com.cy.mybatis.beans.UserBean;
 6 
 7 public interface UserMapper {
 8     /**
 9      * 新增用戶
10      * @param user
11      * @return
12      * @throws Exception
13      */
14     public int insertUser(UserBean user) throws Exception;
15     /**
16      * 修改用戶
17      * @param user
18      * @param id
19      * @return
20      * @throws Exception
21      */
22     public int updateUser (UserBean user,int id) throws Exception;
23      /**
24       * 刪除用戶
25       * @param id
26       * @return
27       * @throws Exception
28       */
29     public int deleteUser(int id) throws Exception;
30     /**
31      * 根據id查詢用戶信息
32      * @param id
33      * @return
34      * @throws Exception
35      */
36     public UserBean selectUserById(int id) throws Exception;
37      /**
38       * 查詢所有的用戶信息
39       * @return
40       * @throws Exception
41       */
42     public List<UserBean> selectAllUser() throws Exception;
43 }
複製代碼

 

UserMapper.xml

複製代碼
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 3 <mapper namespace="com.cy.mybatis.mapper.UserMapper">
 4 <!-- 自定義返回結果集 -->
 5    <resultMap id="userMap" type="UserBean">
 6         <id property="id" column="id" javaType="java.lang.Integer"></id>
 7         <result property="username" column="username" javaType="java.lang.String"></result>
 8         <result property="password" column="password" javaType="java.lang.String"></result>
 9         <result property="account" column="account" javaType="java.lang.Double"></result>
10     </resultMap>
11 <!-- 在各種標籤中的id屬性必須和接口中的方法名相同 , id屬性值必須是唯一的,不能夠重複使用。parameterType屬性指明查詢時使用的參數類型,resultType屬性指明查詢返回的結果集類型-->    
12 <!-- useGeneratedKeys:( 僅 對 insert 有 用 ) 這 會 告 訴 MyBatis 使 用 JDBC 的getGeneratedKeys 
13             方法來取出由數據(比如:像 MySQL 和 SQLServer 這樣的數據庫管理系統的自動遞增字段)內部生成的主鍵。默認值: false。 -->    
14 <!--keyProperty: (僅對 insert有用)標記一個屬性, MyBatis 會通過 getGeneratedKeys或者通過 insert 語句的 selectKey 子元素設置它的值。默認:不設置。 -->
15 <!--#{}中的內容,爲佔位符,當參數爲某個JavaBean時,表示放置該Bean對象的屬性值  -->
16 
17 
18     <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
19         insert into t_user (username,password,account) values (#{username},#{password},#{account})
20     </insert>
21     
22     <update id="updateUser" >
23       update t_user set username=#{username},password=#{password},account=#{account} where id=#{id}
24     </update>
25     
26     <delete id="deleteUser" parameterType="int">
27      delete from t_user where id=#{id}  
28     </delete>
29     
30     <select id="selectUserById" parameterType="int" resultMap="userMap">
31      select * from t_user where id=#{id}
32     </select>
33     
34     <select id="selectAllUser" resultMap="userMap">
35      select * from t_user
36     </select>
37     
38     
39 </mapper>    
複製代碼

 

這時需要爲mybatis.cfg.xml裏註冊UserMapper.xml文件。

複製代碼
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
 3 <configuration>
 4 
 5   <!-- 引入外部配置文件 -->
 6   <properties resource="mysql.properties"></properties>
 7   
 8   
 9    <!-- 爲JAVA Bean起類別名 -->
10    <typeAliases >
11         <!-- 別名方式1,一個一個的配置 type中放置的是類的全路徑,alias中放置的是類別名
12         <typeAliase type="com.cy.mybatis.beans.UserBean" alias="UserBean"/> -->
13         <!-- 別名方式2,自動掃描,將JAVA類的類名作爲類的類別名 -->
14         <package name="com.cy.mybatis.beans"/>
15    </typeAliases>
16    
17    
18    <!-- 配置mybatis運行環境 -->
19      <environments default="cybatis">
20         <environment id="cybatis">
21             <!-- type="JDBC" 代表使用JDBC的提交和回滾來管理事務 -->
22             <transactionManager type="JDBC" />
23             
24             <!-- mybatis提供了3種數據源類型,分別是:POOLED,UNPOOLED,JNDI -->
25             <!-- POOLED 表示支持JDBC數據源連接池 -->
26             <!-- UNPOOLED 表示不支持數據源連接池 -->
27             <!-- JNDI 表示支持外部數據源連接池 -->
28             <dataSource type="POOLED">
29                 <property name="driver" value="${jdbc.driver}" />
30                 <property name="url" value="${jdbc.url}" />
31                 <property name="username" value="${jdbc.username}" />
32                 <property name="password" value="${jdbc.password}" />
33             </dataSource>
34         </environment>
35     </environments> 
36     
37     
38     <mappers>
39         <!-- 告知映射文件方式1,一個一個的配置
40         <mapper resource="com/cy/mybatis/mapper/UserMapper.xml"/>-->
41         <!-- 告知映射文件方式2,自動掃描包內的Mapper接口與配置文件 -->
42         <package name="com/cy/mybatis/mapper"/>
43     </mappers>
44 </configuration>
複製代碼

 

 

8)需要建立一個工具類文件

 

複製代碼
 1 package com.cy.mybatis.tools;
 2 
 3 import java.io.Reader;
 4 
 5 import org.apache.ibatis.io.Resources;
 6 import org.apache.ibatis.session.SqlSession;
 7 import org.apache.ibatis.session.SqlSessionFactory;
 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 9 
10 public class DBTools {
11     public static SqlSessionFactory sessionFactory;
12     
13     static{
14         try {
15             //使用MyBatis提供的Resources類加載mybatis的配置文件
16             Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
17             //構建sqlSession的工廠
18             sessionFactory = new SqlSessionFactoryBuilder().build(reader);
19         } catch (Exception e) {
20             e.printStackTrace();
21         }
22         
23     }
24     //創建能執行映射文件中sql的sqlSession
25     public static SqlSession getSession(){
26         return sessionFactory.openSession();
27     }
28     
29 }
複製代碼

 

 

9)寫個測試

複製代碼
 1 package com.cy.mybatis.service;
 2 
 3 import java.util.List;
 4 
 5 import org.apache.ibatis.session.SqlSession;
 6 
 7 import com.cy.mybatis.beans.UserBean;
 8 import com.cy.mybatis.tools.DBTools;
 9 import com.cy.mybatis.mapper.UserMapper;
10 
11 public class UserService {
12 
13    
14 15      
16     public static void main(String[] args) {
17           insertUser();
18 //        deleteUser();
19 //        selectUserById();
20 //        selectAllUser();
21     }
22 
23     
24     /**
25      * 新增用戶
26      */
27     private static void insertUser() {
28         SqlSession session = DBTools.getSession();
29         UserMapper mapper = session.getMapper(UserMapper.class);
30         UserBean user = new UserBean("懿", "1314520", 7000.0);
31         try {
32             mapper.insertUser(user);
33             System.out.println(user.toString());
34              session.commit();
35         } catch (Exception e) {
36             e.printStackTrace();
37             session.rollback();
38         }
39     }
40     
41     
42     /**
43      * 刪除用戶
44      */
45     private static void deleteUser(){
46         SqlSession session=DBTools.getSession();
47         UserMapper mapper=session.getMapper(UserMapper.class);
48         try {
49             mapper.deleteUser(1);
50             session.commit();
51         } catch (Exception e) {
52             e.printStackTrace();
53             session.rollback();
54         }
55     }
56     
57     
58     /**
59      * 根據id查詢用戶
60      */
61     private static void selectUserById(){
62         SqlSession session=DBTools.getSession();
63         UserMapper mapper=session.getMapper(UserMapper.class);
64         try {
65         UserBean user=    mapper.selectUserById(2);
66         System.out.println(user.toString());
67             
68             session.commit();
69         } catch (Exception e) {
70             e.printStackTrace();
71             session.rollback();
72         }
73     }
74     
75     /**
76      * 查詢所有的用戶
77      */
78     private static void selectAllUser(){
79         SqlSession session=DBTools.getSession();
80         UserMapper mapper=session.getMapper(UserMapper.class);
81         try {
82         List<UserBean> user=mapper.selectAllUser();
83         System.out.println(user.toString());
84         session.commit();
85         } catch (Exception e) {
86             e.printStackTrace();
87             session.rollback();
88         }
89     }
90     
91 
92 }
複製代碼

 

測試結果

insert。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章