1. 程式人生 > >深入淺出Mybatis(三)查詢

深入淺出Mybatis(三)查詢

src out brush ast sql語句 enc 進行 from exceptio

前言

要對數據庫進行操縱,得有一個需求,所以擬定了一個下面的需求,實現下面的功能:

  • 根據用戶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(三)查詢