05.Mybatis入門程序(用戶增刪改查)

1. 映射文件

  • 映射文件命名:User.xml
  • mapper代理開發(fā)映射文件名:XXXMapper.xml (UserMapper.xml狈涮、ItemsMapper.xml)
  • 在映射文件中配置sql語句瓷胧。

2. 映射文件具體配置

  • 我們需要將查詢得到的結(jié)果映射為一個對象,創(chuàng)建一個包(com.chinglee.mybatis.pojo)里面存放所有的對象類型蹄衷。
  • 在pojo包中創(chuàng)建User類對應(yīng)User表
package com.chinglee.mybatis.pojo;

import java.util.Date;

/**
 * Created by Administrator on 2017/10/18 0018.
 */
public class User {
    private int id;
    private String username;
    private Date birthday;
    private String sex;
    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 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;
    }
}

  • 在sqlmap中創(chuàng)建User.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">

<!--namespace命名空間,作用就是對sql進(jìn)行分類化管理暑刃,理解sql隔離
注:使用mapper代理方法開發(fā)慎颗,namespace有特殊作用
-->

<mapper namespace="user">
    <!--映射文件中配置很多的sql語句-->
    <!--需求:通過id查詢用戶表的記錄-->
    <!--通過select執(zhí)行數(shù)據(jù)庫查詢
     id:標(biāo)識映射文件的sql
     parameterType:指定輸入?yún)?shù)類型悲酷,這里輸入的id是int型
     #{}表示占位符
     #{id}其中的id表示接收輸入的參數(shù),參數(shù)名稱就是id
     resultType:指定查詢結(jié)果映射的java對象類型疮胖,這里是單條對象
    -->
    <select id="findUserById" parameterType="int" resultType="com.chinglee.mybatis.pojo.User">
       SELECT * FROM user WHERE id=#{id}
    </select>
</mapper>
  • 在SqlMapConfig.xml中加載映射文件
   <!--加載映射文件-->
    <mappers>
        <mapper resource="sqlmap/User.xml"/>
    </mappers>

3. 根據(jù)id查詢用戶代碼實現(xiàn)

package com.chinglee.mybatis.first;

import com.chinglee.mybatis.pojo.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;

/**
 * Created by Administrator on 2017/10/19 0019.
 */
public class MybatisFirst {
   //根據(jù)id查詢用戶信息摄职,得到一條記錄結(jié)果
   @Test
   public void findUerByIdTest() throws IOException {
      //mybatis配置文件
      String resource="SqlMapConfig.xml";
      InputStream inputStream=Resources.getResourceAsStream(resource);
      //創(chuàng)建會話工廠
      SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
      //通過會化工廠得到sqlSession
      SqlSession sqlSession=sqlSessionFactory.openSession();
      //通過sqlSession操作數(shù)據(jù)庫
      //第一個參數(shù):映射文件中statement的id,等于namespace+"."+statement的id
      //第二個參數(shù):指定和映射文件中所匹配的parameterType類型的參數(shù)
      //sqlSession.selectOne()結(jié)果就是與映射文件中所匹配的resultType類型的對象
      User user=sqlSession.selectOne("user.findUserById",1);
      System.out.println(user);
      //釋放資源
      sqlSession.close();
   }

}

4. 根據(jù)用戶名模糊查詢

  • 在User.xml中添加查詢
  <!--根據(jù)用戶名查詢信息
    resultType:指定的單條記錄所映射的java對象類型
    ${}:表示拼接sql串获列,將接收到的參數(shù)不加任何修飾拼接在sql中谷市。
    使用${}拼接sql,引起sql注入
    ${value}:接受輸入?yún)?shù)的內(nèi)容击孩,如果傳入類型是簡單類型迫悠,${}中只能使用value

    -->

    <select id="findUserByName" parameterType="java.lang.String" resultType="com.chinglee.mybatis.pojo.User">
        SELECT * FROM user WHERE username LIKE '%${value}%'
    </select>

  • 在MybatatisFirst.java類中添加方法
 //根據(jù)用戶名稱模糊查詢用戶列表
   @Test
   public void findUserByNameTest() throws IOException {
      //獲取mybatis配置文件
      String resource="SqlMapConfig.xml";
      InputStream inputStream=Resources.getResourceAsStream(resource);
      //創(chuàng)建會話工廠
      SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
      //通過會話工廠得到會話sqlsession
      SqlSession sqlSession=sqlSessionFactory.openSession();
      List<User> list=sqlSession.selectList("user.findUserByName","小明");
      System.out.println(list);
      sqlSession.close();

   }
查詢結(jié)果.png

5. 添加用戶

  • 自增主鍵返回
    User.xml添加statement
 <!--
    parameterType:指定輸入?yún)?shù)類型是pojo
    #{}中指定pojo的屬性名,接收到pojo對象的屬性值巩梢,mybatis通過OGNL獲取對象的屬性值
    -->
    <insert id="insertUser" parameterType="com.chinglee.mybatis.pojo.User">
        <!--
           將插入數(shù)據(jù)的主鍵返回创泄,返回到user對象中
            SELECT LAST_INSERT_ID():得到剛insert進(jìn)去記錄的主鍵值,
            只適用于自增主鍵
            keyProperty:將查詢到主鍵值設(shè)置到parameterType指定的對象的
            哪個屬性
            order: SELECT LAST_INSERT_ID()相對于INSERT INTO user的執(zhí)行順序
            指定結(jié)果類型 resultType="java.lang.Integer"
        -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
             SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO user(username,birthday,sex,address) VALUE (#{username},#{birthday},#{sex},#{address})
    </insert>

在MybatisFirst類中加入addUserTest方法

//添加用戶信息
   @Test
   public void addUserTest() throws IOException {
      //獲取mybatis配置文件
      String resource="SqlMapConfig.xml";
      InputStream inputStream=Resources.getResourceAsStream(resource);
      //創(chuàng)建會話工廠
      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("河南鄭州");
      sqlSession.insert("user.insertUser",user);
      //提交事務(wù)
      sqlSession.commit();
      System.out.println(user.getId());
      //關(guān)閉會話
      sqlSession.close();

   }

  • 非自增主鍵返回(使用uuid)
    使用mysql的uuid()函數(shù)生成主鍵括蝠,需要修改id字段類型為String鞠抑,長度設(shè)置為35
<!--非自增主鍵
        使用musql的uuid生成主鍵
        執(zhí)行過程:
        首先通過uuid()得到主鍵,將主鍵設(shè)置到user對象的id屬性中
        其次在insert執(zhí)行時忌警,從user對象中取出id屬性值
        <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
            SELECT uuid()
        </selectKey>
        INSERT INTO user(id,username,birthday,sex,address) VALUE (#{id},#{username},#{birthday},#{sex},#{address})
    -->

6. 刪除用戶

  • 映射文件User.xml
 <!--delete刪除用戶搁拙,根據(jù)id刪除用戶,需要輸入id值-->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        DELETE FROM user WHERE id=#{id};
    </delete>
  • 測試類MybatisFirst.java

   @Test
   public void deleteUserTest() throws IOException {
      String resource="SqlMapConfig.xml";
      InputStream inputStream=Resources.getResourceAsStream(resource);
      SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
      SqlSession sqlSession=sqlSessionFactory.openSession();
      sqlSession.delete("user.deleteUser",28);
      //提交事務(wù)
      sqlSession.commit();
      //關(guān)閉會話
      sqlSession.close();
   }

7. 更新用戶

  • 映射文件User.xml
 <!--更新用戶法绵,傳入id箕速,傳入用戶的更新信息,parameterType指定user對象朋譬,注意id必須存在
    #{id}表示更新user的id值
    -->
    <update id="updateUser" parameterType="com.chinglee.mybatis.pojo.User">
        UPDATE user SET username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}WHERE id=#{id}
    </update>
  • java類
 @Test
   public void updateUserTest() throws IOException {
      String resouce="SqlMapConfig.xml";
      InputStream inputStream=Resources.getResourceAsStream(resouce);
      SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
      SqlSession sqlSession=sqlSessionFactory.openSession();
      User user=new User();
      user.setId(29);
      user.setUsername("王大軍");
      user.setBirthday(new Date());
      user.setSex("1");
      user.setAddress("河南鄭州");
      sqlSession.update("user.updateUser", user );
      //提交事務(wù)
      sqlSession.commit();
      //關(guān)閉會話
      sqlSession.close();
   }

8. 入門總結(jié)

  • parameterType:指定輸入?yún)?shù)類型

  • resultType:指定查詢結(jié)果映射的java對象類型

  • .#{}表示一個占位符盐茎,接收輸入?yún)?shù),類型可以是簡單類型徙赢,pojo字柠、hashmap。

    • 如果接收簡單類型狡赐,#{}中可以寫成value或其他名稱窑业。
    • .#{}接收pojo對象值,通過UGNL讀取對象中的屬性值阴汇。
  • ${}表示一個拼接符號数冬,會引用sql注入节槐,所以不建議使用${}搀庶。

    • ${}接收輸入?yún)?shù)拐纱,類型可以是簡單類型,pojo哥倔,hashmap秸架。
    • 如果接收簡單類型,${}中只能寫成value
  • selectOne表示查詢出的一條記錄咆蒿。如果使用selectone可以實現(xiàn)东抹,使用selectList也可以實現(xiàn)。

  • selectList查詢一個列表(多條記錄)進(jìn)行映射

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沃测,一起剝皮案震驚了整個濱河市缭黔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒂破,老刑警劉巖馏谨,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異附迷,居然都是意外死亡惧互,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門喇伯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喊儡,“玉大人,你說我怎么就攤上這事稻据“拢” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵捻悯,是天一觀的道長箩朴。 經(jīng)常有香客問我,道長秋度,這世上最難降的妖魔是什么炸庞? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮荚斯,結(jié)果婚禮上埠居,老公的妹妹穿的比我還像新娘。我一直安慰自己事期,他們只是感情好滥壕,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兽泣,像睡著了一般绎橘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天称鳞,我揣著相機(jī)與錄音涮较,去河邊找鬼。 笑死冈止,一個胖子當(dāng)著我的面吹牛狂票,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播熙暴,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼闺属,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了周霉?” 一聲冷哼從身側(cè)響起掂器,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俱箱,沒想到半個月后唉匾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡匠楚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年巍膘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芋簿。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡峡懈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出与斤,到底是詐尸還是另有隱情肪康,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布撩穿,位于F島的核電站磷支,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏食寡。R本人自食惡果不足惜雾狈,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抵皱。 院中可真熱鬧善榛,春花似錦、人聲如沸呻畸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伤为。三九已至咒循,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叙甸。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工颖医, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚁署。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓便脊,卻偏偏與公主長得像蚂四,于是被迫代替她去往敵國和親光戈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 1. 簡介 1.1 什么是 MyBatis 遂赠? MyBatis 是支持定制化 SQL久妆、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,425評論 0 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)跷睦,斷路器筷弦,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法抑诸,內(nèi)部類的語法烂琴,繼承相關(guān)的語法,異常的語法蜕乡,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 現(xiàn)在是一個粉絲經(jīng)濟(jì)時代,無論做什么都需要流量辛块,也就是我們說的粉絲畔派! 自從公眾號流行火爆之后,相繼出現(xiàn)了幾十個自媒體...
    新媒源飛哥傳書閱讀 1,493評論 0 1
  • IScroll.js插件是兼容所有移動端滾動條事件的插件润绵,在某些安卓機(jī)中线椰,我們無法通過overflo:scroll...
    葉落秋明閱讀 27,138評論 5 8