20 - Mybatis學習(3)-全局配置文件

1 全局配置文件的properties 和 alias的配置

1.1 properties 數據庫文件配置

在src下配置個db.properties文件

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis_test?useUnicode=true&characterEncoding=utf8
username=root
password=root

  • 全局配置文件SqlMapConfig.xml
    在這裏插入圖片描述

1.2 setting【瞭解】

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

1.3 typeAliases

  • 別名是使用是爲了在映射文件中,更方便的去指定參數和結果集的類型,不再用寫很長的一段全限定名。

mybatis支持的別名
別名 映射的類型

_byte 	byte 
_long 	long 
_short 	short 
_int 	int 
_integer 	int 
_double 	double 
_float 	float 
_boolean 	boolean 
string 	String 
byte 	Byte 
long 	Long 
short 	Short 
int 	Integer 
integer 	Integer 
double 	Double 
float 	Float 
boolean 	Boolean 
date 	Date 
decimal 	BigDecimal 
bigdecimal 	BigDecimal 

在這裏插入圖片描述

2 MyBatis 加載映射文件的方式

  1. <mapper resource=’’/>
    使用相對於類路徑的資源
    如:<mapper resource="sqlmap/User.xml" />

  1. <mapper url=’’/> 【不用】
    使用完全限定路徑
    如:<mapper url="file:///D:\workspace_spingmvc\mybatis_01\config\sqlmap\User.xml" />

  1. <mapper class=’’/>
  • 使用mapper接口的全限定名
    如:<mapper class="cn.gyf.mybatis.mapper.UserMapper"/>
  • 也可使用註解開發,把xml文件刪除
public interface UserMapper {

    /**
     *
     * @param user
     * @return 返回受影響的行數
     */
    @Insert("INSERT INTO user (username,sex,birthday,address) VALUE (#{username},#{sex},#{birthday},#{address})")
    public int save(User user);

    @Select("SELECT * FROM user WHERE id = #{id}")
    public User findUserById(int id);
}

3 Mybatis的映射文件

3.1 輸入映射ParameterType

指定輸入參數的java類型,可以使用別名或者類的全限定名。它可以接收簡單類型,POJO對象、HashMap。

  • 傳遞簡單類型
    在這裏插入圖片描述
  • 傳遞POJO對象
    在這裏插入圖片描述
  • 傳遞POJO包裝對象
    開發中通過pojo傳遞查詢條件 ,查詢條件是綜合的查詢條件,不僅包括用戶查詢條件還包括其它的查詢條件(比如將用戶購買商品信息也作爲查詢條件),這時可以使用包裝對象傳遞輸入參數。
    需求
    綜合查詢用戶信息,需要傳入查詢條件複雜,比如(用戶信息、訂單信息、商品信息)。
    vo:鍵值對對象,相對於kv
    po:persist object 持久化對象
    pojo:簡單的java對象
    entity:實體

包裝類

package com.tzb.vo;


import com.tzb.model.User;

public class UserQueryVO {

    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}


  • UserMapper.java
package com.tzb.mapper;

import com.tzb.model.User;
import com.tzb.vo.UserQueryVO;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface UserMapper {

    /**
     *
     * @param user
     * @return 返回受影響的行數
     */
    //@Insert("INSERT INTO user (username,sex,birthday,address) VALUE (#{username},#{sex},#{birthday},#{address})")
    public int save(User user);

   //@Select("SELECT * FROM user WHERE id = #{id}")
    public User findUserById(int id);

    public List<User> findUserByUserQueryVo(UserQueryVO vo);
}


  • UserMapper.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="com.tzb.mapper.UserMapper">
    <insert id="save" parameterType="com.tzb.model.User">
        <!-- 這裏的佔位寫模型的屬性-->
		INSERT INTO user (username,sex,birthday,address)
		VALUE (#{username},#{sex},#{birthday},#{address});
	</insert>

    <select id="findUserById" parameterType="int" resultType="com.tzb.model.User">
        SELECT * FROM user WHERE id = #{id};
    </select>

    <!--查詢用戶 id 爲 n 的用戶-->
    <select id="findUserByUserQueryVo" parameterType="userQueryVO" resultType="user">
        SELECT u.* FROM user u WHERE u.id = #{user.id}
    </select>

</mapper>

在這裏插入圖片描述


  • 測試類
public class Demo5 {

    private SqlSession session;

    @Before
    public void before() throws IOException {
        System.out.println("before.......獲取 session");
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        session = factory.openSession();
    }

    @After
    public void after() {
        System.out.println("after.......關閉 session");
        session.close();
    }

    @Test
    public void test1() throws IOException {
        // 代理
        UserMapper userMapper = session.getMapper(UserMapper.class);

        //通過模型的包裝類來查詢用戶
        UserQueryVO query = new UserQueryVO();

        User user = new User();
        user.setId(1);
        query.setUser(user);

        List<User> list = userMapper.findUserByUserQueryVo(query);
        System.out.println(list);

        session.commit();

    }

}



  • 傳遞Map對象
public interface UserMapper {

    /**
     *
     * @param user
     * @return 返回受影響的行數
     */
    //@Insert("INSERT INTO user (username,sex,birthday,address) VALUE (#{username},#{sex},#{birthday},#{address})")
    public int save(User user);

   //@Select("SELECT * FROM user WHERE id = #{id}")
    public User findUserById(int id);

    public List<User> findUserByUserQueryVo(UserQueryVO vo);

    public List<User> findUserByMap(Map<String,Object> map);
}

在這裏插入圖片描述

  • 測試
@Test
    public void test1() throws IOException {
        // 代理
        UserMapper userMapper = session.getMapper(UserMapper.class);

        // 查詢條件
        Map<String,Object> map = new HashMap<>();
        map.put("username","張");
        map.put("sex","1");

        List<User> list = userMapper.findUserByMap(map);
        System.out.println(list);

        session.commit();

    }

3.2 輸出映射 resultType/resultMap

3.2.1 resultType

  • 使用resultType進行結果映射時,查詢的列名和映射的pojo屬性名完全一致,該列才能映射成功。
  • 如果查詢的列名和映射的pojo屬性名全部不一致,則不會創建pojo對象;
  • 如果查詢的列名和映射的pojo屬性名有一個一致,就會創建pojo對象。

  1. 輸出簡單類型
public interface UserMapper {
    
    //@Insert("INSERT INTO user (username,sex,birthday,address) VALUE (#{username},#{sex},#{birthday},#{address})")
    public int save(User user);

   //@Select("SELECT * FROM user WHERE id = #{id}")
    public User findUserById(int id);

    public List<User> findUserByUserQueryVo(UserQueryVO vo);

    public List<User> findUserByMap(Map<String,Object> map);

    //返回用戶個數
    public int findUserCount(UserQueryVO vo);

}

在這裏插入圖片描述

  • 測試
@Test
    public void test1() throws IOException {
        // 代理
        UserMapper userMapper = session.getMapper(UserMapper.class);

        UserQueryVO query = new UserQueryVO();

        User user = new User();
        user.setSex("1");
        query.setUser(user);

        int count = userMapper.findUserCount(query);
        System.out.println("人數:" + count);

        session.commit();

    }

  1. 輸出POJO單個對象
    在這裏插入圖片描述
    在這裏插入圖片描述

  1. 輸出POJO列表
    在這裏插入圖片描述

  1. 總結
  • 輸出單個pojo對象和pojo列表時,mapper映射文件中的resultType的類型是一樣的,mapper接口的方法返回值不同。
  • 同樣的mapper映射文件,返回單個對象和對象列表時,mapper接口在生成動態代理的時候,會根據返回值的類型,決定調用selectOne方法還是selectList方法。

3.2.2 resultMap

如果查詢出來的列名和屬性名不一致,通過定義一個resultMap將列名和pojo屬性名之間作一個映射關係。

  1. 定義resultMap
  2. 使用resultMap作爲statement的輸出映射類型

在這裏插入圖片描述
在這裏插入圖片描述

  • 測試
 @Test
    public void test1() throws IOException {
        // 代理
        UserMapper userMapper = session.getMapper(UserMapper.class);

        User user = userMapper.findUserByIdResultMap(1);
        System.out.println("信息:" + user);

        session.commit();

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章