深入淺出Mybatis(三)查詢
前言
要對數據庫進行操縱,得有一個需求,所以擬定了一個下面的需求,實現下面的功能:
-
根據用戶id查詢一個用戶信息
-
根據用戶名稱模糊查詢用戶信息列表
-
添加用戶
-
更新用戶
-
刪除用戶
程序編寫
建立User.java實體類
pojo類作為mybatis進行sql映射使用,pojo類通常與數據庫表對應,
在src中建立一個名為cn.itcast.mybatis.pojo的包,在包內建立一個名為User.java的類:
package com.dtt.com.dtt.mybatis.pojo; import java.util.Date; public class User { /** * 用戶表實體類 */ private int id; private String username;//用戶名 private String sex;//性別 private Date birthday;//生日 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 String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
建立User.xml映射文件
右擊com.dtt.mybatis.pojo包,New->File,建立一個名字為User.xml的文件。
在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"> <mapper namespace="test"> </mapper>
mybatis框架需要加載映射文件,將Users.xml添加在SqlMapConfig.xml,在SqlMapConfig.xml添加映射代碼,如下:
<!-- 加載映射文件 --> <mappers> <!-- 通過resource方法加載單個映射文件,resource是相對路徑 --> <mapper resource="cn/itcast/mybatis/po/User.xml" /> </mappers>
建立好後,進行查詢的操作。
查詢操作
查詢的需求是:
-
根據用戶id查詢一個用戶信息
-
根據用戶名稱模糊查詢用戶信息列表
在User.xml中添加sql語句:
<?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="test"><!-- namespace:命名空間,用於隔離sql,還有一個很重要的作用,後面會講 --> <!-- id:statement的id 或者叫做sql的id--> <!-- parameterType:聲明輸入參數的類型 --> <!-- resultType:聲明輸出結果的類型,應該填寫pojo的全路徑 --> <!-- #{}:輸入參數的占位符,相當於jdbc的? --> <!-- 根據id獲取用戶信息 --> <select id="findUserById" parameterType="int" resultType="com.dtt.mybatis.pojo.user" > select * from user where id = #{id} </select> <!-- 根據用戶名,查詢用戶列表,支持模糊查詢 --> <select id="findUserByUsername" parameterType="java.lang.String" resultType="com.dtt.mybatis.pojo.user"> select * from user where username like ‘%${value}%‘ </select> </mapper>
建立測試類UserTest.java,在這個類中進行單元測試,前提是引入了junit-4.9.jar,這個jar包。
測試代碼如下:
package com.dtt.mybatis.test; import com.dtt.mybatis.pojo.User; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class UserTest { //會話工廠 private SqlSessionFactory sqlSessionFactory; // Before在開始測試之前加載的方法,主要是創建會話工廠 @Before public void createSqlSessionFactory() throws IOException { //配置文件 String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 使用SqlSessionFactoryBuilder從xml配置文件中創建SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindUserById() { //數據會話實例 SqlSession sqlSession = null; try { /* 創建數據庫會話實例 */ sqlSession = sqlSessionFactory.openSession(); // 查詢單個記錄,根據用戶id查詢用戶信息 User user = sqlSession.selectOne("test.findUserById", 10); // 輸出用戶信息 System.out.println(user); } catch (Exception e) { e.printStackTrace(); } finally { if (sqlSession != null) { sqlSession.close(); } } } // 根據用戶名稱模糊查詢用戶信息 @Test public void testFindUserByUsername() { // 數據庫會話實例 SqlSession sqlSession = null; try { // 創建數據庫會話實例 sqlSession = sqlSessionFactory.openSession(); // 查詢單個記錄,根據用戶id查詢用戶信息 List<User> list = sqlSession.selectList("test.findUserByUsername", "小"); System.out.println(list.size()); } catch (Exception e) { e.printStackTrace(); } finally { if (sqlSession != null) { sqlSession.close(); } } } }
設計到的知識點
#{}和${}
在User.xml中在定義sql語句的時候,遇到了這兩個屬性,都是嵌套在sql語句中的,他們都是用來賦值的。
# {} 表示一個占位符號,通過#{}可以實現preparedStatement向占位符中設置值,自動進行java 類型和jdbc類型轉換,可以有效的防止sql註入。可以接收簡單類型值或者pojo屬性值。如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或者其他任意名稱。
${}表示拼接sql串,通過 它可以將parameterType傳入的內容拼接在sql中且不進行jdbc類型轉換,也可以接收簡單類型值如int,或者pojo屬性值。如果parameterType傳輸單個簡單類型值,括號中只能是value。
parameterType和resultType
在User.xml中在定義sql語句的時候,遇到了這兩個屬性,一個是輸入數據類型,一個是輸出數據類型。
parameterType:指定輸入參數類型,mybatis通過ognl從輸入對象中獲取參數值拼接在sql中。
resultType:指定輸出結果類型,mybatis將sql查詢結果的一行記錄數據映射為resultType指定類型的對象。
selectOne和selectList
在測試類UserTest.java中,我們執行的方法中的sqlSession有這兩個屬性,看字面很容易看出來,一個是查詢一個,一個是查詢多個。他們可以互換嗎?顯然,可以使用selectList來代替selectOne,而不可以用selectOne代替selectList。否則會拋出如下的錯誤:
selectOne查詢一條記錄,如果使用selectOne查詢多條記錄則拋出異常:
通過把sql語句寫到User.xml文件中了,然後把這個文件在SqlMapConfig.xml中添加了映射,通過xml或者註解方式完成了數據庫的查詢工作。使得方法變的很靈活。
深入淺出Mybatis(三)查詢