一、瞭解什麼是Mybatis
二、前期準備
下載jar包或者使用maven加入依賴,如果使用maven,可加入以下依賴:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
三、配置整體Mybatis配置文件(Configuration.xml)
基本配置文件xml如下:
<?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>
<!-- 這些先暫時不用
<settings>
//有很多屬性可以設置,比如是否使用自動生成的主鍵,等等。。。
<setting name="useGeneratedKeys" value="false"/>
<setting name="useColumnLabel" value="true"/>
</settings>
-->
<!--定義別名,方便別處引用,不是必須的-->
<typeAliases>
<typeAlias alias="UserAlias" type="com.gusi.demo.chat.pojo.User"/>
</typeAliases>
<!--設置數據庫相關的連接信息等-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/autochat"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--設置實體類的映射配置文件xml-->
<mappers>
<mapper resource="com/gusi/demo/chat/pojo/User.xml"/>
</mappers>
</configuration>
四、書寫實體類以及映射配置文件( User.java, User.xml)
User.java 省略
User.xml:
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="User">//命名空間,需要唯一
<resultMap type="com.gusi.demo.chat.pojo.User" id="UserResult">//將查詢結果映射成JavaBean
<id column="id" jdbcType="INTEGER" property="id"/>//數據庫中主鍵映射
<result column="username" jdbcType="VARCHAR" property="username"/>//column表示sql查詢返回的列名
<result column="password" jdbcType="VARCHAR" property="password.encrypted"/>//property表示JavaBean中屬性名
<result column="administrator" jdbcType="BOOLEAN" property="administrator"/>//jdbcType表示數據庫字段類型
</resultMap>
//該語句通過命名空間和ID唯一標識,在java代碼中調運該語句即可執行該語句對應的sql
//parameterType是參數類型,可以是基本類型,也可是JavaBean類型
//resultMap表示使用定義的哪個映射關係將結果集合轉換爲JavaBean
<select id="find" parameterType="long" resultMap="UserResult">
SELECT * FROM user WHERE id = #{id:INTEGER}
</select>
//如果返回的是基本數據類型,就不用resultMap,直接使用resultType指定返回數據類型
<select id="version" parameterType="long" resultType="int">
SELECT version FROM user WHERE id = #{id,jdbcType=INTEGER}
</select>
//如果沒有返回結果,resultMap和resultType都不需要
<delete id="delete" parameterType="com.gusi.demo.chat.pojo.User">
DELETE FROM user WHERE id = #{id:INTEGER}
</delete>
//在此可以使用別名,方便書寫,比如下面的UserAlise是在整體的配置文件中聲明的別名
<insert id="insert" parameterType="UserAlias" useGeneratedKeys="false">
INSERT INTO user
( id,
username,
password,
administrator
)
VALUES
( #{id},
#{username,jdbcType=VARCHAR},
#{password.encrypted:VARCHAR},
#{administrator,jdbcType=BOOLEAN}
)
</insert>
<update id="update" parameterType="UserAlias">
UPDATE user SET
username = #{username,jdbcType=VARCHAR},
password = #{password.encrypted,jdbcType=VARCHAR},
administrator = #{administrator,jdbcType=BOOLEAN}
WHERE
id = #{id,jdbcType=INTEGER}
</update>
<!-- Unique constraint check -->
<select id="isUniqueUsername" parameterType="map" resultType="boolean">
SELECT (count(*) = 0)
FROM user
WHERE ((#{userId,jdbcType=BIGINT} IS NOT NULL AND id != #{userId,jdbcType=BIGINT}) OR #{userId,jdbcType=BIGINT} IS
NULL) <!-- other than me -->
AND (username = #{username,jdbcType=VARCHAR})
</select>
</mapper>
五、通過Mybatis獲取的數據庫的會話session
// 1通過配置文件獲取數據庫連接信息
InputStream inputStream = Resources.getResourceAsStream("Configuration.xml");
//創建SessionFactoryBuilder
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//通過SessionFactoryBuilder獲得SessionFactory
SqlSessionFactory sqlSessionFactory = builder.build(inputStream);
//通過SessionFactory獲得session
SqlSession sqlSession = sqlSessionFactory.openSession();
六、通過session,對數據庫操作(編寫dao類)
SqlSession sqlSession = sessionFactory.openSession();//獲得session
List list = sqlSession.selectList("Namespace.sqlId", paramObj);//查詢列表集合
Object obj = sqlSession.selectOne("Namespace.sqlId", paramObj);//查詢一條記錄
sqlSession.insert("Namespace.sqlId", paramObj);//插入記錄
sqlSession.update("Namespace.sqlId", paramObj);//修改記錄
sqlSession.delete("Namespace.sqlId", paramObj);//刪除記錄
sqlSession.commit();//默認事物是不提交的,需要手動自動提交
七、編寫測試
@Test
public void shouldInsertNestedPasswordFieldOfComplexType() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//Create User
User user = new User();
user.setId(500000L);
user.setPassword(new EncryptedString("secret"));
user.setUsername("johnny" + Calendar.getInstance().getTimeInMillis());//random
user.setAdministrator(true);
sqlSession.insert("User.insert", user);
//Retrieve User
user = (User) sqlSession.selectOne("User.find", user.getId());
assertNotNull(user.getId());
sqlSession.rollback();
} finally {
sqlSession.close();
}
}
到此基本流程完畢!接下來重點說明配置文件User.xml等
配置文件xml詳細解釋:
整個框架的核心就是實體映射配置文件xxx.xml(User.xml)文件中。通過配置該文件,實現數據庫中的數據和JavaBean的交互(讀寫)。每一個和數據庫交互的語句都被放在一個select、insert、update、delete標籤內。每個這樣的標籤有一個唯一標識,java代碼就是通過該唯一標識去執行特定的語句,比如上面的sqlSession.selectList("Namespace.sqlId",parameObj)中的“NameSapce.sqlId”就是一條sql語句的唯一標識。標籤內的語句可以接受java代碼傳遞的參數,比如上面parameObj就是傳遞和接收的參數,該參數可以是具體的java基本類型和String類型,也可以是複雜的對象類型或者集合類型,如果是基本類型或者String類型那麼在配置文件中通過#{_parameter}獲取,如果是集合類型那麼在配置文件中通過#{list}獲取,如果是複雜對象類型那麼在配置文件中通過#{obj的attribute}直接獲取。然後根據條件以及接收的參數動態拼裝sql,動態拼裝sql的時候,會使用的ognl表達式一個各種條件標籤如<if><foreach><where><set><trim>等標籤。通過上面一系列的操作,最終會得到一個sql語句,Mybatis執行該sql語句以後如果有返回結果,返回結果是基本類型就直接用returnType限定,如果是複雜類型或者集合類型,就通過returnMap轉換,然後將轉化的結果返回給java代碼中的調運結果。整個流程簡單總結就是:參數映射->sql解析->sql執行->結果映射,對於數據寫入和讀取都是同樣流程。
配置文件xml標籤總結:
標籤類型 |
標籤 |
說明 |
定義sql語句 |
select |
查詢語句 |
|
insert |
插入語句 |
|
update |
更新語句 |
|
delete |
刪除語句 |
結果映射 |
resultMap |
結果集合和javaBean映射配置 |
|
collection |
一對多中多方集合映射 |
|
association |
多對一中一放對象映射 |
動態sql拼接 |
if |
條件標籤 |
|
choose/when/otherwise |
條件選擇標籤 |
|
foreach |
循環迭代標籤 |
格式化輸出 |
where |
查詢時候快捷拼接條件 |
|
set |
更新時候快捷拼接值 |
|
trim |
指定前綴後綴等,可達到where/set效果 |
常量定義使用 |
sql |
定義一段常量 |
常量引用使用
|
include |
引用一段常量 |
resultMap |
結果集合映射到JavaBean中,返回的結果是JavaBean |
resultType |
結果返回的是一個Java基礎類型或者String類型,不需要映射 |
parameterMap |
請求參數的JavaBean映射,不推薦使用 |
parameterType |
定義請求參數的class類型,可以是JavaBean類型,也可以是基礎java類型或者String |
#{}/${} |
#{}表示的是問好(?)佔位符,更常用。${}表示的是直接用參數代替,不會加引號,一般在排序的時候可能會用到。 |
#{}/ognl內容取值 |
簡單類型參數用#{_parameter},集合類型用#{list},JavaBean類型直接用#{attribute} |