day21-MyBatis簡(jiǎn)介(千峰逆戰(zhàn))

1琅摩、簡(jiǎn)介
MyBatis 本是apache的一個(gè)開(kāi)源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation
遷移到了google code,并且改名為MyBatis 镜撩。2013年11月遷移到Github。
iBATIS一詞來(lái)源于“internet”和“abatis”的組合队塘,是一個(gè)基于Java的持久層框架袁梗。
MyBatis 支持定制化 SQL宜鸯、存儲(chǔ)過(guò)程以及高級(jí)映射。MyBatis 避免了幾乎所有的 JDBC代碼和手
動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集遮怜。MyBatis 可以使用簡(jiǎn)單的 XML 或注解來(lái)配置和映射原生信息淋袖,將
接口和 Java的 POJOs(Plain Old Java Objects,普通的 Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄。
2锯梁、添加依賴(lài)
使用MyBatis與數(shù)據(jù)庫(kù)進(jìn)行交互需要添加兩個(gè)依賴(lài):一個(gè)是數(shù)據(jù)庫(kù)的驅(qū)動(dòng)即碗,不同的數(shù)據(jù)庫(kù)需要不同的驅(qū)動(dòng)。另一個(gè)是MyBatis的依賴(lài):

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
上面添加的數(shù)據(jù)庫(kù)依賴(lài)是MySQL的陌凳,具體看你用的是什么數(shù)據(jù)庫(kù)就添加對(duì)應(yīng)的依賴(lài)就可以了剥懒。

3、xml文件配置
mybatis.xml

<?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 default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="huwenlong"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper.xml"/>
</mappers>
</configuration>
mybatis.xml文件位于resources目錄下合敦,它的根節(jié)點(diǎn)是configuration初橘,環(huán)境默認(rèn)為開(kāi)發(fā)環(huán)境,數(shù)據(jù)源為連接池蛤肌,MyBatis自帶連接池壁却。四個(gè)屬性根據(jù)自己使用的數(shù)據(jù)庫(kù)進(jìn)行設(shè)置,我使用的是MySQL 8.0所以驅(qū)動(dòng)是com.mysql.cj.jdbc.Driver裸准,如果你使用的是8.0以下版本則應(yīng)該是com.mysql.jdbc.Driver。然后就是數(shù)據(jù)庫(kù)名赔硫、用戶(hù)名與密碼炒俱,填寫(xiě)對(duì)應(yīng)的就好。最后一個(gè)mappers是映射關(guān)系爪膊,resource是一個(gè)文件权悟。

mapper.xml

<?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.qianfeng.pojo.User">
<select id="selectUsers" resultType="com.qianfeng.pojo.User">
select * from user
</select>
<select id="selectUser" resultType="com.qianfeng.pojo.User">
select * from user where userName = #{userName} and password = #{password}
</select>
<select id="selectUserCount" resultType="int">
select count(1) from user
</select>
<select id="selectUsersByPage" resultType="com.qianfeng.pojo.User">
select * from user limit #{startIndex},#{pageSize}
</select>
<insert id="saveUser" >
insert into user values (default ,#{userName},#{password},#{age},#{address})
</insert>
<delete id="deleteUser">
delete from user where id = #{id}
</delete>
<update id="updateUser">
update user set userName = #{userName},password = #{password},age = #{age},address = #{address} where id = #{id}
</update>
</mapper>
這個(gè)文件最重要的是namespace以及每一個(gè)項(xiàng)目的id,前者規(guī)定了命名空間推盛,可以自己定義峦阁,后者是區(qū)分每一條語(yǔ)句的id,也可以自己定義耘成,但要保證namespace+id全局唯一榔昔,使用的時(shí)候要對(duì)應(yīng)。#{}包裹的是占位符瘪菌,我們使用的時(shí)候需要傳參撒会。resultType是結(jié)果類(lèi)型。

4师妙、編寫(xiě)測(cè)試代碼
User.java

package com.qianfeng.pojo;

public class User {
private int id;
private String userName;
private String password;
private int age;
private String address;

public User() {
}

public User(int id, String userName,String password, int age, String address) {
    this.password = password;
    this.id = id;
    this.userName = userName;
    this.age = age;
    this.address = 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 int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

@Override
public String toString() {
    final StringBuilder sb = new StringBuilder("User{");
    sb.append("id=").append(id);
    sb.append(", userName='").append(userName).append('\'');
    sb.append(", password='").append(password).append('\'');
    sb.append(", age=").append(age);
    sb.append(", address='").append(address).append('\'');
    sb.append('}');
    return sb.toString();
}

}
User類(lèi)是一個(gè)POJO诵肛,有5個(gè)成員,每個(gè)成員要與數(shù)據(jù)庫(kù)的user表的每個(gè)字段一一對(duì)應(yīng)默穴。

UserTest.java

package com.qianfeng.pojo;

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.After;
import org.junit.Before;
import org.junit.Test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.junit.Assert.*;

public class UserTest {
private SqlSessionFactory sf = null;
private SqlSession ss = null;
@Before
public void setUp() throws Exception {
sf = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
ss = sf.openSession(true);
}
@Test
public void testSelectUsers(){
List<User> users = ss.selectList("com.qianfeng.pojo.User.selectUsers");
for (User user : users) {
System.out.println(user);
}
}

@Test
public void testSelectUser(){
    User user  = new User();
    user.setUserName("王五");
    user.setPassword("888888");
    User user1 = ss.selectOne("com.qianfeng.pojo.User.selectUser",user);
    System.out.println(user1);
}

@Test
public void testSelectUserCount(){

    int i = ss.selectOne("com.qianfeng.pojo.User.selectUserCount");
    System.out.println(i);
}

@Test
public void testSelectUsersByPage(){
    Map<String,Integer> map = new HashMap<>();
    map.put("startIndex",0);
    map.put("pageSize",5);
    List<User> users = ss.selectList("com.qianfeng.pojo.User.selectUsersByPage",map);
    for (User user : users) {
        System.out.println(user);
    }
}
@Test
public void saveUser(){
    User user = new User(0,"李四","1234567",20,"湖北省武漢市");
    int i = ss.insert("com.qianfeng.pojo.User.saveUser",user);
    System.out.println(i);
}
@Test
public void deleteUser(){
    int i = ss.delete("com.qianfeng.pojo.User.deleteUser",1);
    System.out.println(i);
}
@Test
public void updateUser(){
    User user = new User(2,"王五","888888",21,"安徽省合肥市");
    int i = ss.update("com.qianfeng.pojo.User.updateUser",user);
    System.out.println(i);
}
@After
public void tearDown() throws Exception {
    if(ss!=null){
        ss.close();
        ss = null;
    }
}

}
這個(gè)測(cè)試類(lèi)實(shí)現(xiàn)了MyBatis的增刪改查操作怔檩,由于創(chuàng)建SqlSessionFactory與SqlSession與銷(xiāo)毀SqlSession的操作每個(gè)方法都需要執(zhí)行褪秀,所以把它們單獨(dú)提出來(lái)分別放在setUp與tearDown方法中。

SqlSession中有很多方法可以用于數(shù)據(jù)庫(kù)的增刪改查操作薛训,每個(gè)方法的第一個(gè)參數(shù)都是String類(lèi)型statement媒吗,這個(gè)值是我們之前在mapper.xml文件中的"namespace.id"。第二個(gè)參數(shù)是一個(gè)Object類(lèi)型的對(duì)象许蓖,用于一些條件蝴猪,比如條件查詢(xún),插入值等膊爪,select方法還有第三個(gè)參數(shù)RowBounds參數(shù)自阱,這個(gè)參數(shù)用于分頁(yè)。

5米酬、與Hibernate的比較
兩者都是非常流行的ORM框架(Object Relational Mapping對(duì)象關(guān)系映射)沛豌。Hibernate的O/R Mapping實(shí)現(xiàn)了POJO 和數(shù)據(jù)庫(kù)表之間的映射,以及SQL的自動(dòng)生成和執(zhí)行赃额。相對(duì)Hibernate“O/R”而言加派,Mybatis 是一種“Sql Mapping”的ORM實(shí)現(xiàn)
Hibernate的真正掌握要比MyBatis困難,Hibernate比mybatis更加重量級(jí)一些跳芳。
Mybatis需要我們手動(dòng)編寫(xiě)SQL語(yǔ)句芍锦,回歸最原始的方式,所以可以按需求指定查詢(xún)的字段飞盆,提高程序的查詢(xún)效率娄琉。Hibernate也可以自己寫(xiě)SQL語(yǔ)句來(lái)指定需要查詢(xún)的字段,但這樣破壞了Hibernate封裝以及簡(jiǎn)潔性吓歇。
MyBatis由于所有的sql語(yǔ)句都是依賴(lài)數(shù)據(jù)庫(kù)書(shū)寫(xiě)的孽水,所以擴(kuò)展性遷移性比較差。Hibeinate通用性比較強(qiáng)城看。
兩者的緩存有相同之處:二級(jí)緩存除了采用系統(tǒng)默認(rèn)的緩存機(jī)制外女气,都可以通過(guò)實(shí)現(xiàn)你自己的緩存或?yàn)槠渌谌骄彺娣桨福瑒?chuàng)建適配器來(lái)完全覆蓋緩存行為测柠,也有不同之處:Hibernate的二級(jí)緩存配置在SessionFactory生成的配置文件中進(jìn)行詳細(xì)配置炼鞠,然后再在具體的表-對(duì)象映射中配置是那種緩存。MyBatis的二級(jí)緩存配置都是在每個(gè)具體的表-對(duì)象映射中進(jìn)行詳細(xì)配置鹃愤,這樣針對(duì)不同的表可以自定義不同的緩存機(jī)制簇搅。并且Mybatis可以在命名空間中共享相同的緩存配置和實(shí)例,通過(guò)Cache-ref來(lái)實(shí)現(xiàn)软吐。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瘩将,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌姿现,老刑警劉巖肠仪,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異备典,居然都是意外死亡异旧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)提佣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吮蛹,“玉大人,你說(shuō)我怎么就攤上這事拌屏〕闭耄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵倚喂,是天一觀的道長(zhǎng)每篷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)端圈,這世上最難降的妖魔是什么焦读? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮舱权,結(jié)果婚禮上矗晃,老公的妹妹穿的比我還像新娘。我一直安慰自己宴倍,他們只是感情好喧兄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著啊楚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浑彰。 梳的紋絲不亂的頭發(fā)上恭理,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音郭变,去河邊找鬼颜价。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诉濒,可吹牛的內(nèi)容都是我干的周伦。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼未荒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼专挪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤寨腔,失蹤者是張志新(化名)和其女友劉穎速侈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體迫卢,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倚搬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乾蛤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片每界。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖家卖,靈堂內(nèi)的尸體忽然破棺而出眨层,到底是詐尸還是另有隱情,我是刑警寧澤篡九,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布谐岁,位于F島的核電站,受9級(jí)特大地震影響榛臼,放射性物質(zhì)發(fā)生泄漏伊佃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一沛善、第九天 我趴在偏房一處隱蔽的房頂上張望航揉。 院中可真熱鬧,春花似錦金刁、人聲如沸帅涂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)媳友。三九已至,卻和暖如春产捞,著一層夾襖步出監(jiān)牢的瞬間醇锚,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工坯临, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焊唬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓看靠,卻偏偏與公主長(zhǎng)得像赶促,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挟炬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容