MyBatis數據庫查詢(XML配置)


工具類

MyBatis進行數據庫查詢一定會用到SqlSessionFactory和SqlSession這兩個類的對象,為了以后每次查詢方便,就先構造有一個工具類,用來管理這兩個對象:

【SqlSessionFactory的對象是重量級的,而SqlSession是輕量級的】

以下是工具類:

package com.hgd;

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 java.io.IOException;
import java.io.InputStream;
/*
* Mybatis工具類
* 創建SqlSessionFactory對象以及獲取SqlSession對象
* */
public class MyBatisUtils {
    private static SqlSessionFactory factory = null;
    static{
        InputStream is = null;
        String config = "mybatis-config.xml";
        try{
            is = Resources.getResourceAsStream(config);
            SqlSessionFactory sessionFactory =new SqlSessionFactoryBuilder().build(is);
            factory = sessionFactory;
        }catch (IOException e){
            e.printStackTrace();
        }finally{
            if(is!=null)
                try{
                is.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
    /*
    * @param autoCommit 設置是否為自動提交
    * */
    public static SqlSession getSession(boolean autoCommit){
        return factory.openSession(autoCommit);
    }
}

 mybatis-config.xml內容

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--定義一些屬性,以便於在后面引用-->
    <properties>
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test"/>
        <property name="username" value="root"/>
        <property name="password" value="123"/>
    </properties>
    <!--設置-->
    <settings>
        <!--顯示SQL語句,以便於調試-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--映射文件-->
    <mappers>
        <mapper resource="com/hgd/userMapper.xml"/>
        <mapper resource="com/hgd/employeeMapper.xml"/>
        <mapper resource="com/hgd/mapper.xml"/>
    </mappers>
</configuration>

需要查詢的數據庫中的user表結構:

實體類User【普通JavaBean】

package com.hgd;

public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;

    public User(){}
    public User(Integer id,String username,String password,String email){
        setId(id);
        setUsername(username);
        setPassword(password);
        setEmail(email);
        System.out.println("UserCreated");
    }
    public Integer getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public String getEmail() {
        return email;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

  

1.利用默認SqlSession中的方法,進行查詢

 (1)根據id,查詢某個User的全部字段:

   ①新建一個映射配置文件【userMapper.xml】

<mapper namespace="${NAMESPACE}" >
    <!--resultMap 結果映射-->
    <select id="selectByID" parameterType="int" resultType="com.hgd.User">
        select
          id,username,password,email
        from user where id = #{id};
    </select>
</mapper>

【注:實體類User里面的字段和數據庫里面的列名是一樣的,所以就不用再去配置resultMap了;

如果不一樣的話可以

    Ⅰ使用別名,比如select e_id as id 這種,別名和實體類屬性一致

    Ⅱ再配置一個resultMap,里面配置清楚property和column的聯系。

這里估計是MyBatis反射調用User類中的setter方法設置屬性值的】

  ②然后在Mybatis主配置文件中引用這個文件,像這樣:

  ③然后就可以在Java代碼中進行查詢操作了

這里用到了SqlSession的一個方法,selectOne(String id,Object o);

這里的id就是你在userMapper.xml中配置的select節點的id,Object就是你傳入的參數

運行結果:

【其余的輸出均為設置的<setting name="logImpl" value="STDOUT_LOGGING"/>輸出的內容】:

(2)查詢一組User,返回List<User>這樣的返回值:

這個時候就需要用到select子節點中的resultMap屬性了【這個屬性的意思是,結果映射,與Java中的Map關系不是很大】

  ①在映射文件中[userMapper.xml]配置一個結果集映射,這里MyBatis是反射調用User的構造方法來創建的對象(猜測

<resultMap id="constructedUser" type="com.hgd.User">
        <!--利用構造方法構造對象,參數順序為構造方法中的順序[3.4.3+可任意順序]-->
        <constructor>
            <idArg column="id" javaType="int"/>
            <arg column="username" javaType="String" />
            <arg column="password" javaType="String"/>
            <arg column="email" javaType="String"/>
        </constructor>
    </resultMap>

  ②配置一個select,注意這里是resultMap,然后這個屬性要引用上面配置的resultMap的id

<select id="Users" resultMap="constructedUser">
        select * from user
</select>

  ③寫個測試

     @Test
    public void testMyBatis(){
             SqlSession s = MyBatisUtils.getSession(true);
             List<User> u = s.selectList("Users");
             System.out.println(u);
             s.close();
    }

  輸出結果:

2.自定義接口,由Mybatis代理查詢(抱歉,不是很懂

(1)先新建一個接口[UserMapper],這里會有一系列查詢操作的模板方法:

  第一個方法查詢所有的User,第二個方法根據傳入的ID查找指定的一個User

public interface UserMapper {
    ArrayList<User> getUsers();
    User getUserById(Integer id);
}

(2)為這個接口配置查詢語句,新建一個配置文件mapper.xml,注意這個時候的namespace應該為這個接口的全類名(好像又看到了反射的影子)

【這里的select的id應該與接口中的函數名一致】

可以理解為 為接口中的每一個函數配置一個對應的<select></select>

<?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="com.hgd.UserMapper">
    <select id="getUsers"  resultMap="userList">
        select * from user;
    </select>
    <resultMap id="userList" type="com.hgd.User">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <result property="email" column="email"/>
    </resultMap>
    <select id="getUserById" parameterType="int" resultType="com.hgd.User">
        select
            id,username,password,email
        from user
        where id=#{id}
    </select>
</mapper>

(3)在MyBatis全局配置文件中將這個配置文件mapper.xml包含進去

(4)寫個測試:

    @Test
    public void testMyBatis(){
             SqlSession s = MyBatisUtils.getSession(true);
             UserMapper mapper = s.getMapper(UserMapper.class);
             User u = mapper.getUserById(5);
             List<User> list = mapper.getUsers();
             System.out.println("id為5的用戶:"+u);
             System.out.println("所有的用戶列表:"+list);
    }

  SqlSession.getMapper(Class clazz);這里可能用了代理

輸出結果:

 

【SELECT】

在select子節點中,可以有下面的一些屬性:

<select id="selectPerson" parameterType="int" parameterMap="deprecated" resultType="hashmap" resultMap="personResultMap" flushCache="false" useCache="true" timeout="10000" fetchSize="256" statementType="PREPARED" resultSetType="FORWARD_ONLY">

 

屬性 描述
id 在命名空間中唯一的標識符,可以被用來引用這條語句。
parameterType 將會傳入這條語句的參數類的完全限定名或別名。這個屬性是可選的,因為 MyBatis 可以通過 TypeHandler 推斷出具體傳入語句的參數,默認值為 unset。
resultType 從這條語句中返回的期望類型的類的完全限定名或別名。注意如果是集合情形,那應該是集合可以包含的類型,而不能是集合本身。使用 resultType 或 resultMap,但不能同時使用。
resultMap 外部 resultMap 的命名引用。結果集的映射是 MyBatis 最強大的特性,對其有一個很好的理解的話,許多復雜映射的情形都能迎刃而解。使用 resultMap 或 resultType,但不能同時使用。
flushCache 將其設置為 true,任何時候只要語句被調用,都會導致本地緩存和二級緩存都會被清空,默認值:false。
useCache 將其設置為 true,將會導致本條語句的結果被二級緩存,默認值:對 select 元素為 true。
timeout 這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值為 unset(依賴驅動)。
fetchSize 這是嘗試影響驅動程序每次批量返回的結果行數和這個設置值相等。默認值為 unset(依賴驅動)。
statementType STATEMENT,PREPARED 或 CALLABLE 的一個。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED。
resultSetType FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一個,默認值為 unset (依賴驅動)。
databaseId 如果配置了 databaseIdProvider,MyBatis 會加載所有的不帶 databaseId 或匹配當前 databaseId 的語句;如果帶或者不帶的語句都有,則不帶的會被忽略。
resultOrdered 這個設置僅針對嵌套結果 select 語句適用:如果為 true,就是假設包含了嵌套結果集或是分組了,這樣的話當返回一個主結果行的時候,就不會發生有對前面結果集的引用的情況。這就使得在獲取嵌套的結果集的時候不至於導致內存不夠用。默認值:false
resultSets 這個設置僅對多結果集的情況適用,它將列出語句執行后返回的結果集並每個結果集給一個名稱,名稱是逗號分隔的。

--------表格來自MyBatis官方中文網站:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html

常用的幾個屬性一般有resultType,resultMap,parameterType等

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM