java queue poll,Mybatis_day2_Mybatis的CRUD操作

 2023-10-17 阅读 32 评论 0

摘要:Mybatis根據動態代理實現CRUD操作 使用要求: 持久層接口(UserDao)和持久層接口的映射配置必須在相同的包下持久層映射配置中 mapper 標簽的 namespace 屬性取值必須是持久層接口的全限定類名SQL 語句的配置標簽<select>,<insert>,<delete

Mybatis根據動態代理實現CRUD操作

  • 使用要求:
  1. 持久層接口(UserDao)和持久層接口的映射配置必須在相同的包下
  2. 持久層映射配置中 mapper 標簽的 namespace 屬性取值必須是持久層接口的全限定類名
  3. SQL 語句的配置標簽<select>,<insert>,<delete>,<update>的 id 屬性必須和持久層接口的 方法名相同。



根據 ID 查詢

  1. 在持久層接口中添加 findById 方法
/**   * 根據 id 查詢   * @param userId * @return */  User findById(Integer userId);

  1. 在用戶的映射配置文件中配置
<!-- 根據 id 查詢 --> 
<select id="findById" resultType="cn.myp666.domain.User" parameterType="int">select * from user where id = #{uid} 
</select> 

細節:

  • java queue poll,resultType 屬性: 用于指定結果集的類型。

  • parameterType 屬性:用于指定傳入參數的類型。

  • sql 語句中使用#{}字符:

    • 它代表占位符,相當于 jdbc 的 ?,都是用于執行語句時替換實際的數據。
    • 具體的數據是由#{}里面的內容決定的。
  • Java queue,#{}中內容的寫法:

    • 由于數據類型是基本類型,所以此處可以隨意寫。

  1. 在測試類添加測試
/**
* 
* <p>Title: MybastisCRUDTest</p>
* <p>Description: 測試 mybatis 的 crud 操作</p>
*
*/
public class MybastisCRUDTest {
private InputStream in ;
private SqlSessionFactory factory;
private SqlSession session;
private IUserDao userDao;@Test
public void testFindOne() {
//6.執行操作User user = userDao.findById(41);System.out.println(user);
}@Before//在測試方法執行之前執行
public void init()throws Exception {
//1.讀取配置文件in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.創建構建者對象SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.創建 SqlSession 工廠對象factory = builder.build(in);
//4.創建 SqlSession 對象session = factory.openSession();
//5.創建 Dao 的代理對象userDao = session.getMapper(IUserDao.class);
}@After//在測試方法執行完成之后執行
public void destroy() throws Exception{session.commit();
//7.釋放資源session.close();in.close();
}
}



保存操作

  1. 在持久層接口中添加新增方法
/**
* 保存用戶
* @param user
* @return 影響數據庫記錄的行數
*/
int saveUser(User user);

  1. 在用戶的映射配置文件中配置
<!-- 保存用戶-->
<insert id="saveUser" parameterType="cn.myp666.domain.User">insert into user(username,birthday,sex,address) 
values(#{username},#{birthday},#{sex},#{address})
</insert>

細節:

  • Mybatis框架,parameterType 屬性:
    代表參數的類型,因為我們要傳入的是一個類的對象,所以類型就寫類的全名稱。

  • sql 語句中使用#{}字符:
    它代表占位符,相當 jdbc 的?,都是用于執行語句時替換實際的數據。
    具體的數據是由#{}里面的內容決定的。

  • #{}中內容的寫法:
    由于我們保存方法的參數是 一個 User 對象,此處要寫 User 對象中的屬性名稱。
    它用的是 ognl 表達式。

  • ognl 表達式:

    • 它是 apache 提供的一種表達式語言,全稱是:
      Object Graphic Navigation Language 對象圖導航語言
      它是按照一定的語法格式來獲取數據的。
    • 語法格式就是使用 #{對象.對象}的方式
      #{user.username}它會先去找 user 對象,然后在 user 對象中找到 username 屬性,并調用
      getUsername()方法把值取出來。但是我們在 parameterType 屬性上指定了實體類名稱,所以可以省略 user.
      而直接寫 username。

  1. 添加測試類中的測試方法
@Test
public void testSave(){User user = new User();user.setUsername("modify User property");user.setAddress("北京市順義區");user.setSex("男");user.setBirthday(new Date());System.out.println("保存操作之前:"+user);
//5.執行保存方法userDao.saveUser(user);System.out.println("保存操作之后:"+user);
}

打開 Mysql 數據庫發現并沒有添加任何記錄,原因是什么?
這一點和 jdbc 是一樣的,我們在實現增刪改時一定要去控制事務的提交,那么在 mybatis 中如何控制事務
提交呢?
可以使用: session.commit();來實現事務提交。加入事務提交后的代碼如下:

@After//在測試方法執行完成之后執行
public void destroy() throws Exception{session.commit();
//7.釋放資源session.close();in.close();
}
問題擴展:新增用戶 id 的返回值
  • 新增用戶后,同時還要返回當前新增用戶的 id 值,因為 id 是由數據庫的自動增長來實現的,所以就相
    當于我們要在新增后將自動增長 auto_increment 的值返回。
<insert id="saveUser" parameterType="USER">
<!-- 配置保存時獲取插入的 id -->
<selectKey keyColumn="id" keyProperty="id" resultType="int">select last_insert_id();
</selectKey>insert into user(username,birthday,sex,address) 
values(#{username},#{birthday},#{sex},#{address})
</insert>



用戶更新

  1. 在持久層接口中添加更新方法
/**
* 更新用戶
* @param user
* @return 影響數據庫記錄的行數
*/
int updateUser(User user);

  1. 在用戶的映射配置文件中配置
<!-- 更新用戶 -->
<update id="updateUser" parameterType="cn.myp666.domain.User">update user set username=#{username},birthday=#{birthday},sex=#{sex},
address=#{address} where id=#{id}
</update>

  1. 加入更新的測試方法
@Test
public void testUpdateUser()throws Exception{
//1.根據 id 查詢User user = userDao.findById(52);
//2.更新操作user.setAddress("北京市順義區");int res = userDao.updateUser(user);System.out.println(res);
}



用戶刪除

  1. 在持久層接口中添加刪除方法
/**
* 根據 id 刪除用戶
* @param userId
* @return
*/
int deleteUser(Integer userId);

  1. 在用戶的映射配置文件中配置
<!-- 刪除用戶 -->
<delete id="deleteUser" parameterType="java.lang.Integer">delete from user where id = #{uid}
</delete>

  1. 加入刪除的測試方法
@Test
public void testDeleteUser() throws Exception {
//6.執行操作int res = userDao.deleteUser(52);System.out.println(res);
}



用戶模糊查詢

  1. 在持久層接口中添加模糊查詢方法
/**
* 根據名稱模糊查詢
* @param username
* @return
*/
List<User> findByName(String username);

  1. 在用戶的映射配置文件中配置
<!-- 根據名稱模糊查詢 -->
<select id="findByName" resultType="cn.myp666.domain.User" parameterType="String">select * from user where username like #{username}
</select>

  1. 加入模糊查詢的測試方法
@Testpublic void testFindByName(){
//5.執行查詢一個方法List<User> users = userDao.findByName("%王%");for(User user : users){System.out.println(user);}}

在控制臺輸出的執行 SQL 語句如下:
在這里插入圖片描述

  • 我們在配置文件中沒有加入%來作為模糊查詢的條件,所以在傳入字符串實參時,就需要給定模糊查詢的標識%。配置文件中的#{username}也只是一個占位符,所以 SQL 語句顯示為 “ ?”。

模糊查詢的另一種配置方式
  • 第一步:修改 SQL 語句的配置,配置如下:
<!-- 根據名稱模糊查詢 -->
<select id="findByName" parameterType="string" resultType="cn.myp666.domain.User">select * from user where username like '%${value}%'
</select>
  • 我們在上面將原來的#{}占位符,改成了${value}。注意如果用模糊查詢的這種寫法,那么${value}的寫
    法就是固定的,不能寫成其它名字。

  • 第二步:測試,如下:
@Test
public void testFindByName(){//5.執行查詢一個方法List<User> users = userDao.findByName("王");for(User user : users){System.out.println(user);}
}
  • 在控制臺輸出的執行 SQL 語句如下:
    在這里插入圖片描述
    • 可以發現,我們在程序代碼中就不需要加入模糊查詢的匹配符%了,這兩種方式的實現效果是一樣的,但執行的語句是不一樣的。推薦使用第一種方式

#{}與${}的區別:

  • #{}表示一個占位符號
    • 通過#{}可以實現 preparedStatement 向占位符中設置值,自動進行 java 類型和 jdbc 類型轉換,
      #{}可以有效防止 sql 注入。
    • #{}可以接收簡單類型值或 pojo 屬性值。 如果 parameterType 傳輸單個簡單類型值,#{}括號中可以是 value 或其它名稱。
  • ${}表示拼接 sql 串
    • 通過${}可以將 parameterType 傳入的內容拼接在 sql 中且不進行 jdbc 類型轉換,
    • ${}可以接收簡單類型值或 pojo 屬性值,如果 parameterType 傳輸單個簡單類型值,${}括號中只能是 value。



查詢使用聚合函數

  1. 在持久層接口中添加模糊查詢方法
/**
* 查詢總記錄條數
* @return
*/
int findTotal();

  1. 在用戶的映射配置文件中配置
<!-- 查詢總記錄條數 -->
<select id="findTotal" resultType="int">select count(*) from user;
</select>

  1. 加入聚合查詢的測試方法
@Test
public void testFindTotal() throws Exception {
//6.執行操作int res = userDao.findTotal();System.out.println(res);
}

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/143616.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息