天天看點

mybatis-------------(一篇足矣)mybatis

  • 什麼是 MyBatis?

    MyBatis 是一款優秀的持久層架構,它支援自定義 SQL、存儲過程以及進階映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設定參數和擷取結果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為資料庫中的記錄。

    mybatis-------------(一篇足矣)mybatis

文章目錄

  • mybatis
    • mybatis的曆史
    • 注解版:查詢所有SearchAll
      • 資料庫和表:User
      • 結果集映射Result
      • 注解版注解總結
    • 分頁查詢
    • 通用Mapper
      • 概述
      • API
    • mybatis的XML方式
      • 入門案例:查詢指定使用者
      • Mapper基本結構
      • Mapper 參數類型:parameterType
      • Mapper 結果類型:resultType
      • Mapper 映射關系:ResultMap
      • 自定義别名
    • 動态SQL
      • 什麼是動态SQL
      • if 标簽
      • where 标簽
      • foreach 标簽
      • choose 标簽:多條件
      • sql 标簽
    • 自動比對規範駝峰規則

mybatis

mybatis的曆史

MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis,實質上Mybatis對iBatis進行一些改進。

注解版:查詢所有SearchAll

mybatis所需的jar包和配置檔案(連結:https://pan.baidu.com/s/1e_vWUodbaCXGl_qdFDNTOQ 提取碼:zr3p);

資料庫和表:User

# 建立資料庫
CREATE DATABASE ssm_db1;
# 使用資料庫
USE ssm_db1;
# 1.1 建立使用者表
CREATE TABLE `user` (
  `uid` VARCHAR(32) NOT NULL,
  `username` VARCHAR(20) DEFAULT NULL,	#使用者名
  `password` VARCHAR(32) DEFAULT NULL,	#密碼
  `name` VARCHAR(20) DEFAULT NULL,		#昵稱
  `email` VARCHAR(30) DEFAULT NULL,		#電子郵箱
  `telephone` VARCHAR(20) DEFAULT NULL,	#電話
  `birthday` DATE DEFAULT NULL,			#生日
  `sex` VARCHAR(10) DEFAULT NULL,		#性别
  `state` INT(11) DEFAULT 0,			#狀态:0=未激活,1=已激活
  `code` VARCHAR(64) DEFAULT NULL,		#激活碼
  PRIMARY KEY (`uid`)
) ;
# 1.2 初始化使用者預設資料
INSERT INTO `user` VALUES ('u001','jack','1234','傑克','[email protected]','13612345678','2015-11-04','男',0,NULL);
INSERT INTO `user` VALUES ('u002','rose','1234','肉絲','[email protected]','13612345679','2015-11-05','女',0,NULL);
           

一. JavaBean

public class User {
    private String uid;
    private String userName;
    private String password;
    private String name;
    private String email;
    private Date birthday;
    private String sex;
    private Integer state;
    private String code;
    
    ...get/set/toString
}
           

二. 編寫Dao:UserMapper

public interface UserMapper {

    /**
     * 查詢所有
     * @return
     */
    @Select("select * from user")
    public List<User> selectAll();
}
           

三.修改:SqlMapConfig.xml

<mappers>
		<!-- 表示加載此包下的所有dao接口-->
		<package name="com.czxy.dao"/>
	</mappers>
           

四.編寫測試類

public static void main(String[] args) throws IOException {
        UserMapper userMapper = MyBatisUtils.getMapper(UserMapper.class);
        List<User> list = userMapper.selectAll();
        list.forEach(System.out::println);
        MyBatisUtils.close();
}
           
mybatis-------------(一篇足矣)mybatis

結果集映射Result

實際開發中,如果資料庫字段和Java對象字段不能對應,就需要我們編寫對應關系。

注解 描述
@Results 對象和表的映射關系。
@Result 一個對象屬性和一個表的字段的映射關系。
@ResultMap 映射關系,使用@Results聲明的映射關系。

文法:

/** 
	@Results(value = 一組Result )
*/    
@Results(value = {
     @Result(property = "屬性名", column = "字段名", id = true),
     @Result(property = "屬性名2", column = "字段名2"),
     @Result(property = "屬性名3", column = "字段名3")
})
           

注解版注解總結

注解名稱 描述
@Insert 添加sql
@Update 更新sql
@Delete 删除sql
@Select 查詢sql
@Param 形參命名
@Results 對象和表的映射關系。
@Result 一個對象屬性和一個表的字段的映射關系。

分頁查詢

文法:

1) 設定分頁資料
PageHelper.startPage(int pageNum, int pageSize)
	參數1:pageNum 第幾頁
	參數2:pageSize 頁面顯示個數
2) 封裝分頁結果 PageInfo
	new PageInfo(查詢結果)	  //建立分頁對象
	pageInfo.getTotal(),	//自動查詢總條數
	pageInfo.getPages(),	//總分頁數

//TODO: 實際操作
public static void main(String[] args) {
        StudentMapper studentMapper = MyBatisUtils.getMapper(StudentMapper.class);

        //設定分頁參數
        PageHelper.startPage(1,2);
        //分頁資料
        List<Student> list = studentMapper.searchAllStudent();

        //分頁封裝
        PageInfo<Student> pageInfo = new PageInfo<>(list);
        System.out.println("總條數:"+pageInfo.getTotal());
        System.out.println("每頁個數:"+pageInfo.getPageSize());
        System.out.println("目前頁:"+pageInfo.getPageNum());
        System.out.println("分頁數:"+pageInfo.getPages());
        System.out.println("是否上一頁:"+pageInfo.isHasPreviousPage());
        System.out.println("是否下一頁:"+pageInfo.isHasNextPage());
        MyBatisUtils.commitAndclose();
}
           

通用Mapper

概述

  • 通用Mapper對MyBatis進行簡化的第三方工具包。
  • 通用Mapper提供了一個名為

    Mapper<T>

    的接口,用于自動完成單表的增删改查操作。
  • 如果通用Mapper中的方法不足以滿足你的需求,直接添加自定義方法即可。
public interface UserMapper extends Mapper<User> {
}
           

API

  • 查詢方法
    方法名 描述
    T selectOne(T t) 根據實體中的屬性進行查詢,隻能有一個傳回值,有多個結果是抛出異常,查詢條件使用等号
    List select(T t) 根據實體中的屬性值進行查詢,查詢條件使用等号
    List selectAll() 查詢全部結果
    int selectCount(T t) 根據實體中的屬性查詢總數,查詢條件,使用等号
    T selectByPrimaryKey(Object key) 根據主鍵字段進行查詢
    boolean existsWhithPrimaryKey(Object key) 根據主鍵字段查詢記錄是否存在
    List selectByExample(Object example) 根據Example條件進行查詢
    T selectOneByExample(Object example) 根據Example條件進行查詢,隻能有一個傳回值
    int selectCountByExample(Object example) 根據Example條件進行查詢記錄數
  • 插入方法
    方法名 描述
    int insert(T t) 儲存一個實體,null的屬性也會儲存,不會使用資料庫預設值
    int intsertSelective(T t) 儲存一個實體,null的屬性不會儲存,使用資料庫預設值
  • 更新方法
    方法名 描述
    int updateByPrimaryKey(T t) 根據主鍵更新實體全部字段,null值會被更新
    int updateByPrimaryKeySelective(T t) 根據主鍵更新實體中不為null值的字段
  • 删除方法
    方法名 描述
    int delete(T t) 根據實體屬性作為條件進行删除,查詢條件使用等号
    int deletePrimaryKey(Object key) 根據主鍵字段進行删除
    int deleteByExample(Object example) 根據Example條件删除資料

mybatis的XML方式

入門案例:查詢指定使用者

一. 修改核心配置檔案

<mappers>
	<!-- 表示加載此包下的所有dao接口-->
	<mapper resource="mapper/UserMapper.xml"/>
</mappers>
           

二. UserMapper接口

public interface UserMapper {
    /**
     * 查詢使用者
     * @return
     */
    public List<User> searchUser(String userName);
}
           

三. 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.czxy.dao.UserMapper">
	<select id="searchUser" parameterType="string" resultType="user">
        select * from `user` where user_name=#{userName}
    </select>
</mapper>
           

四. 測試類

/**
   * 查詢使用者資訊
   */
    @Test
    public void searchUser(){
        UserMapper userMapper = MyBatisUtils.getMapper(UserMapper.class);
        List<User> list = userMapper.searchUser("張三");
        list.forEach(System.out::println);
        MyBatisUtils.commitAndclose();
    }
           

Mapper基本結構

<?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="Mapper類">
	<!-- 查詢 -->
    <select id="方法名">SQL語句</select>
    
	<!-- 添加 -->
	<insert id="方法名">SQL語句</insert>
    
    <!-- 更新 -->
	<update id="方法名">SQL語句</update>
    
    <!-- 删除 -->
	<delete id="方法名">SQL語句</delete>
</mapper>
           

Mapper 參數類型:parameterType

  • 在映射檔案mapper中,我們使用parameterType設定請求參數的類型
<?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="mapper類">
    <select id="方法名" parameterType="參數類型">SQL語句</select>
</mapper>
           
  • 簡單類型:
    <!-- 通過id查詢 -->
    <select id="findUserById" parameterType="int" resultType="com.czxy.domain.User">
    	select * from user where uid = #{id}
    </select>
               
  • POJO類型:
    <!-- 添加使用者 -->
    <insert id="insertUser" parameterType="com.czxy.domain.User">
    	insert into user(uid, username, password, name, email, birthday, sex, state) values(#{uid},#{username},#{password},#{name},#{email},#{birthday},#{sex},#{state})
    </insert>
               

Mapper 結果類型:resultType

  • 在映射檔案mapper中,我們使用resultType設定查詢結果類型
<?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="mapper類">
    <select id="方法名" resultType="結果類型">SQL語句</select>
</mapper>
           
  • 簡單類型
    <!-- 總記錄數 -->
    <select id="findUserCount"  resultType="int">
    	select count(*) from user
    </select>
               
  • POJO類型
    <!-- 通過id查詢 -->
    <select id="findUserById" parameterType="int" resultType="com.czxy.domain.User">
    	select * from user where uid = #{id}
    </select>
               

Mapper 映射關系:ResultMap

  • resultType可以指定pojo将查詢結果封裝到該pojo中,但需要pojo的屬性名和sql查詢的列名保持一緻。
  • 如果sql查詢字段名和pojo的屬性名不一緻,可以通過resultMap将字段名和屬性名作一個對應關系。
  • 文法:
    <!--聲明映射-->
    <resultMap type="JavaBean類型" id="resultMap名稱">
    	<id column="表列名" property="JavaBean屬性名"/>		<!--用于配置主鍵的映射-->
    	<result column="表列名" property="JavaBean屬性名"/>	<!--用于配置普通結果集映射-->
    </resultMap>
    <!--使用映射-->
    <select resultMap="resultMap名稱">
    </select>
               

自定義别名

  • 聲明别名,在 SqlMapConfig.xml 配置檔案中聲明
    • 方式1:一次定義一個類
      <typeAliases>
      	<typeAlias type="類型" alias="别名"/>
      </typeAliases>
                 
    • 方式2:一次定義一個包下的所有類
      <typeAliases>
      	<package name="包名"/>
      </typeAliases>
                 

動态SQL

什麼是動态SQL

動态SQL就是Mybatis允許在映射檔案中通過标簽控制SQL語句最後的拼湊結果。

if 标簽

  • 文法:在mapper映射檔案中,<if>标簽就相當于Java中if語句,如果條件成立,标簽體内的SQL語句有效。
    <select>
    	<if test="條件">
    		//有效的SQL語句片段
    	</if>
    <select>
               
  • 多條件查詢,拼湊恒等條件 where 1=1
    <select id="condition" parameterType="userVo" resultType="user" >
    		select * from user where 1=1
    		<if test="name != null and name != ''">
    			and name like '%${name}%'
    		</if>
    	</select>
               

where 标簽

  • 多條件查詢時,我們使用了一個小技巧“where 1=1”,mybatis提供了一個

    <where>

    進行取代。
  • 修改映射檔案
    <select id="condition" parameterType="userVo" resultType="user" >
    		select * from user
    		<where>
    			<if test="name != null and name != ''">
    				and name like '%${name}%'
    			</if>
    		</where>
    	</select>
               

foreach 标簽

  • 文法:
    <!--
    <foreach> 就是周遊一組資料,根據指定的内容拼湊成SQL語句片段
    		collection ,需要周遊的資料,如果實際參數就是數組本身,此處需要使用array
    		item ,每一次循環時存放資料的變量,在标簽體中可以通過 ${item值}獲得周遊資料
    		open ,SQL語句片段的開發位置
    		separator,分隔符号
    		close ,SQL語句片段的結束位置
    -->
    
    <!-- 例如:uid in (1,2,4,6) 片段的拼湊
    	開始 (變量 分隔符)*4 結束
    -->
    <foreach collection="數組" open="uid in (" item="變量" separator=","  close=")">
    </foreach>
               
  • 多條件查詢
    <select id="condition" parameterType="userVo" resultType="user" >
    		select * from user
    		<where>
    			<!-- uid in (1,2,4,6) -->
    			<foreach collection="ids" open="uid in (" item="id" separator="," close=")">
    				'${id}'
    			</foreach>
    		</where>
    	</select>
               

choose 标簽:多條件

  • 文法

    類似java中的switch,滿足when中的條件退出判斷,如果都不滿足就進入otherwise

<select id="">
		<choose>
			<when test=""></when>
			<when test=""></when>
			<otherwise></otherwise>
		</choose>
	</select>
           

sql 标簽

  • MyBatis為我們提供了代碼片段,使用

    <sql>

    定義公共SQL語句,使用

    <include>

    将需要的SQL片段拼湊到指定的位置。
<!-- 所有字段名稱SQL片段 -->
<sql id="user_all_column">uid, username, password, name, email, birthday, sex, state</sql>

<select id="selectAll" parameterType="string" resultMap="userResultMap">
	select <include refid="user_all_column" /> from user
</select>
           

自動比對規範駝峰規則

資料庫中我們習慣使用全大寫,多個單詞用下劃線隔開,而po對象中,習慣使用java駝峰規則。那一個一個手工寫resultMap字段,浪費開發時間,直接配置一下就可以了。

如:

資料庫字段: user_name

Javabean屬性: private String userName

mapper配置不需要寫字段與屬性的配置,會自動映射

  1. 在SqlMapConfig.xml中進行配置
<settings>
	<!--駝峰映射-->
	<!--java對象樹形駝峰 例如userName,對應資料的下劃線 例如:user_name-->
	<setting name="mapUnderscoreToCamelCase" value="false"/>
</settings>
           
  1. resultMap配置autoMapping=“true”
<resultMap type="String" id="user" autoMapping="true">

</resultMap>