Mybatis--簡介和動態SQL

MyBatis

前身是iBatis ,是Apache的一個開源項目,主要作用是實體類與SQL語句之間建立映射關係。

特點

  • 基於SQL語句,簡單易學。
  • 能瞭解底層封裝過程。
  • SQL語句封裝在配置文件中,便於統一管理和維護,降低程序耦合度。
  • 方便程序代碼調試。

持久化及ORM(Object Relational Mapping)

1.持久化

持久化是程序數據在瞬時狀態轉化爲持久狀態的過程。

2.ORM-對象關係映射

是一種爲了解決面向對象與關係數據庫存在的互不匹配現象的技術;編寫程序時,以面向對象的方式處理數據;保存數據時,以關係型數據庫的方式存儲。

3.ORM解決方案
  • 在持久化對象上執行基本的增刪改查操作。
  • 對持久化對象提供查詢語言或API。
  • 提高了開發效率。

核心接口和類

1.SqlSessionFactoryBuilder
  • 生命週期只存在於方法內。
  • 負責構建SqlSessionFactory,提供多個build方法重載。
  • 可重用來創建多個SqlSessionFactory實例。
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
	//以字節流形式創建會話工廠
SqlSessionFactory FACTORY = new SqlSessionFactoryBuilder().build(is);

配置信息以三種形式提供給build方法
InputStream(字節流)Reader(字符流)Configuration()
2.SqlSessionFactory
  • 生命週期與應用的生命週期相同。
  • 負責創建SqlSession實例。
  • 在其運行期內只有一個實例(單例)。
SqlSession session = FACTORY.openSession(boolean autoCommit)
//autoCommit是控制事務控制的參數
true:關閉事務控制(默認)
false:開啓事務控制
3.SqlSession
  • 生命週期爲一次會話,會話結束後必須關閉。
  • 線程級別,不能夠共享。
  • 包含了SQL執行的所有方法。
//按語句查詢
session.selectList("查詢語句");
//按接口查詢,
session.getMapper(接口名.class).方法名();
//最後關閉session,一般放在try{}catch{}語句中的finally{}語句塊
session.close();

核心配置文件

1.配置文件結構
configuration----配置
    properties----引入相關的屬性配置文件
    settings----修改MyBatis在運行時的行爲方式
    tyypeAliases----爲Java類型命名一個別名/簡稱
    typeHandlers----類型處理器
    objectFactory----對象工廠
    plugins----插件
    environments----環境配置
        environment----環境變量
            transactionManager----事務管理器
            dataSource----數據源
    mappers----映射器
2.配置文件示例
<?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 resource="database.properties"></properties>
	<!-- 配置運行相關信息 -->
	<settings>	
		<setting name="logImpl" value="LOG4J" />
	</settings>
	<!-- 配置別名,掃描整個包下的類 -->
	<typeAliases>
		<!-- <typeAlias alias="user" type="com.fan1111.pojo.User"/> -->
		<package name="com.fan1111.pojo"/>
	</typeAliases>
	<!-- 配置運行環境 -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="POOLED">
                                <!-- 讀取外部數據庫配置信息 -->
				<property name="driver" value="${DRIVER}"/>
				<property name="url" value="${URL}"/>
				<property name="username" value="${USER}"/>
				<property name="password" value="${PWD}"/>
			</dataSource>
		</environment>
	</environments>	
	<!-- 映射器 -->
	<mappers>
		<mapper resource="com/fan1111/dao/user/UserMapper.xml"/>
		<mapper resource="com/fan1111/dao/provider/ProviderMapper.xml"/>
	</mappers>
</configuration>
3.常用全局配置屬性(settings元素)

settings常用全局配置

4.配置文件中配置數據源的兩種方式
直接配置方式:
    <properties>
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/fanyi"/>
        <property name="user" value="root"/>
        <property name="password" value="1234"/>
    </properties>
引入配置方式:
    <properties resource="database.properties"></properties>
如果兩種方式同時使用,在環境變量中引入數據源時,引入方式會優先於直接方式。

mapper映射

1.映射userMapper示例

按照映射關係,數據庫字段名與JavaBean的屬性名要保持一致。

<?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.fan1111.dao.user.UserMapper">
<!-- id要與對應接口中的方法名一致 -->
	<select id="userList" resultType="user">
		SELECT * FROM table_user
	</select>
	<resultMap type="User" id="userRole">
		<result property="id" column="id"/>
		<result property="userRoleName" column="RoleName"/>	
	</resultMap>
    <!-- 參數傳遞使用#{參數名/Map的key/註解名} -->
	<select id="userRole" resultMap="userRole" parameterType="Map">
		select u.*,r.RoleName from table_user u,table_role r 
		WHERE u.userRole = r.id and u.userRole = #{userRole} and u.userName LIKE CONCAT('%',#{userName},'%')
	</select>
	<!-- 添加用戶的SQL映射 -->
	<insert id="addUser" parameterType="User">
		INSERT INTO table_user(userCode,userName,userPassword,gender,birthday,phone,address,userRole,createdBy,creationDate) 
		VALUES(#{userCode},#{userName},#{userPassword},#{gender},#{birthday},#{phone},#{address},#{userRole},#{createdBy},#{creationDate})
	</insert>	
	<update id="updUser" parameterType="User">
		UPDATE table_user SET 
			userCode=#{userCode},
			userName=#{userName},
			userPassword=#{userPassword},
			gender=#{gender},
			birthday=#{birthday},
			phone=#{phone},
			address=#{address},
			userRole=#{userRole},
			modifyBy=#{modifyBy},
			modifyDate=#{modifyDate}
		WHERE id=#{id}
	</update>
<delete id="delUser">
		delete from table_user where id = #{id}
	</delete>		
</mapper>
2.resultMap屬性和子元素

屬性

  • id----resultMap的唯一標識
  • type----java實體類

子元素

  • id----一般對應數據庫中該行的主鍵id,設置此項可提高mybatis性能
  • result----映射到JavaBean的某個“簡單類型”屬性,如Integer、String
  • association----映射到JavaBean的某個“複雜類型”屬性,如JavaBean類
  • collection----映射到JavaBean的某個“複雜類型”屬性,如集合
3.association複雜類型——關聯
 <resultMap type="Role" id="roleResult">
	<id property="id" column="r_id"/>
	<result property="roleCode" column="roleCode"/>
	<result property="roleName" column="roleName"/>
</resultMap>
	
<resultMap type="User" id="userRoleResult">
    <id property="id" column="id"/>
    <result property="userCode" column="userCode"/>
    <result property="userName" column="userName"/>
    <result property="userRole" column="userRole"/>
    <association property="role" javaType="Role" resultMap="roleResult"/>		
</resultMap>
4.collection複雜類型——集合
<resultMap type="User" id="userAddress">
	<id property="id" column="id"/>
	<result property="userCode" column="userCode"/>
	<result property="userName" column="userName"/>
	<collection property="addressList" ofType="Address">
		<id property="id" column="a_id"/>
		<result property="contact" column="contact"/>
		<result property="addressDesc" column="addressDesc"/>
		<result property="postCode" column="postCode"/>
		<result property="tel" column="tel"/>
	</collection>
</resultMap>

動態SQL

1.if

實現簡單的條件判斷。

<select id="userList" resultType="user">
	SELECT * FROM table_user WHRER 1=1
	<if test="id != null">AND id=#{id}</if>
</select>
2.where

智能處理and/or,簡化where條件判斷。

<select id="userList" resultType="user">
	SELECT * FROM table_user 
	<where>
		<if test="id != null">
			AND id=#{id}
		</if>
	</where>	
</select>
3.trim

更靈活的去除多餘的關鍵字,可代替where。

屬性 說明
prefix 前綴
prefixOverrides 可覆蓋的前綴
suffix 後綴
suffixOverrides 可覆蓋的後綴
<update id="modify" parameterType="User">
    update table_user
    <trim prefix="set" suffixOverrides="," suffix="where id=#{id}">
        <if test="userCode != null">userCode = #{userCode},</if>
        <if test="userName != null">userName = #{userName},</if>
    </trim>
</update>
4.choose(when/otherwise)

相當於switch語句,當when有條件滿足時,跳出choose,一般情況下很少使用。

<choose>
	<when test="條件1">語句1</when>
	<when test="條件2">語句2</when>
	<when test="條件3">語句3</when>
	<otherwise>語句4</otherwise>
</choose>
5.foreach

迭代一個集合,通常用於in條件

屬性 說明
item 被迭代項目
collection 集合:list、array、map-key
index 下標,可選
open 開始符號,可選
separator 分隔符,可選
close 關閉符號,可選
<resultMap type="User" id="userMapByRole">
	<id property="id" column="id"/>
	<result property="userCode" column="userCode"/>
	<result property="userName" column="userName"/>
</resultMap>
<select id="getUserByRoleId" resultMap="userMapByRole">
	SELECT * FROM table_user where userRole in
	<foreach collection="array" item="roleIds" open="(" separator="," close=")">
	#{roleIds}
	</foreach>
</select>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章