最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis增刪改查快速上手

 更新時間:2020年02月05日 10:30:08   作者:BWH_Steven  
這篇文章給大家講解的是MyBatis 這門技術(shù)的 CURD (增刪改查) ,非常的詳細與實用,有需要的小伙伴可以參考下

作為一個快樂的小碼農(nóng),在每一個階段往往都在重復(fù)寫著不同版本的,學(xué)生管理,用戶管理,注冊登錄,從 JavaSE 的控制臺版,或者 GUI 版,再到 JavaWeb的 JSP版,再到純粹使用 HTML 作為前端展示的版本,以及使用一個更新的技術(shù),在此其中,我們用過 txt 做數(shù)據(jù)庫,用 XML 也可以,到現(xiàn)在常用的 MySQL,增刪改查一直是我們必不可少的一部分內(nèi)容,即使你不懂原理,即使你對這個技術(shù)的理解不是很深刻,拿出你的增刪改查,噼里啪啦就是一段亂敲,好歹還是能讓你著手先做起來(當然,對技術(shù)的理解還是很重要的),今天就和大家聊一聊 MyBatis 這門技術(shù)的 CURD (增刪改查)

優(yōu)化測試方法

在測試方法中,讀取配置文件,生產(chǎn) SqlSession,釋放資源等等,在每一測試方法的時候,都是重復(fù)的,所以我們完全可以提出出這一部分,防止大量的重復(fù)代碼

@Before
  public void init() throws Exception{
    //讀取配置文件
    inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    //創(chuàng)建SqlSessionFactory工廠
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);

    //使用工廠生產(chǎn)SqlSession對象
    sqlSession= factory.openSession();
    //使用SqlSession創(chuàng)建Mapper接口的代理對象
    userMapper = sqlSession.getMapper(UserMapper.class);
  }
 @After
  public void destroy() throws Exception{
    sqlSession.close();
    inputStream.close();
  }

在這兩個方法上增加 @Before 和 @Aftrer 注解,就可以保證,init() 和 destory() 這兩個方法,分別在我們真正被測試的方法的前后執(zhí)行

(一) 增添操作 (1) 編寫代碼

首先,在 UserMapper 接口中 增加對應(yīng)的方法

public interface UserMapper {
  /**
   * 增加用戶
   * @param user
   */
  void addUser(User user);
}

接著,在SQL映射文件中,增加新增的映射配置,這些有關(guān)內(nèi)容放在 <insert></insert>標簽對中,具體代碼如下

<insert id="addUser" parameterType="cn.ideal.domain.User">
  insert into              user(username,telephone,birthday,gender,address)values(#{username},#  {telephone},#{birthday},#{gender},#{address})
</insert>

(2) 說明:

1、id 屬性,自然是對應(yīng)的方法名,而由于這里,我們并不需要拿到返回信息,所以這里并沒有返回參數(shù) resultType,而方法中的參數(shù)又為一個 JavaBean 類,也就是User實體類,所以需要在標簽屬性中,添加一個 parameterType 屬性,其中需要指定這個實體類

2、在文本中書寫插入的SQL語句,由于實體類中已經(jīng)快捷生成了對應(yīng)的 get set 方法,所一可以使用 #{}的方式代表對應(yīng)的值

3、提示,數(shù)據(jù)庫中id為自增,所以并不需要設(shè)置 id

(3) 注意:

由于添加是更新類的語句,所以在執(zhí)行插入語句后,需要提交事務(wù),也就是執(zhí)行對應(yīng)的 commit方法,以提交更新操作,若沒有這一句,即使不會報錯,也無法正常存入,會被回滾,且這個id被占用

(4) 測試代碼:

/**
   * 測試新增用戶
   * @throws Exception
   */
  @Test
  public void testUpdateUser() throws Exception{
    User user = new User();
    user.setId(17);
    user.setUsername("修改");
    user.setTelephone("18899999999");
    user.setBirthday(new Date());
    user.setGender("女");
    user.setAddress("廣州");

    //執(zhí)行方法
    userMapper.updateUser(user);

  }

(5) 執(zhí)行結(jié)果:

控制臺:

(6) 獲取新增用戶的id值

首先對于 MySQL自增主鍵來說,在執(zhí)行 insert語句之前,MySQL 會自動生成一個自增主鍵,insert執(zhí)行后,通過 SELECT LAST_INSERT_ID() 可以獲取這條剛插入記錄的自增主鍵

在 SQL 映射配置文件中,需要借助 <selectKey></selectKey> 標簽,有一個屬性比較特殊,order 屬性,它代表著相對于插入操作的執(zhí)行時間,before-之前,after-之后

注:該標簽插入到 <select></select>

<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
  SELECT LAST_INSERT_ID();
</selectKey>

測試一下

@Test
public void testAddUser() throws Exception{
  User user = new User();
  user.setUsername("增加");
  user.setTelephone("12266660000");
  user.setBirthday(new Date());
  user.setGender("男");
  user.setAddress("珠海");
  System.out.println("執(zhí)行插入前" + user);
  //執(zhí)行方法
  userMapper.addUser(user);
  System.out.println("執(zhí)行插入后" + user);
}

執(zhí)行效果

(二) 修改操作 (1) 編寫代碼

在 UserMapper 接口中增加修改方法

public interface UserMapper {
  /**
   * 更新用戶
   * @param user
   */
  void updateUser(User user);
}

在 SQL 映射文件中增加語句,內(nèi)容包括在 <update></update> 中,需要注意的基本與添加操作是一致的

<update id="updateUser" parameterType="cn.ideal.domain.User">
  update user set username=#{username},telephone=#{telephone},birthday=#{birthday},gender=#{gender},address=#{address} where id=#{id}
</update>

(2) 測試代碼

/**
   * 測試新增用戶
   * @throws Exception
   */
  @Test
  public void testAddUser() throws Exception{
    User user = new User();
    user.setUsername("增加");
    user.setTelephone("12266668888");
    user.setBirthday(new Date());
    user.setGender("女");
    user.setAddress("成都");

    //執(zhí)行方法
    userMapper.addUser(user);

  }

(3) 執(zhí)行效果

(三) 刪除操作 (1) 編寫代碼

接口中增加刪除方法

public interface UserMapper {
  /**
   * 刪除用戶
   * @param uid
   */
  void deleteUser(Integer uid);
}

在SQL映射文件中,使用 <delete></delete> 標簽對進行內(nèi)容的書寫,需要注意的是,由于我們傳入的參數(shù)是一個 Integer類型的用戶id,所以參數(shù)類型的值為 parameterType

<delete id="deleteUser" parameterType="java.lang.Integer">
  delete from user where id=#{id}
</delete>

(2) 測試代碼

/**
 * 測試刪除用戶
 * @throws Exception
 */
@Test
public void testDeleteUser() throws Exception{
  //執(zhí)行方法
  userMapper.deleteUser(17);
}

(3) 執(zhí)行效果

(四) 模糊查詢

由于查詢?nèi)糠浅:唵?,這里就不展示了,基本流程都是一樣的

(1) 編寫代碼

在 UserMapper 接口中編寫方法

public interface UserMapper {
  /**
   * 通過姓名模糊查詢
   * @param username
   * @return
   */
  List<User> findByName(String username);
}

在 SQL 映射文件中新增查詢語句

<select id="findByName" parameterType="java.lang.String" resultType="cn.ideal.domain.User">
  select * from user where username like #{username}
</select>

(2) 測試代碼

/**
 * 測試模糊查詢
 * @throws Exception
 */
@Test
public void testFindByName() throws Exception{
  List<User> users = userMapper.findByName("%張%");
  for (User user : users){
    System.out.println(user);
  }
}

(3) 注意

在使用模糊查詢的時候,我們需要在查詢條件的兩側(cè)拼接兩個 “%” 字符串,這個時候有兩種解決方案,一種就是像在我上述代碼中,在測試時將字符串補充完整,還有一種方式就是 使用 ${} ,它在 SQL配置文件中代表一個 “拼接符號” ,也就是說可以這樣寫 SQL語句

select * from user where username like '%{value}'

可接受的類型有,普通類型(此情況下{}內(nèi)部只能寫value),JavaBean,HashMap

但是使用 %{} 拼接字符串的時候,會引起 SQL注入,所以不是很推薦使用

(4) 執(zhí)行效果

(五) 自定義包裝類作為查詢條件

Mapper 的輸入映射樣例中,我們對于基本數(shù)據(jù)類型和基本數(shù)據(jù)包裝類,都有了一定的了解,而下面我們來聊一聊關(guān)于相對復(fù)雜的一種情況,那就是自定義包裝類

先講一個需求:還是關(guān)于用戶的查詢,但是查詢條件復(fù)雜了一些,不僅僅局限于用戶的信息,而且可能還包括訂單,購物車,或者與用戶一些行為相關(guān)的信息,那么如何實現(xiàn)這樣一種需求呢?

那我們想,可不可以,在 User 類中增加一些我們需要的信息

從代碼的角度來看,在 User 中添加的字段與數(shù)據(jù)庫不一定能對應(yīng)起來,在原來的基礎(chǔ)上做修改,就會影響 User 作為數(shù)據(jù)庫映射對象的功能,所以我們可以創(chuàng)建一個 UserInstance 類,繼承 User類就可以在其中為某些業(yè)務(wù)添加一些不屬于數(shù)據(jù)庫的字段了

(1) 定義包裝類

package cn.ideal.domain;

public class QueryUserVo {
  private UserInstance userInstance;

  public UserInstance getUserInstance() {
    return userInstance;
  }

  public void setUserInstance(UserInstance userInstance) {
    this.userInstance = userInstance;
  }

  //其他查詢條件,例如訂單,購物車等等
}

(2) 配置 Mapper 文件

我們這里使用用戶的性別以及對姓名的模糊查詢,來寫SQL 當然,你也可以自己通過別的信息寫SQL

<select id="findUserByVo" parameterType="cn.ideal.domain.QueryUserVo" resultType="cn.ideal.domain.UserInstance">
  select * from user where user.gender=#{userInstance.gender} and user.username like #{userInstance.username}
</select>

在QueryUserVo 中,封裝的是查詢信息的各種對象,為什么上述代碼可以直接通過 userInstance.gender 直接取出對應(yīng)的屬性,這種方式叫做 OGNL 表達式,在類中 我們的寫法通常是 user.getUsername 但在寫法上,OGNL 表達式將get給省略了

(3) 測試代碼

/**
 * 包裝對象作為查詢參數(shù)
 * @throws Exception
 */
@Test
public void testFindUserByVo() throws Exception{
  //創(chuàng)建包裝對象,設(shè)置查詢條件
  QueryUserVo queryUserVo = new QueryUserVo();
  UserInstance userInstance = new UserInstance();
  userInstance.setGender("女");
  userInstance.setUsername("%張%");
  queryUserVo.setUserInstance(userInstance);

  //調(diào)用 UserMapper 的方法
  List<UserInstance> userInstances 
     = userMapper.findUserByVo(queryUserVo);
  for (UserInstance u : userInstances){
    System.out.println(u);
  }
}

(4) 執(zhí)行效果

相關(guān)文章

  • java入門概念個人理解之package與import淺析

    java入門概念個人理解之package與import淺析

    下面小編就為大家?guī)硪黄猨ava入門概念個人理解之package與import淺析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • idea全局設(shè)置Maven配置的實現(xiàn)步驟

    idea全局設(shè)置Maven配置的實現(xiàn)步驟

    本文主要介紹了idea全局設(shè)置Maven配置,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2023-07-07
  • Java關(guān)鍵字之this用法詳解

    Java關(guān)鍵字之this用法詳解

    這篇文章將為大家詳細介紹一下Java關(guān)鍵字this的用法,文中有相關(guān)的代碼示例,希望對大家的學(xué)習或工作有一定的幫助,感興趣的同學(xué)可以參考下
    2023-05-05
  • 關(guān)于JwtToken使用-重點看一下過期時間

    關(guān)于JwtToken使用-重點看一下過期時間

    這篇文章主要介紹了關(guān)于JwtToken使用-重點看一下過期時間,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • SpringBoot?如何通過?Profile?實現(xiàn)不同環(huán)境下的配置切換

    SpringBoot?如何通過?Profile?實現(xiàn)不同環(huán)境下的配置切換

    SpringBoot通過profile實現(xiàn)在不同環(huán)境下的配置切換,比如常見的開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境,SpringBoot常用配置文件主要有?2?種:properties?文件和yml文件,本文給大家詳細介紹SpringBoot?通過?Profile?實現(xiàn)不同環(huán)境下的配置切換,感興趣的朋友一起看看吧
    2022-08-08
  • 如何用java編寫一個rmi

    如何用java編寫一個rmi

    RMI能讓一個Java程序去調(diào)用網(wǎng)絡(luò)中另一臺計算機的Java對象的方法,那么調(diào)用的效果就像是在本機上調(diào)用一樣。下面我們來詳細了解一下吧
    2019-06-06
  • java lambda表達式用法總結(jié)

    java lambda表達式用法總結(jié)

    這篇文章主要介紹了java lamda表達式用法總結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2019-10-10
  • 關(guān)于@RequestParam注解的使用(簡單易懂)

    關(guān)于@RequestParam注解的使用(簡單易懂)

    這篇文章主要介紹了關(guān)于@RequestParam注解的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java8之Stream流代替For循環(huán)操作

    Java8之Stream流代替For循環(huán)操作

    這篇文章主要介紹了Java8之Stream流代替For循環(huán)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 使用Spring?Batch實現(xiàn)大數(shù)據(jù)處理的操作方法

    使用Spring?Batch實現(xiàn)大數(shù)據(jù)處理的操作方法

    通過使用Spring?Batch,我們可以高效地處理大規(guī)模數(shù)據(jù),本文介紹了如何配置和實現(xiàn)一個基本的Spring?Batch作業(yè),包括讀取數(shù)據(jù)、處理數(shù)據(jù)和寫入數(shù)據(jù)的全過程,感興趣的朋友跟隨小編一起看看吧
    2024-07-07

最新評論

陵水| 出国| 五河县| 周至县| 咸宁市| 介休市| 文山县| 上饶市| 潼关县| 黄浦区| 射阳县| 五指山市| 来安县| 贡觉县| 邯郸县| 南乐县| 甘孜县| 门头沟区| 嘉鱼县| 牟定县| 凌源市| 龙口市| 屯留县| 蕉岭县| 清河县| 潮安县| 陇川县| 正镶白旗| 建瓯市| 梅河口市| 莱州市| 婺源县| 衡阳市| 博兴县| 习水县| 小金县| 安顺市| 仙桃市| 微山县| 西乌珠穆沁旗| 岗巴县|