Mybatis_day01

框架(Framework 半成品軟件)

框架(Framework)是整個或部分系統(tǒng)的可重用設(shè)計,表現(xiàn)為一組抽象構(gòu)件及構(gòu)件實例間交互的方法;另一種
定義認為蝴猪,框架是可被應(yīng)用開發(fā)者定制的應(yīng)用骨架惑艇。前者是從應(yīng)用方面而后者是從目的方面給出的定義迫靖。
簡而言之,框架其實就是某種應(yīng)用的半成品测秸,就是一組組件疤估,供你選用完成你自己的系統(tǒng)。簡單說就是使用別人搭好的舞臺霎冯,你來做表演铃拇。而且,框架一般是成熟的沈撞,不斷升級的軟件框架一般處在低層應(yīng)用平臺(如 J2EE )和高層業(yè)務(wù)邏輯之間的中間層慷荔。

Mybatis

mybatis是一個優(yōu)秀的基于 java 的持久層框架,它內(nèi)部封裝了 jdbc缠俺,使開發(fā)者只需要關(guān)注 sql 語句本身拧廊,而不需要花費精力去處理加載驅(qū)動、創(chuàng)建連接晋修、創(chuàng)建 statement 等繁雜的過程吧碾。mybatis通過 xml 或注解的方式將要執(zhí)行的各種statement配置起來,并通過java對象和statement 中
sql 的動態(tài)參數(shù)進行映射生成最終執(zhí)行的 sql 語句墓卦,最后由 mybatis 框架執(zhí)行 sql 并將結(jié)果映射為 java 對象并返回倦春。采用 ORM 思想解決了實體和數(shù)據(jù)庫映射的問題,對 jdbc進行了封裝落剪,屏蔽了 jdbc api 底層訪問細節(jié)睁本,使我們不用與 jdbc api 打交道,就可以完成對數(shù)據(jù)庫的持久化操作忠怖。

jdbc 問題

1呢堰、數(shù)據(jù)庫鏈接創(chuàng)建、釋放頻繁造成系統(tǒng)資源浪費從而影響系統(tǒng)性能凡泣,如果使用數(shù)據(jù)庫鏈接池可解決此問題枉疼。
2皮假、Sql 語句在代碼中硬編碼,造成代碼不易維護骂维,實際應(yīng)用 sql 變化的可能較大惹资,sql 變動需要改變 java代碼。
3航闺、使用 preparedStatement 向占有位符號傳參數(shù)存在硬編碼褪测,因為 sql 語句的 where 條件不一定,可能多也可能少潦刃,修改 sql 還要修改代碼侮措,系統(tǒng)不易維護。
4乖杠、對結(jié)果集解析存在硬編碼(查詢列名)萝毛,sql 變化導致解析代碼變化,系統(tǒng)不易維護滑黔,如果能將數(shù)據(jù)庫記錄封裝成 pojo 對象解析比較方便

Mybatis 框架快速入門

1. 創(chuàng)建 maven 工程

maven 是管理jar包的笆包,用maven 工程中沒有jar包,jar包在倉庫中略荡,maven 工程在pom.xmk存儲的是依賴jar的坐標庵佣。

2. 添加依賴jar包

在pom.xml中添加所需的依賴坐標

 <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
    </dependencies>

    <build>
        <!-- 定義classpath -->
        <resources>
            <!-- resources文件 -->
            <resource>
                <directory>src/main/resources</directory>
                <!-- 是否被過濾,如果被過濾則無法使用 -->
                <filtering>false</filtering>
            </resource>
            <!-- java文件夾 -->
            <resource>
                <directory>src/main/java</directory>
                <!-- 引入映射文件等 -->
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>

3. 編寫User實體類

  • 3.1 數(shù)據(jù)庫腳本
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用戶名稱',
  `birthday` datetime DEFAULT NULL COMMENT '生日',
  `sex` char(1) DEFAULT NULL COMMENT '性別',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('41', '老李', '2018-02-27 17:47:08', '男', '北京');
INSERT INTO `user` VALUES ('42', '小二李', '2018-03-02 15:09:37', '女', '北京');
INSERT INTO `user` VALUES ('43', '小二李', '2018-03-04 11:34:34', '女', '北京');
INSERT INTO `user` VALUES ('45', '居八戒', '2018-03-04 12:04:06', '男', '北京');
INSERT INTO `user` VALUES ('46', '老李李', '2018-03-07 17:37:26', '男', '北京');
INSERT INTO `user` VALUES ('48', '小馬寶莉', '2018-03-08 11:44:00', '女', '北京');

  • 3.2 實體類
package com.neusoft.domain;

import java.io.Serializable;
import java.util.Date;

/**
 * @author Eric Lee
 * @date 2020/9/3 09:45
 */
public class User  implements Serializable {

    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

  • 3.3 編寫持久層接口 IUserDao

import com.neusoft.domain.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface IUserDao {
    // 查詢所有
    List<User> findAll();
}

  • 3.4 編寫持久層接口的映射文件IUserDao.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.neusoft.dao.IUserDao">
    <!--    配置查詢所有用戶的sql-->
    <select id="findAll" resultType="com.neusoft.domain.User">
        select * from  user
    </select>
</mapper>

4.編寫SqlMapConfig.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">
<!-- mybatis的主配置文件 -->
<configuration>
    <!-- 配置環(huán)境 -->
    <environments default="mysql">
        <!-- 配置mysql的環(huán)境-->
        <environment id="mysql">
            <!-- 配置事務(wù)的類型-->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置數(shù)據(jù)源(連接池) -->
            <dataSource type="POOLED">
                <!-- 配置連接數(shù)據(jù)庫的4個基本信息 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/java_ssm"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 指定映射配置文件的位置,映射配置文件指的是每個dao獨立的配置文件 -->
    <mappers>
        <mapper resource="com/neusoft/dao/IUserDao.xml"/>
    </mappers>
</configuration>

5.編寫測試類

package com.neusoft.test;

import com.neusoft.dao.IUserDao;
import com.neusoft.domain.User;
import org.apache.ibatis.annotations.Select;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author Eric Lee
 * @date 2020/9/3 10:13
 */
public class MybatisTest1 {
    @Test
    public void test1() throws IOException {
        // 1\. 讀取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 2\. 創(chuàng)建 SqlSessionFactory工廠
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        // 3\. 使用 工廠生產(chǎn)的 SqlSession對象
        SqlSession session = factory.openSession();
        // 4\. 使用SqlSession 創(chuàng)建Dao 接口 的代理對象
        IUserDao userDao = session.getMapper(IUserDao.class);
        // 5\. 使用代理對象執(zhí)行方法
        List<User> users = userDao.findAll();
        for(User user: users){
            System.out.println(user);
        }
        // 6 釋放資源
        session.close();
        in.close();

    }

}

基于注解的 mybatis

1.在持久層接口中添加注解

package com.neusoft.dao;

import com.neusoft.domain.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface IUserDao {
    // 查詢所有
    @Select("select * from user")
    List<User> findAll();
}

2.修改SqlMapConfig.xml配置文件

<!--    告知mybatis映射配置的位置-->

    <mappers>
        <mapper class="com.neusoft.dao.IUserDao"></mapper>
    </mappers>

注意:使用注解配置mybatis時候汛兜, 請移除xml中的配置映射(IUserDao.xml)

基于代理 Dao 實現(xiàn) CRUD 操作

1.1 根據(jù)ID查詢

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巴粪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子粥谬,更是在濱河造成了極大的恐慌肛根,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漏策,死亡現(xiàn)場離奇詭異派哲,居然都是意外死亡,警方通過查閱死者的電腦和手機掺喻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門芭届,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人感耙,你說我怎么就攤上這事褂乍。” “怎么了即硼?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵逃片,是天一觀的道長。 經(jīng)常有香客問我只酥,道長褥实,這世上最難降的妖魔是什么呀狼? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮性锭,結(jié)果婚禮上赠潦,老公的妹妹穿的比我還像新娘叫胖。我一直安慰自己草冈,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布瓮增。 她就那樣靜靜地躺著怎棱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绷跑。 梳的紋絲不亂的頭發(fā)上拳恋,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音砸捏,去河邊找鬼谬运。 笑死,一個胖子當著我的面吹牛垦藏,可吹牛的內(nèi)容都是我干的梆暖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼掂骏,長吁一口氣:“原來是場噩夢啊……” “哼轰驳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弟灼,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤级解,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后田绑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勤哗,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年掩驱,在試婚紗的時候發(fā)現(xiàn)自己被綠了俺陋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡昙篙,死狀恐怖腊状,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苔可,我是刑警寧澤缴挖,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站焚辅,受9級特大地震影響映屋,放射性物質(zhì)發(fā)生泄漏苟鸯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一棚点、第九天 我趴在偏房一處隱蔽的房頂上張望早处。 院中可真熱鬧,春花似錦瘫析、人聲如沸砌梆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咸包。三九已至,卻和暖如春杖虾,著一層夾襖步出監(jiān)牢的瞬間烂瘫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工奇适, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坟比,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓嚷往,卻偏偏與公主長得像葛账,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子间影,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348