Mybatisday01

框架(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閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件再膳,死亡現(xiàn)場離奇詭異,居然都是意外死亡曲横,警方通過查閱死者的電腦和手機喂柒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門不瓶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灾杰,你說我怎么就攤上這事蚊丐。” “怎么了艳吠?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵麦备,是天一觀的道長。 經(jīng)常有香客問我昭娩,道長凛篙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任栏渺,我火速辦了婚禮呛梆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘磕诊。我一直安慰自己削彬,他們只是感情好,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布秀仲。 她就那樣靜靜地躺著,像睡著了一般壶笼。 火紅的嫁衣襯著肌膚如雪神僵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天覆劈,我揣著相機與錄音保礼,去河邊找鬼。 笑死责语,一個胖子當著我的面吹牛炮障,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坤候,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼胁赢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了白筹?” 一聲冷哼從身側(cè)響起智末,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎徒河,沒想到半個月后系馆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡顽照,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年由蘑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡尼酿,死狀恐怖爷狈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谓媒,我是刑警寧澤淆院,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站句惯,受9級特大地震影響土辩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抢野,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一拷淘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧指孤,春花似錦启涯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叉跛,卻和暖如春松忍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筷厘。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工鸣峭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酥艳。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓摊溶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親充石。 傳聞我的和親對象是個殘疾皇子莫换,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359