搭建一個簡單的mybatis框架

一、Mybatis介紹

  

  MyBatis是一個支持普通SQL查詢存儲過程高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數的手工設置以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或注解用于配置和原始映射,將接口和Java的POJO(Plain Old Java Objects,普通的Java對象)映射成數據庫中的記錄。

1、Mybatis實現了接口綁定,使用更加方便。

? ? ? 在ibatis2.x中我們需要在DAO的實現類中指定具體對應哪個xml映射文件, 而Mybatis實現了DAO接口與xml映射文件的綁定,自動為我們生成接口的具體實現,使用起來變得更加省事和方便。

2、對象關系映射的改進,效率更高

3、MyBatis采用功能強大的基于OGNL的表達式來消除其他元素。

? ? ? ?對于IBatis與MyBatis的區別就不再多說了,感興趣的朋友可以研究一下

MyBatis的框架架構

?

? ? ? ? ? ?

? ? ? ? 看到Mybatis的框架圖,可以清晰的看到Mybatis的整體核心對象,我更喜歡用自己的圖來表達Mybatis的整個的執行流程。如下圖所示:

? ? ? ? ? ? ?

原理詳解:

? ? ? ? MyBatis應用程序根據XML配置文件創建SqlSessionFactory,SqlSessionFactory在根據配置,配置來源于兩個地方,一處是配置文件,一處是Java代碼的注解,獲取一個SqlSession。SqlSession包含了執行sql所需要的所有方法,可以通過SqlSession實例直接運行映射的sql語句,完成對數據的增刪改查和事務提交等,用完之后關閉SqlSession。??

MyBatis的優缺點

優點:

1、簡單易學

? ? ? ?mybatis本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar文件+配置幾個sql映射文件易于學習,易于使用,通過文檔和源代碼,可以比較完全的掌握它的設計思路和實現

2、靈活

? ? ? ?mybatis不會對應用程序或者數據庫的現有設計強加任何影響。 sql寫在xml里,便于統一管理和優化。通過sql基本上可以實現我們不使用數據訪問框架可以實現的所有功能,或許更多。

3、解除sql與程序代碼的耦合

? ? ? ?通過提供DAL層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和代碼的分離,提高了可維護性。

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

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

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

缺點:

1、編寫SQL語句時工作量很大,尤其是字段多、關聯表多時,更是如此。

2、SQL語句依賴于數據庫,導致數據庫移植性差,不能更換數據庫。

3、框架還是比較簡陋,功能尚有缺失,雖然簡化了數據綁定代碼,但是整個底層數據庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速數據庫修改。??

4、二級緩存機制不佳?

總結

? ? ? mybatis的優點同樣是mybatis的缺點,正因為mybatis使用簡單,數據的可靠性、完整性的瓶頸便更多依賴于程序員對sql的使用水平上了。sql寫在xml里,雖然方便了修改、優化和統一瀏覽,但可讀性很低,調試也非常困難,也非常受限。

? ? ? mybatis沒有hibernate那么強大,但是mybatis最大的優點就是簡單小巧易于上手,方便瀏覽修改sql語句。

二、mybatis快速入門

2.1、準備開發環境

?1、創建測試項目,普通java項目或者是JavaWeb項目均可,如下圖所示:

  

2、添加相應的jar包

  【mybatis

??????   mybatis-3.1.1.jar

  【MYSQL驅動包】
    mysql-connector-java-5.1.7-bin.jar

   

3、創建數據庫和表,針對MySQL數據庫

  SQL腳本如下:

1 create database mybatis;
2 use mybatis;
3 CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT);
4 INSERT INTO users(NAME, age) VALUES('孤傲蒼狼', 27);
5 INSERT INTO users(NAME, age) VALUES('白虎神皇', 27);

  將SQL腳本在MySQL數據庫中執行,完成創建數據庫和表的操作,如下:

  

  到此,前期的開發環境準備工作全部完成。

2.2、使用MyBatis查詢表中的數據

  1、添加Mybatis的配置文件conf.xml

  在src目錄下創建一個conf.xml文件,如下圖所示:

  

  conf.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     <environments default="development">5         <environment id="development">6             <transactionManager type="JDBC" />7             <!-- 配置數據庫連接信息 -->8             <dataSource type="POOLED">9                 <property name="driver" value="com.mysql.jdbc.Driver" />
10                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
11                 <property name="username" value="root" />
12                 <property name="password" value="XDP" />
13             </dataSource>
14         </environment>
15     </environments>
16     
17 </configuration>
復制代碼

  2、定義表所對應的實體類,如下圖所示:

  

  User類的代碼如下:

復制代碼
 1 package me.gacl.domain;2 3 /**4  * @author gacl5  * users表所對應的實體類6  */7 public class User {8 9     //實體類的屬性和表的字段名稱一一對應
10     private int id;
11     private String name;
12     private int age;
13 
14     public int getId() {
15         return id;
16     }
17 
18     public void setId(int id) {
19         this.id = id;
20     }
21 
22     public String getName() {
23         return name;
24     }
25 
26     public void setName(String name) {
27         this.name = name;
28     }
29 
30     public int getAge() {
31         return age;
32     }
33 
34     public void setAge(int age) {
35         this.age = age;
36     }
37 
38     @Override
39     public String toString() {
40         return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
41     }
42 }
復制代碼

  3、定義操作users表的sql映射文件userMapper.xml

  創建一個me.gacl.mapping包,專門用于存放sql映射文件,在包中創建一個userMapper.xml文件,如下圖所示:

  

  userMapper.xml文件的內容如下:

復制代碼
 1 <?xml version="1.0" encoding="UTF-8" ?>2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">3 <!-- 為這個mapper指定一個唯一的namespace,namespace的值習慣上設置成包名+sql映射文件名,這樣就能夠保證namespace的值是唯一的4 例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后綴)5  -->6 <mapper namespace="me.gacl.mapping.userMapper">7     <!-- 在select標簽中編寫查詢的SQL語句, 設置select標簽的id屬性為getUser,id屬性值必須是唯一的,不能夠重復8     使用parameterType屬性指明查詢時使用的參數類型,resultType屬性指明查詢返回的結果集類型9     resultType="me.gacl.domain.User"就表示將查詢結果封裝成一個User類的對象返回
10     User類就是users表所對應的實體類
11     -->
12     <!-- 
13         根據id查詢得到一個user對象
14      -->
15     <select id="getUser" parameterType="int" 
16         resultType="me.gacl.domain.User">
17         select * from users where id=#{id}
18     </select>
19 </mapper>
復制代碼

  4、在conf.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     <environments default="development">5         <environment id="development">6             <transactionManager type="JDBC" />7             <!-- 配置數據庫連接信息 -->8             <dataSource type="POOLED">9                 <property name="driver" value="com.mysql.jdbc.Driver" />
10                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
11                 <property name="username" value="root" />
12                 <property name="password" value="XDP" />
13             </dataSource>
14         </environment>
15     </environments>
16     
17     <mappers>
18         <!-- 注冊userMapper.xml文件, 
19         userMapper.xml位于me.gacl.mapping這個包下,所以resource寫成me/gacl/mapping/userMapper.xml-->
20         <mapper resource="me/gacl/mapping/userMapper.xml"/>
21     </mappers>
22     
23 </configuration>
復制代碼

  5、編寫測試代碼:執行定義的select語句

  創建一個Test1類,編寫如下的測試代碼:

復制代碼
package me.gacl.test;import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import me.gacl.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class Test1 {public static void main(String[] args) throws IOException {//mybatis的配置文件String resource = "conf.xml";//使用類加載器加載mybatis的配置文件(它也加載關聯的映射文件)InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);//構建sqlSession的工廠SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);//使用MyBatis提供的Resources類加載mybatis的配置文件(它也加載關聯的映射文件)//Reader reader = Resources.getResourceAsReader(resource); //構建sqlSession的工廠//SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);//創建能執行映射文件中sql的sqlSessionSqlSession session = sessionFactory.openSession();/*** 映射sql的標識字符串,* me.gacl.mapping.userMapper是userMapper.xml文件中mapper標簽的namespace屬性的值,* getUser是select標簽的id屬性值,通過select標簽的id屬性值就可以找到要執行的SQL*/

      //在命名空間“me.gacl.mapping.userMapper”中定義了一個名為“getUser”的映射語句,
      //這樣它就允許你使用指定的完全限定名“me.gacl.mapping.userMapper.getUser”來調用映射語句,
      //格式:命名空間名(namespace)+映射語句名(id)

        String statement = "me.gacl.mapping.userMapper.getUser";//映射sql的標識字符串//執行查詢返回一個唯一user對象的sqlUser user = session.selectOne(statement, 1);System.out.println(user);}
}
復制代碼

  執行結果如下:

  

  可以看到,數據庫中的記錄已經成功查詢出來了。

轉載于:https://www.cnblogs.com/huangjinwen/p/6061697.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372033.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372033.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372033.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

定時操作范例

1 package timetask.demo;2 3 import java.text.SimpleDateFormat;4 import java.util.Date;5 import java.util.Timer;6 import java.util.TimerTask;7 8 /*9 * time類 是一個線程實施&#xff0c;可以用來實現在某一個時間或者某一個時間段后安排某一個任務執行一次或者定期…

c語言空格符 r t,c語言中、\t \r \n 和空格什么意思

具體意思&#xff1a;都是轉義字符&#xff0c;空格就是單純的空格&#xff0c;輸入時可以輸入空格\t 跳格 \r 回車 \n 換行\\ 反斜杠 \a 警告 \b 退格 \f 換頁 \v 垂直跳格 \ddd ddd 是 1、2 或 3 位八進制數字。轉義字符串(Escap…

如何在運行時更改日志記錄級別

在運行時中更改日志記錄級別很重要&#xff0c;這主要在生產環境中非常重要&#xff0c;在生產環境中&#xff0c;您可能希望在有限的時間內進行調試日志記錄。 好了&#xff0c;更改根記錄器非常簡單–假設您有一個具有所需記錄級別的輸入參數&#xff0c;只需獲取根記錄器并…

擴展中國剩余定理

轉自&#xff1a;http://blog.csdn.net/clove_unique/article/details/54571216 對于兩個方程$x\equiv c_1\pmod {m_1}$$x\equiv c_2\pmod {m_2}$將其合并為一個方程&#xff0c;有解條件為$(m1,m2)|(c2-c1)$$m\frac{m1m2}{(m1,m2)}$$c(inv(\frac{m1}{(m1,m2)},\frac{m2}{(m1,m…

易語言添加ctrl c鍵,易語言操作快捷鍵匯總

以下是關于易語言的快捷鍵內容&#xff1a;預覽被設計窗口 CtrlEnter運行 F5終止運行 CtrlF5編譯 F7菜單編輯器 CtrlE即時幫助 F1在編輯窗口之間跳轉。按下 Ctrl 鍵后不放&#xff0c;然后反復按 Tab 鍵可以在目前所有的編輯窗口之間跳轉&#xff1b;按下 Ctrl 鍵后同時按下 Ta…

在代理類中引用動態代理

在Stackoverflow中有一個有趣的問題 &#xff0c;關于Spring Bean如何獲??得對由Spring創建的代理的引用以處理事務&#xff0c;Spring AOP&#xff0c;緩存&#xff0c;異步流等。需要對代理的引用&#xff0c;因為如果存在對自身的調用通過代理bean&#xff0c;此調用將完全…

Array的用法總結-swift

Araay是有序的數據集&#xff0c;在OC中分為不可變數組NSArray和可變數組NSMutableArray&#xff0c;在swift中只有常量和變量兩種類型&#xff0c;聲明成變量那就可以說明是可變的了&#xff01; 學習時的具體的用法總結成如下的代碼&#xff1a; //數組var arrInts [Int]()/…

Frame URl

http://www.zi-han.net/theme/hplus/?v4.1 http://webapplayers.com/inspinia_admin-v2.5/ http://baijunyao.com/article/67 轉載于:https://www.cnblogs.com/shijiaoyun/p/6065755.html

linux的i o模型,淺談Linux 網絡 I/O 模型簡介(圖文)

1、介紹Linux 的內核將所有外部設備都看做一個文件來操作(一切皆文件)&#xff0c;對一個文件的讀寫操作會調用內核提供的系統命令&#xff0c;返回一個file descriptor(fd&#xff0c;文件描述符)。而對一個socket的讀寫也會有響應的描述符&#xff0c;稱為socket fd(socket文…

handsontable 方法匯總

核心方法1.為handsontable添加鉤子方法 addHook(key,callback):key為鉤子方法名 例如&#xff1a;hot.addHook(beforeInit, myCallback); addHookOnce(key,callback)&#xff1a;添加只使用一次的方法&#xff0c;用完后自動刪除 例如&#xff1a;hot.addHookOnce(beforeInit, …

swing中JTable的使用方法

1 public static void main(String[] args) {2 3 Student s1 new Student("張三", "001", 0);4 Student s2 new Student("李四", "002", 1);5 Student s3 new Student("王五", "003",…

android仿高德地圖透明黑字,Android 仿高德地圖可拉伸的BottomSheet

原標題&#xff1a;Android 仿高德地圖可拉伸的BottomSheet2018安卓巴士開發者大會-上海站你一直期待的安卓技術盛宴即將登場&#xff01;前言最近項目中需要用到高德地圖搜索結果后的結果展示的可拉伸控件。而我看到這個效果圖&#xff0c;覺得這個就是一個slidingpanel&#…

Java EE 7中包含哪些JSR?

我開始填寫所有應該加入Java EE 7的Java規范請求的表。 由于平臺版本仍在確定中&#xff0c;因此某些細節很難確定。 完整的Java EE 7 EJB產品具有以下標準組件和API&#xff1a; 名稱 版 描述 JSR 網頁 輪廓 批處理 1.0 批量處理 352 Bean驗證 1.1 Bean驗證框…

[ Javascript ] JavaScript中的定時器(Timer) 是怎樣工作的!

作為入門者來說。了解JavaScript中timer的工作方式是非常重要的。通常它們的表現行為并非那么地直觀&#xff0c;而這是由于它們都處在一個單一線程中。讓我們先來看一看三個用來創建以及操作timer的函數。var id setTimeout(fn, delay); - 初始化一個單一的timer&#xff0c…

android dropbox anr分析,Android如何分析排查ANR

釋放雙眼&#xff0c;帶上耳機&#xff0c;聽聽看~&#xff01;在Android開發中&#xff0c;當程序發生異常時會拋出異常信息&#xff0c;先說下三種常見類型&#xff1a;列表內容KeyDispatchTimeout(谷歌default 5s&#xff0c;MTK平臺上是8s) –主要類型按鍵或觸摸事件在特定…

修改httpd默認端口號

Tomcat: vim /etc/httpd/conf/httpd.conf//別忘了service httpd restart Nginx: vim /etc/nginx/nginx.conf//完了之后service nginx restart 轉載于:https://www.cnblogs.com/bincoding/p/6067054.html

整合彈簧,速度和瓷磚

我喜歡 Tiles&#xff0c; 并且聽到了很多有關 Velocity的信息 。 它們似乎有不同的用途&#xff0c;并且據說很容易結合在一起&#xff0c;所以我決定試一試&#xff0c;并在Spring Web應用程序中同時使用它們。 集成實際上花費了許多小時&#xff0c;并且是一次真正的過山車&…

Android 軟鍵盤自動彈出和關閉

在我們寫修改信息或者搜索&#xff0c;修改密碼等界面的時候&#xff0c;用戶進入這個界面的主要目的就是輸入修改/查找 某些信息&#xff0c;為了用戶體驗應該自動彈出軟鍵盤而不是讓用戶主動點擊輸入框才彈出。 1.軟鍵盤的自動彈出 private void showKeyboard(){InputMethodM…

android adb殺死服務,Android app是如何殺掉的

1. adb shell kill -9 pid_of_appAMS定義了AppDeathRecipientAPP 在 attachApplication -> attachApplicationLockedAMS里會注冊 App 進程的 BinderDeath通知AppDeathRecipient adr new AppDeathRecipient(app, pid, thread);thread.asBinder().linkToDeath(adr, 0);當App進…

iOS學習筆記39-ReactiveCocoa入門

FRP&#xff0c;全稱為Functional Reactive Programming&#xff0c;是一種響應變化的編程范式&#xff0c;最近幾年比較火&#xff0c;大概的理解就像這樣&#xff1a; 當a的值或者b的值發生變化時&#xff0c;c的值會自動響應a的值或b的值變化的信號&#xff0c;自動更正自己…