1. 程式人生 > >學習筆記-MyBatis入門

學習筆記-MyBatis入門

hiberna 方法 java對象 ssi org 元素 his ktr utf-8

1.MyBatis簡介

MyBatis 是支持定制化SQL、存儲過程以及高級映射的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以對配置和原生Map使用簡單的 XML 或註解,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。

2.例子

1)首先創建一個java web項目

技術分享圖片

2)導入所需要的jar包

鏈接:https://pan.baidu.com/s/1BkC3eNpqpX-ITXaBHbHzFg 密碼:r3hj

技術分享圖片

3)創建數據庫user和表user,使用utf-8編碼

技術分享圖片

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     <properties resource="mysql.properties"></properties>
 6
7 <!-- <typeAliases> --> 8 <!-- <typeAlias alias="UserBean" type="com.cxy.mybatis.bean.UserBean" /> --> 9 <!-- </typeAliases> --> 10 11 <!-- 配置mybatis運行環境,可以配置多個,在具體用時再做切換 --> 12 <environments default="test"> 13
<environment id="test"> 14 <!-- type="JDBC" 代表使用JDBC的提交和回滾來管理事務 --> 15 <!-- 事務管理類型:JDBC、MANAGED --> 16 <transactionManager type="JDBC" /> 17 18 <!-- mybatis提供了3種數據源類型,分別是:POOLED,UNPOOLED,JNDI --> 19 <!-- POOLED 表示支持JDBC數據源連接池 --> 20 <!-- UNPOOLED 表示不支持數據源連接池 --> 21 <!-- JNDI 表示支持外部數據源連接池 --> 22 <dataSource type="POOLED"> 23 <property name="driver" value="${jdbc.driver}" /> 24 <property name="url" value="${jdbc.url}" /> 25 <property name="username" value="${jdbc.username}" /> 26 <property name="password" value="${jdbc.password}" /> 27 </dataSource> 28 </environment> 29 </environments> 30 31 <mappers> 32 <!-- 告知映射文件方式1,一個一個的配置--> 33 <mapper resource="com/cxy/mybatis/mapper/UserMapper.xml"/> 34 <!-- 告知映射文件方式2,自動掃描包內的Mapper接口與配置文件 --> 35 <!-- <package name="com/cxy/bean"/> --> 36 </mappers> 37 </configuration>

6)創建實體類(UserBean.java)

 1 package com.cxy.mybatis.bean;
 2 
 3 /**
 4  * 用戶實體類
 5  * @author cxy
 6  *
 7  */
 8 public class UserBean {
 9     public UserBean() {
10         super();
11     }
12     public UserBean(int id, String name, int sex, String website, String phone) {
13         super();
14         this.id = id;
15         this.name = name;
16         this.sex = sex;
17         this.website = website;
18         this.phone = phone;
19     }
20     private int id;
21     private String name;
22     private int sex;
23     private String website;
24     private String phone;
25     public int getId() {
26         return id;
27     }
28     public void setId(int id) {
29         this.id = id;
30     }
31     public String getName() {
32         return name;
33     }
34     public void setName(String name) {
35         this.name = name;
36     }
37     public int getSex() {
38         return sex;
39     }
40     public void setSex(int sex) {
41         this.sex = sex;
42     }
43     public String getWebsite() {
44         return website;
45     }
46     public void setWebsite(String website) {
47         this.website = website;
48     }
49     public String getPhone() {
50         return phone;
51     }
52     public void setPhone(String phone) {
53         this.phone = phone;
54     }
55     @Override
56     public String toString() {
57         return "UserBean [id=" + id + ", name=" + name + ", sex=" + sex
58                 + ", website=" + website + ", phone=" + phone + "]";
59     }
60     
61 }

7)創建接口(UserMapper.java)

 1 package com.cxy.mybatis.mapper;
 2 
 3 import java.util.List;
 4 
 5 import com.cxy.mybatis.bean.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) 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 }

8)創建映射文件(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.cxy.mybatis.mapper.UserMapper">
 4     <!-- 在各種標簽中的id屬性必須和接口中的方法名相同 , id屬性值必須是唯一的,不能夠重復使用。-->
 5     <!-- parameterType屬性指明查詢時使用的參數類型,resultType屬性指明查詢返回的結果集類型-->
 6     <!-- useGeneratedKeys:(僅 對 insert有 用 )這 會 告 訴 MyBatis使 用 JDBC的getGeneratedKeys方法來取出由數據(比如:像 MySQL 和 SQLServer 這樣的數據庫管理系統的自動遞增字段)內部生成的主鍵。默認值: false。 -->    
 7     <!-- keyProperty:(僅對 insert有用 )標記一個屬性, MyBatis會通過 getGeneratedKeys或者通過 insert語句的 selectKey子元素設置它的值。默認:不設置。 -->
 8     <!-- #{}中的內容,為占位符,當參數為某個JavaBean時,表示放置該Bean對象的屬性值  -->
 9 
10     <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
11         insert into user (id,name,sex,website,phone) values (#{id},#{name},#{website},#{sex},#{phone})
12     </insert>
13     
14     <update id="updateUser" >
15           update user set id=#{id},name=#{name},sex=#{sex},website=#{website},phone=#{phone} where id=#{id}
16     </update>
17     
18     <delete id="deleteUser" parameterType="int">
19          delete from user where id=#{id}  
20     </delete>
21     
22     <select id="selectUserById" parameterType="int" resultType="com.cxy.mybatis.bean.UserBean">
23          select * from user where id=#{id}
24     </select>
25     
26     <select id="selectAllUser" resultType="com.cxy.mybatis.bean.UserBean">
27          select * from user
28     </select>
29 </mapper>

註:

1、配置文件 mybatis.cfg.xml 是 mybatis 用來建立 sessionFactory,裏面主要包含了數據庫連接相關內容,還有 java 類所對應的別名,比如:<typeAlias alias="UserBean" type="com.cxy.mybatis.bean.UserBean"/> 這個別名非常重要,在具體的類的映射中,比如:UserMapper.xml 中 resultType 就是對應這個。要保持一致,這裏的 resultType 還有另外單獨的定義方式。
2、mybatis.cfg.xml 裏面 的<mapper resource="com/cxy/mybatis/mapper/UserMapper.xml"/>是包含要映射的類的 xml 配置文件。
3、在UserMapper.xml 文件裏面主要是定義各種 SQL 語句,以及這些語句的參數,以及要返回的類型等等。

9)創建工具類(DBTools.java)

 1 package com.cxy.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             String resource = "mybatis.cfg.xml";
16             //使用MyBatis提供的Resources類加載mybatis的配置文件
17             Reader reader = Resources.getResourceAsReader(resource);
18             //構建sqlSession的工廠
19             sessionFactory = new SqlSessionFactoryBuilder().build(reader);
20         } catch (Exception e) {
21             e.printStackTrace();
22         }
23         
24     }
25     //創建能執行映射文件中sql的sqlSession
26     public static SqlSession getSession(){
27         return sessionFactory.openSession();
28     }
29     
30 }

10)創建測試類(UserService.java)

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

3.總結

MyBatis的優點:

1. 基於SQL語法,簡單易學。

2. sql寫在xml裏,便於統一管理和優化。

3. 降低sql與程序代碼的耦合。

4. 提供映射標簽,支持對象與數據庫的orm字段關系映射

5. 提供對象關系映射標簽,支持對象關系組建維護

6. 提供xml標簽,支持編寫動態sql。

7. 能了解底層組裝過程。

8. 傳統的jdbc相比,減少了大量的代碼量,是最簡單的持久化框架。

9. 所有sql語句,全部定義在xml(建議)中。也可以通過註解的方式在接口上實現。這些映射文件稱之為mapper.

10. sql代碼從程序代碼中徹底分離,可重用,增強了項目中的分工,增強了移植性

MyBatis的缺點:

1. sql工作量很大,尤其是字段多、關聯表多時,更是如此。

2. sql依賴於數據庫,導致數據庫移植性差。

3. 由於xml裏標簽id必須唯一,導致DAO中方法不支持方法重載。

4. 字段映射標簽和對象關系映射標簽僅僅是對映射關系的描述,具體實現仍然依賴於sql。(比如配置了一對多Collection標簽,如果sql裏沒有join子表或查詢子表的話,查詢後返回的對象是不具備對象關系的,即Collection的對象為null)

5. DAO層過於簡單,對象組裝的工作量較大。

6. 不支持級聯更新、級聯刪除。

7. 編寫動態sql時,不方便調試,尤其邏輯復雜時。

8 提供的寫動態sql的xml標簽功能簡單(連struts都比不上),編寫動態sql仍然受限,且可讀性低。

9. 若不查詢主鍵字段,容易造成查詢出的對象有“覆蓋”現象。

10. 參數的數據類型支持不完善。(如參數為Date類型時,容易報沒有get、set方法,需在參數上加@param)

11. 多參數時,使用不方便,功能不夠強大。(目前支持的方法有map、對象、註解@param以及默認采用012索引位的方式)

12. 緩存使用不當,容易產生臟數據。

總結:

mybatis的優點其實也是mybatis的缺點,正因為mybatis使用簡單,數據的可靠性、完整性的瓶頸便更多依賴於程序員對sql的使用水平上了。sql寫在xml裏,雖然方便了修改、優化和統一瀏覽,但可讀性很低,調試也非常困難,也非常受限,無法像jdbc那樣在代碼裏根據邏輯實現復雜動態sql拼接。mybatis簡單看就是提供了字段映射和對象關系映射的jdbc,省去了數據賦值到對象的步驟而已,除此以外並無太多作為,不要把它想象成hibernate那樣強大,簡單小巧易用上手,方便瀏覽修改sql就是它最大的優點了。

mybatis適用於小型且程序員能力較低的項目和人群使用,對於中大型項目來說我並不推薦使用,如果覺得hibernate效率低的話(實際上也是使用不當所致,hibernate是實際上是不適用於擁有高負載的工程項目),還不如直接用spring提供的jdbc簡單框架(Template),同樣支持對象映射。

學習筆記-MyBatis入門