Java框架:Mybatis:入門

發展介紹:https://github.com/mybatis/mybatis-3/releases

  • MyBatis是apache的一個開源項目iBatis, 實質上Mybatis對ibatis進行一些改進。
  • MyBatis是一個持久層框架,它對jdbc操作數據庫的過程進行封裝;開發者只需要關注SQL本身,不需要去處理例如註冊驅動、創建connection、創建statement、手動設置參數、結果集檢索等jdbc繁雜的過程。

原理:

Mybatis通過xml或註解方式將要執行的各種statement(statement、preparedStatement、CallableStatement)配置,並通過java對象和statement中的sql進行映射生成最終執行的sql語句,最後由mybatis框架執行sql並將結果映射成java對象並返回。

 Mybatis執行流程

 配置文件

  • 全局配置:數據源、事務等
  • 映射配置:配置了SQL執行相關

全局配置:SqlMapConfig.xml

Mybatis配置文件頭---可以從mybatis-3.x.x.pdf文件複製
<?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="db.properties"/>

	<!-- 配置mybatis的環境信息 -->
	<environments default="development">

		<environment id="development">
			<!-- 配置JDBC事務控制,由mybatis進行管理 -->
			<transactionManager type="JDBC"></transactionManager>
			
			<!-- 配置數據源,採用dbcp連接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8"/>
				<property name="username" value="root"/>
				<property name="password" value="12345"/>
			</dataSource>
			
            <!-- 配置數據源,採用dbcp連接池  配合 db.properties 全局修改-->
            <dataSource type="POOLED">
                <property name="driver" value="${driverClass}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${name}"/>
                <property name="password" value="${password}"/>
            </dataSource>

		</environment>
	</environments>
	
	<!-- mybatis加載映射文件-->
    <mappers>

        <package name="com.zjc.mapper"></package>

    </mappers>
	
	<!-- 配置別名 -->
    <typeAliases>
        
        <!-- 方式一:直接指定類名,自定義別名-->
        <typeAlias type="com.zjc.model.User" alias="user"></typeAlias>

        <!-- 方式二:指定包名時,別名就是類名的小寫,例如 User類 別名就是user-->
        <package name="com.zjc.model"></package>
       
    </typeAliases>
	
</configuration>

typeAliases別名: 

  • 在映射文件中可以方便的去指定參數和結果集的類型

  • 方式一:直接指定類名,自定義別名  
  • 方式二:指定包名時,別名就是類名的小寫,例如 User類 別名就是user

加載映射文件方式:

  • 方式一:寫映射文件的名字(僅限dao方式)    <mapper resource="com/zjc/mapper/UserMapper.xml"></mapper>
  • 方式二:寫類名,一定要有個映射文件與之對應  <mapper class="com.zjc.mapper.UserMapper"></mapper>
  • 如果沒有,那麼在UserMapper要聲明註解(mapper.xml中的執行語句)(不建議)
  • 方式三:寫包名  <package name="com.zjc.mapper"></package>(強力推薦)(mapper方式)

映射文件配置:User.xml映射文件 (com.zjc.mapper)

Mybatis的映射文件---可以從mybatis-3.x.x.pdf文件中複製
<?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.zjc.mapper.XxxMapper">

	<!-- 測試 -->
	<select id="findUserById" parameterType="int" resultType="com.zjc.model.User">
		SELECT * FROM USER WHERE id = #{id}
	</select>
	
</mapper>
  • id:statement的id,要求在命名空間內唯一  
  • parameterType:傳入參數的java類型
  • resultType:查詢出的單條結果集對應的java類型
  • #{}: 表示一個佔位符?
  • #{id}:表示該佔位符待接收參數的名稱爲id。如果參數爲簡單類型時,#{}裏面的參數名稱可以任意定義

resultType和resultMap關係

使用resultType進行結果映射時,列名和映射的pojo屬性名完全一致,該列才能映射成功(全不爲null),全部不一致,則不會創建pojo對象;有一個一致,就會創建pojo對象(部分爲null);如果查詢出來的列名和屬性名不一致,可以通過定義一個resultMap將列名和pojo屬性名之間作一個映射關係。  

  • <!--.設置返回數據爲resultMap -->
    <resultMap id="userResultMap" type="user">
    	<id property="id" column="id_"></id>
    	<result property="username" column="username_"></result>
    	<result property="sex" column="sex_"></result>
    	<result property="birthday" column="birthday_"></result>
    	<result property="address" column="address_"></result>
    </resultMap>
    
    <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
    	SELECT
    	 id id_,
    	 username username_,
    	 sex sex_,
    	 birthday birthday_,
    	 address address_
    	FROM user WHERE id = #{id}
    </select>

 


 案例分析:

模糊查詢   like '%${value}%'     value在方法調用傳入

	<select id="findUserByName" parameterType="String" resultType="com.gyf.domain.User">
		SELECT * FROM USER WHERE username like '%${value}%'
	</select>
  • ${}:表示拼接SQL字符串
  • ${value}:參數爲簡單類型時,參數名稱必須爲value 
  • ${}會引起SQL注入,一般情況下不推薦使用。但是有些場景必須使用${},比如order by ${colname

 增刪改

   <!--插入數據-->
    <insert id="insertUser" parameterType="com.zjc.model.User">
        INSERT INTO user (username,sex,birthday,address)
        VALUE (#{username},#{sex},#{birthday},#{address});
    </insert>

    <!--刪除-->
    <delete id="deleteUser" parameterType="int">
        DELETE FROM user where id = #{id};
    </delete>

    <!--更新-->
    <update id="updateUser" parameterType="com.zjc.model.User">
        UPDATE user SET address = #{address},sex = #{sex}
        WHERE id = #{id}
    </update>

主鍵返回:自增主鍵 :獲取到剛插入的自增主鍵

<insert id="insertUser" parameterType="com.zjc.model.User">

		<selectKey keyProperty="id" resultType="int" order="AFTER">
			SELECT LAST_INSERT_ID()
		</selectKey>

		INSERT INTO USER (username,sex,birthday,address) 
		VALUES(#{username},#{sex},#{birthday},#{address})

</insert>
  • selectKey標籤:通過select查詢來生成主鍵
  • keyProperty:自增主鍵對應數據庫列名
  • resultType:主鍵所對應的Java類型
  • order:指定查詢主鍵SQL語句的執行順序,after==執行完insert查詢語句返回主鍵
  • last_insert_id:MySQL的函數,要配合insert語句一起使用

主鍵返回:自增UUID 

<insert id="insertUser" parameterType="com.zjc.model.User">

		<selectKey keyProperty="id" resultType="String" order="BEFORE">
			SELECT UUID()
		</selectKey>

		INSERT INTO USER (username,sex,birthday,address) 
		VALUES(#{username},#{sex},#{birthday},#{address})
</insert>

 

 

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