框架 Mybatis與ORM Day01

框架(Framework)——半成品軟件

框架(Framework)是整個(gè)或部分系統(tǒng)的可重用設(shè)計(jì)嘀掸,表現(xiàn)為一組抽象構(gòu)件及構(gòu)件實(shí)例之間交互的方法;另一種定義認(rèn)為儒将,框架是可被應(yīng)用開發(fā)者定制的應(yīng)用骨架卿闹。前者是從應(yīng)用方面而后者是從目的方面給出的定義。
簡(jiǎn)而言之竞端,框架其實(shí)就是某種應(yīng)用的半成品屎即,就是一組組件,供你選用完成你自己的系統(tǒng)事富。簡(jiǎn)單說就是使用別人搭好的舞臺(tái)技俐,你來做表演。而且统台,框架一般是成熟的雕擂,不斷升級(jí)的軟件框架一般處在低層應(yīng)用平臺(tái)(如 J2EE )和高層業(yè)務(wù)邏輯之間的中間層。

作者:method
鏈接:http://www.reibang.com/p/4339ad509be1
來源:簡(jiǎn)書
著作權(quán)歸作者所有贱勃。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)井赌,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

Mybatis

mybatis是一個(gè)優(yōu)秀的基于java的持久層框架贵扰,它內(nèi)部封裝了jdbc仇穗,使開發(fā)者只需要關(guān)注sql語句本身,而不需要花費(fèi)精力去處理加載驅(qū)動(dòng)戚绕、創(chuàng)建連接纹坐、創(chuàng)建statement等繁雜的過程。mybatis通過 xml 或注解的方式將要執(zhí)行的各種statement配置起來舞丛,并通過java對(duì)象和statement 中
sql 的動(dòng)態(tài)參數(shù)進(jìn)行映射生成最終執(zhí)行的 sql 語句耘子,最后由 mybatis 框架執(zhí)行 sql 并將結(jié)果映射為 java 對(duì)象并返回。采用 ORM 思想解決了實(shí)體和數(shù)據(jù)庫映射的問題球切,對(duì) jdbc進(jìn)行了封裝谷誓,屏蔽了 jdbc api 底層訪問細(xì)節(jié)梯捕,使我們不用與 jdbc api 打交道倒得,就可以完成對(duì)數(shù)據(jù)庫的持久化操作趁冈。

作者:method
鏈接:http://www.reibang.com/p/4339ad509be1
來源:簡(jiǎn)書
著作權(quán)歸作者所有触机。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)畜普,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處砸脊。

JDBC問題

1.數(shù)據(jù)庫連接創(chuàng)建涡匀、釋放頻繁造成系統(tǒng)資源的浪費(fèi)從而影響性能拴事;
2.Sql語句在代碼中硬編碼 造成代碼不易維護(hù)蒋伦,實(shí)際應(yīng)用 sql 變化的可能較大弓摘,sql 變動(dòng)需要改變 java代碼。
3痕届、使用 preparedStatement 向占有位符號(hào)傳參數(shù)存在硬編碼韧献,因?yàn)?sql 語句的 where 條件不一定,可能多也可能少研叫,修改 sql 還要修改代碼锤窑,系統(tǒng)不易維護(hù)。
4嚷炉、對(duì)結(jié)果集解析存在硬編碼(查詢列名)渊啰,sql 變化導(dǎo)致解析代碼變化,系統(tǒng)不易維護(hù)申屹,如果能將數(shù)據(jù)庫記錄封裝成 pojo 對(duì)象解析比較方便

作者:method
鏈接:http://www.reibang.com/p/4339ad509be1
來源:簡(jiǎn)書
著作權(quán)歸作者所有绘证。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處哗讥。

Mybatis 框架快速入門

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

maven 用于管理jar包嚷那,其存在于倉庫中


2.添加依賴jar包

在pome.xml中添加所需的依賴坐標(biāo)

<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>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </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實(shí)體類

-3.1 數(shù)據(jù)庫腳本

導(dǎo)入數(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 編寫實(shí)體類
-3.3 編寫持久層接口IUserDao

import com.neusoft.domain.User;

import java.util.List;

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

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

4.編寫SqlMapConfig.xml文件(連接數(shù)據(jù)庫)

<?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個(gè)基本信息 -->
                <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>

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

5.測(cè)試類文件test

package com.neusoft.test;

import com.neusoft.dao.IUserDao;
import com.neusoft.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;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

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對(duì)象
        SqlSession session = factory.openSession();
        // 4. 使用SqlSession 創(chuàng)建Dao 接口 的代理對(duì)象
        IUserDao userDao = session.getMapper(IUserDao.class);
        // 5. 使用代理對(duì)象執(zhí)行方法
        List<User> users = userDao.findAll();
        for(User user: users){
            System.out.println(user);
        }
        // 6 釋放資源
        session.close();
        in.close();


    }
}

運(yùn)行結(jié)果

基于注解的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>

!注意:使用注解配置文件時(shí)杆煞, 請(qǐng)移除xml中的配置映射(IUserDao.xml)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末魏宽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子决乎,更是在濱河造成了極大的恐慌队询,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件构诚,死亡現(xiàn)場(chǎng)離奇詭異娘摔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)唤反,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門凳寺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人彤侍,你說我怎么就攤上這事肠缨。” “怎么了盏阶?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵晒奕,是天一觀的道長。 經(jīng)常有香客問我,道長脑慧,這世上最難降的妖魔是什么魄眉? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮闷袒,結(jié)果婚禮上坑律,老公的妹妹穿的比我還像新娘。我一直安慰自己囊骤,他們只是感情好晃择,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著也物,像睡著了一般宫屠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滑蚯,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天浪蹂,我揣著相機(jī)與錄音,去河邊找鬼告材。 笑死乌逐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的创葡。 我是一名探鬼主播浙踢,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼灿渴!你這毒婦竟也來了洛波?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤骚露,失蹤者是張志新(化名)和其女友劉穎蹬挤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棘幸,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焰扳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了误续。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吨悍。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蹋嵌,靈堂內(nèi)的尸體忽然破棺而出育瓜,到底是詐尸還是另有隱情,我是刑警寧澤栽烂,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布躏仇,位于F島的核電站恋脚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏焰手。R本人自食惡果不足惜糟描,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望书妻。 院中可真熱鬧船响,春花似錦、人聲如沸驻子。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崇呵。三九已至,卻和暖如春馅袁,著一層夾襖步出監(jiān)牢的瞬間域慷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工汗销, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留犹褒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓弛针,卻偏偏與公主長得像叠骑,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子削茁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348