發展介紹: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&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>