mybatis道理概述入門教程。本站提示廣大學習愛好者:(mybatis道理概述入門教程)文章只能為提供參考,不一定能成為您想要的結果。以下是mybatis道理概述入門教程正文
本文我將要引見一下mybatis的框架道理,和mybatis的入門法式,完成用戶的增刪改查,她有甚麼優缺陷和mybatis和hibernate之間存在著怎樣樣的關系,願望對小同伴們有贊助,缺乏的地方,還請多多指教。
甚麼是mybatis?
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷徙到了谷歌 code,而且更名為MyBatis 。2013年11月遷徙到Github。
MyBatis 是支撐定制化 SQL、存儲進程和高等映照的優良的耐久層框架。MyBatis 防止了簡直一切的 JDBC 代碼和手工設置參數和抽取成果集。MyBatis 應用簡略的 XML 或注解來設置裝備擺設和映照根本體,將接口和 Java 的 POJO(Plain Old Java Objects,通俗的 Java對象)映照成數據庫中的記載。簡略來講,mybatis就是一個耐久層的框架,mybatis讓法式將重要精神放在sql上,經由過程mybatis供給的映照方法,自在靈巧生成知足須要的sql語句,mybatis可以將向preparedStatement中的輸出參數主動停止輸出映照,將查詢成果集靈巧映照成java對象。
接著,我們經由過程一張圖,來懂得一下mybatis的框架道理:
框架架構講授:
a、加載設置裝備擺設文件:設置裝備擺設起源於兩個處所,一個是設置裝備擺設文件,一個是java代碼的注解,將sql的設置裝備擺設信息加載成為一個個MappedStatement對象(包含了傳入參數映照設置裝備擺設、履行的SQL語句、成果映照設置裝備擺設),存儲在內存中。
b、SQL解析:當api接口層吸收到挪用要求時,會吸收到傳入slq的id和傳入對象(可所以map或許根本數據類型),mybatis會依據sql的id找到對應的MappedStatement,然後依據傳入參數對象對MappedStatement停止解析,解析後可以獲得終究要履行的sql語句和參數。
c、 SQL履行:將終究獲得的SQL和參數拿到數據庫停止履行,獲得操作數據庫的成果。
d、成果映照:將操作數據庫的成果依照映照的設置裝備擺設停止轉換,可以轉換成HashMap、JavaBean或許根本數據類型,並將終究成果前往。
mybatis入門法式解析
接著,小編聯合demo來詳細引見一下,需求以下:
依據用戶id查詢用戶信息;
依據用戶稱號隱約查詢用戶信息;
添加、刪除、更新用戶。
第一步、樹立各類包和類,工程目次以下所示:
第二步、編寫SqlMapConfig.xml中的內容,設置裝備擺設mybatis的運轉情況,數據源,事務等。代碼以下所示:
<span ><?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> <!-- 將spring整合後environments設置裝備擺設將破除 --> <environments default="developent"> <!-- 應用jdbc事務治理,事務掌握由mybatis --> <transactionManager type="JDBC"/> <!-- 數據庫銜接池,由mybatis治理 --> <dataSource type="POLLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environments> <!-- 加載 映照文件 --> <mappers> <mapper resource="sqlmap/User.xml"/> </mappers> </configuration> </span>
第三步、編寫User.java中的內容,以下所示:
<span >package cn.itcast.mybatis.po; import java.util.Date; /** * * <p>Title: User</p> * <p>Description:用戶po </p> * @author 丁國華 * @date 2016年7月31日 15:39:04 * @version 1.0 */ 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 + "]"; } } </span>
第四步、完成增刪改查的功效,起首編寫User.xml中的內容,以下所示:
<span ><?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"> <!-- namespace定名空間,感化就是對sql停止分類化治理,懂得sql隔離 留意:應用mapper署理辦法開辟,namespace有特別主要的感化--> <mapper namespace="test"> <!-- 在 映照文件中設置裝備擺設許多sql語句 --> <!-- 需求:經由過程id查詢用戶表的記載 --> <!-- 經由過程 select履行數據庫查詢 id:標識 映照文件中的 sql 將sql語句封裝到mappedStatement對象中,所以將id稱為statement的id parameterType:指定輸出 參數的類型,這裡指定int型 #{}表現一個占位符號 #{id}:個中的id表現吸收輸出 的參數,參數稱號就是id,假如輸出 參數是簡略類型,#{}中的參數名可以隨意率性,可以value或其它稱號 resultType:指定sql輸入成果 的所映照的java對象類型,select指定resultType表現將單筆記錄映照成的java對象。 --> <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User"> SELECT * FROM USER WHERE id=#{value} </select> <!-- 依據用戶稱號隱約查詢用戶信息,能夠前往多條 resultType:指定就是單挑記載所映照的java對象類型 ${}:表現拼接sql串,將吸收到參數的內容不加任何潤飾拼接到sql中。 應用${}拼接sql,惹起sql注入 ${value}:吸收輸出參數的內容,假如傳入類型是簡略類型,${}中只能應用value --> <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User"> SELECT * FROM USER WHERE username LIKE '%${value}%' </select> <!-- 添加用戶 parameterType:指定輸出參數類型是pojo(包含用戶信息) #{}中指定pojo的屬性名,吸收到pojo對象的屬性值,mybatis經由過程OGNL獲得對象的屬性值 --> <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <!-- 將拔出數據的主鍵前往,前往到user對象中 SELECT LAST_INSERT_ID():獲得方才insert出來記載的主鍵值,只實用於自增主鍵 keyProperty:將查詢獲得主鍵值設置到parameterType指定的對象的誰人屬性 order:SELECT LAST_INSERT_ID()履行次序,絕對於insert語句來講她的履行次序 resultType:指定SELECT LAST_INSERT_ID()的成果類型 --> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> SELECT LAST_INSER_ID() </selectKey> insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}) <!-- 應用mysql的uuid()函數生成主鍵 履行進程,起首經由過程uuid獲得主鍵,將主鍵設置到user對象的id屬性中 其次,在insert履行的時刻,從user對象中,掏出id屬性值 --> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT uuid() </selectKey> insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}); </insert> <!-- 刪除用戶 依據id刪除用戶,須要輸出id值 --> <delete id="deleteUser" parameterType="java.lang.Integer"> delete from user where id=#{id} </delete> <!-- 依據id更新用戶 剖析: 須要傳入用戶的id 須要傳入用戶的更新信息 parameterType指定user對象,包含 id和更新信息,留意:id必需存在 #{id}:從輸出 user對象中獲得id屬性值 --> <update id="updateUser" parameterType="cn.itcast.mybatis.po.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper></span>
第五步、編寫詳細的辦法,以下所示:
<span >package cn.itcast.mybatis.first; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import cn.itcast.mybatis.po.User; public class MybatisFirst { // 依據id查詢用戶信息,獲得一筆記錄成果 @Test public void findUserByIdTest() throws IOException { // mybatis設置裝備擺設文件 String resource = "SqlMapConfig.xml"; // 獲得設置裝備擺設文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 創立會話工場,傳入mybatis的設置裝備擺設文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 經由過程工場獲得SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 經由過程SqlSession操作數據庫 // 第一個參數:映照文件中statement的id,等於=namespace+"."+statement的id // 第二個參數:指定和映照文件中所婚配的parameterType類型的參數 // sqlSession.selectOne成果 是與映照文件中所婚配的resultType類型的對象 // selectOne查詢出一筆記錄 User user = sqlSession.selectOne("test.findUserById", 1); System.out.println(user); // 釋放資本 sqlSession.close(); } //依據用戶稱號隱約查詢用戶列表 @Test public void findUserByNameTest() throws IOException{ //mybatis設置裝備擺設文件 String resource ="SqlMapConfig.xml"; //獲得設置裝備擺設文件 InputStream inputStream = Resources.getResourceAsStream(resource); //創立會話工場,傳入mybatis的設置裝備擺設文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //經由過程工場獲得SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); //List中的user和映照文件中德resultType所指定的類型分歧 List<User> list = sqlSession.selectList("test.findUserByName","小明"); System.out.println(list); sqlSession.close(); } public void insertUserTest() throws IOException{ //mybatis設置裝備擺設文件 String resource ="SqlMapConfig"; //獲得設置裝備擺設文件流 InputStream inputStream = Resources.getResourceAsStream(resource); //創立會話工場,傳入mybatis的設置裝備擺設文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //經由過程工場獲得sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); //拔出用戶對象 User user = new User(); user.setUsername("丁國華"); user.setBirthday(new Date()); user.setSex("1"); user.setAddress("安徽合肥"); //list中的user和映照文件中的resultType所指定的類型一向 sqlSession.insert("test.insertUser",user); //提交事物 sqlSession.commit(); //封閉會話 sqlSession.close(); } //依據id刪除用戶信息 @Test public void deleteUserTest() throws IOException{ //mybatis設置裝備擺設文件 String resource = "SqlMapConfig.xml"; //獲得設置裝備擺設文件流 InputStream inputStream = Resources.getResourceAsStream(resource); //創立工場,傳入mybatis的設置裝備擺設文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //經由過程工場獲得SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); //傳入id刪除用戶 sqlSession.delete("test.deleteUser",39); //提交事物 sqlSession.commit(); //封閉會話 sqlSession.close(); } // 更新用戶信息 @Test public void updateUserTest() throws IOException { // mybatis設置裝備擺設文件 String resource = "SqlMapConfig.xml"; // 獲得設置裝備擺設文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 創立會話工場,傳入mybatis的設置裝備擺設文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 經由過程工場獲得SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 更新用戶信息 User user = new User(); //必需設置id user.setId(41); user.setUsername("丁國華"); user.setBirthday(new Date()); user.setSex("2"); user.setAddress("安徽合肥"); sqlSession.update("test.updateUser", user); // 提交事務 sqlSession.commit(); // 封閉會話 sqlSession.close(); } } </span>
mybatis的優缺陷
長處:
a、易於上手和控制。
b、sql寫在xml裡,便於同一治理和優化。
c、 消除sql與法式代碼的耦合。
d、供給映照標簽,支撐對象與數據庫的orm字段關系映照
e、供給對象關系映照標簽,支撐對象關系組建保護
f、供給xml標簽,支撐編寫靜態sql。
缺陷:
a、 sql任務量很年夜,特別是字段多、聯系關系表多時,更是如斯。
b、sql依附於數據庫,招致數據庫移植性差。
c、 因為xml裡標簽id必需獨一,招致DAO中辦法不支撐辦法重載。
d、DAO層過於簡略,對象組裝的任務量較年夜。
e、 緩存應用欠妥,輕易發生髒數據。
mybatis和hibernate的比較
雷同點:Hibernate和mybatis都可所以經由過程SessionFactoryBuilder由xml設置裝備擺設文件生成SessionFactory,然後由SessionFactroy生成Session,最初由Session來開啟履行事物和SQL語句,個中SessionFactoryBuider、SessionFactory、Session的性命周期都是差不多的。
分歧點:
mybatis:玲珑、便利、高效、簡略、直接、半主動;
hibernate:壯大、便利、高效、龐雜、繞彎子、全主動;
mybatis:
a、入門簡略,即學即用,供給了數據庫查詢的主動對象綁定功效,並且延續了許多的SQL應用經歷,關於沒有那末高的對象模子請求的項目來講,可謂perfect。
b、 可以停止更加過細的SQL優化,可以削減查詢字段。
c、 缺陷就是框架照樣比擬粗陋,功效另有缺掉,固然簡化了數據綁定代碼,然則全部底層數據庫查詢現實照樣要本身寫的,任務量也比擬年夜,並且不太輕易順應疾速數據庫修正。
d、 二級緩存機制欠安。
hibernate:
a、功效壯大,數據庫有關性好,O/R映照才能強,假如你對Hibernate相當精曉,並且對Hibernate停止了恰當的封裝,那末你的項目全部耐久層代碼會相當簡略,須要寫的代碼很,開辟速度很快,異常爽。
b、有更好的二級緩存機制,可使用第三方緩存。
c、缺陷就是進修門坎不低,要精曉門坎更高,並且怎樣設計O/R映照,在機能和對象模子之間若何衡量獲得均衡,和如何用好Hibernate方面須要你的經歷和才能都很強才行。
舉個抽象的比方:
mybatis:機械對象,應用便利,拿來就用,但任務照樣要本身來作,不外對象是活的,怎樣使由我決議。
hibernate:智能機械人,但研發它(進修、闇練度)的本錢很高,任務都可以解脫他了,但僅限於它能做的事。
小編寄語:該博文,小編重要簡略的引見了mybatis的根本常識,包含一個簡略的增刪改查的demo,mybatis的優缺陷,和hibernate和mybatis的比較,她們之間的雷同點和分歧,mybatis簡略來講,就是一個耐久層的框架,mybatis讓法式將重要精神放在sql上,經由過程mybatis供給的映照方法,自在靈巧生成知足須要的sql語句,mybatis可以將向preparedStatement中的輸出參數主動停止輸出映照,將查詢成果集靈巧映照成java對象。
以上所述是小編給年夜家引見的mybatis道理概述入門教程,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!