一、Mybatis簡介
1.Mybatis簡介
1.1原始jdbc操作(查詢數(shù)據(jù))
?文章來源地址http://www.zghlxwxcb.cn/news/detail-519072.html
1.2原始jdbc操作(插入數(shù)據(jù))
?
1.3 原始jdbc操作的分析
原始jdbc開發(fā)存在的問題如下:
①數(shù)據(jù)庫連接創(chuàng)建、釋放頻繁造成系統(tǒng)資源浪費從而影響系統(tǒng)性能;
②sql 語句在代碼中硬編碼,造成代碼不易維護,實際應用 sql 變化的可能較大,sql 變動需要改變java代碼;
③查詢操作時,需要手動將結(jié)果集中的數(shù)據(jù)手動封裝到實體中。插入操作時,需要手動將實體的數(shù)據(jù)設置到sql語句的占位符位置。
應對上述問題給出的解決方案:
①使用數(shù)據(jù)庫連接池初始化連接資源;
②將sql語句抽取到xml配置文件中;
③使用反射、內(nèi)省等底層技術(shù),自動將實體與表進行屬性與字段的自動映射。
1.4 什么是Mybatis
mybatis 是一個優(yōu)秀的基于java的持久層框架,它內(nèi)部封裝了jdbc,使開發(fā)者只需要關注sql語句本身,而不需要花費精力去處理加載驅(qū)動、創(chuàng)建連接、創(chuàng)建statement等繁雜的過程。
mybatis通過xml或注解的方式將要執(zhí)行的各種 statement配置起來,并通過java對象和statement中sql的動態(tài)參數(shù)進行映射生成最終執(zhí)行的sql語句。
最后mybatis框架執(zhí)行sql并將結(jié)果映射為java對象并返回。采用ORM思想解決了實體和數(shù)據(jù)庫映射的問題,對jdbc 進行了封裝,屏蔽了jdbc api 底層訪問細節(jié),使我們不用與jdbc api 打交道,就可以完成對數(shù)據(jù)庫的持久化操作。
2.Mybatis的快速入門
2.1 MyBatis開發(fā)步驟
MyBatis官網(wǎng)地址:mybatis – MyBatis 3 | Introduction
MyBatis開發(fā)步驟:
①添加MyBatis的坐標;
②創(chuàng)建user數(shù)據(jù)表;
③編寫User實體類;
④編寫映射文件UserMapper.xml;
⑤編寫核心文件SqlMapConfig.xml;
⑥編寫測試類。
2.2 環(huán)境搭建
(1)導入MyBatis的坐標和其他相關坐標
<!--mybatis坐標-->
<dependency>
? ?<groupId>org.mybatis</groupId>
? ?<artifactId>mybatis</artifactId>
? ?<version>3.4.5</version>
</dependency>
<!--mysql驅(qū)動坐標-->
<dependency> ? ?
? ?<groupId>mysql</groupId> ?
? ?<artifactId>mysql-connector-java</artifactId> ? ?
? ?<version>5.1.6</version> ? ?
? ?<scope>runtime</scope>
</dependency>
<!--單元測試坐標-->
<dependency> ? ?
? ?<groupId>junit</groupId> ? ?
? ?<artifactId>junit</artifactId> ? ?
? ?<version>4.12</version> ? ?
? ?<scope>test</scope>
</dependency>
<!--日志坐標-->
<dependency> ? ?
? ?<groupId>log4j</groupId> ? ?
? ?<artifactId>log4j</artifactId> ? ?
? ?<version>1.2.12</version>
</dependency>
(2)創(chuàng)建user數(shù)據(jù)表
?
(3)編寫User實體
public class User { ? ?
private int id; ? ?
private String username; ? ?
private String password;
? ?//省略get個set方法
}
(4)編寫UserMapper映射文件
<?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="userMapper"> ? ?
<select id="findAll" resultType="com.itheima.domain.User"> ? ? ? ?
select * from User ? ?
</select>
</mapper>
(5)編寫Mybatis核心文件
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN“ "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> ? ?
<environments default="development"> ? ? ? ?
<environment id="development"> ? ? ? ? ? ?
<transactionManager type="JDBC"/> ? ? ? ? ? ?
<dataSource type="POOLED"> ? ? ? ? ? ? ? ?
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///test"/> ? ? ? ? ? ? ? ?
<property name="username" value="root"/>
<property name="password" value="root"/> ? ? ? ? ? ?
</dataSource> ? ? ? ?
</environment> ? ?
</environments> ? ?
<mappers>
<mapper resource="com/itheima/mapper/UserMapper.xml"/>
</mappers>
</configuration>
?
2.3 編寫測試代碼
//加載核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//獲得sqlSession工廠對象
SqlSessionFactory sqlSessionFactory = new ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? SqlSessionFactoryBuilder().build(resourceAsStream);
//獲得sqlSession對象
SqlSession sqlSession = sqlSessionFactory.openSession();
//執(zhí)行sql語句
List<User> userList = sqlSession.selectList("userMapper.findAll");
//打印結(jié)果
System.out.println(userList);
//釋放資源
sqlSession.close();
3. MyBatis的映射文件概述
?
4. MyBatis的增刪改查操作
4.1 MyBatis的插入數(shù)據(jù)操作
(1)編寫UserMapper映射文件
<mapper namespace="userMapper"> ? ?
<insert id="add" parameterType="com.itheima.domain.User"> ? ? ? ?
insert into user values(#{id},#{username},#{password}) ? ?
</insert>
</mapper>
(2)編寫插入實體User的代碼
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new
? ? ? ? ? ? ? ? ? ? ? ?SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
int insert = sqlSession.insert("userMapper.add", user);
System.out.println(insert);
//提交事務
sqlSession.commit();
sqlSession.close();
(3)插入操作注意問題
? 插入語句使用insert標簽;
? 在映射文件中使用parameterType屬性指定要插入的數(shù)據(jù)類型;
?Sql語句中使用#{實體屬性名}方式引用實體中的屬性值;
?插入操作使用的API是sqlSession.insert(“命名空間.id”,實體對象);
?插入操作涉及數(shù)據(jù)庫數(shù)據(jù)變化,所以要使用sqlSession對象顯示的提交事務,即sqlSession.commit()。
4.2 MyBatis的修改數(shù)據(jù)操作
(1)編寫UserMapper映射文件
<mapper namespace="userMapper">
? ?<update id="update" parameterType="com.itheima.domain.User">
? ? ? update user set username=#{username},password=#{password} where id=#{id}
? ?</update>
</mapper>
?
(2)編寫修改實體User的代碼
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
int update = sqlSession.update("userMapper.update", user);
System.out.println(update);
sqlSession.commit();
sqlSession.close();
(3)修改操作注意問題
? 修改語句使用update標簽;
? 修改操作使用的API是sqlSession.update(“命名空間.id”,實體對象)。
4.3 MyBatis的刪除數(shù)據(jù)操作
1)編寫UserMapper映射文件
<mapper namespace="userMapper">
? ?<delete id="delete" parameterType="java.lang.Integer">
? ? ? delete from user where id=#{id}
? ?</delete>
</mapper>
?
2)編寫刪除數(shù)據(jù)的代碼
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
int delete = sqlSession.delete("userMapper.delete",3);
System.out.println(delete);
sqlSession.commit();
sqlSession.close();
3)刪除操作注意問題
? 刪除語句使用delete標簽;
?Sql語句中使用#{任意字符串}方式引用傳遞的單個參數(shù);
?刪除操作使用的API是sqlSession.delete(“命名空間.id”,Object)。
4.4 知識小結(jié)
增刪改查映射配置與API:
查詢數(shù)據(jù): List<User> userList = sqlSession.selectList("userMapper.findAll");
? ?<select id="findAll" resultType="com.itheima.domain.User">
? ? ? ?select * from User
? ?</select>
添加數(shù)據(jù): sqlSession.insert("userMapper.add", user);
? ?<insert id="add" parameterType="com.itheima.domain.User">
? ? ? ?insert into user values(#{id},#{username},#{password})
? ?</insert>
修改數(shù)據(jù): sqlSession.update("userMapper.update", user);
? ?<update id="update" parameterType="com.itheima.domain.User">
? ? ? ?update user set username=#{username},password=#{password} where id=#{id}
? ?</update>
刪除數(shù)據(jù):sqlSession.delete("userMapper.delete",3);
? ?<delete id="delete" parameterType="java.lang.Integer">
? ? ? ?delete from user where id=#{id}
? ?</delete>
5. MyBatis核心配置文件概述
5.1 MyBatis核心配置文件層級關系
?
5.2 MyBatis常用配置解析
1)environments標簽
數(shù)據(jù)庫環(huán)境的配置,支持多環(huán)境配置。
?
其中,事務管理器(transactionManager)類型有兩種:
JDBC:這個配置就是直接使用了JDBC 的提交和回滾設置,它依賴于從數(shù)據(jù)源得到的連接來管理事務作用域。
MANAGED:這個配置幾乎沒做什么。它從來不提交或回滾一個連接,而是讓容器來管理事務的整個生命周期(比如 JEE 應用服務器的上下文)。 默認情況下它會關閉連接,然而一些容器并不希望這樣,因此需要將 closeConnection 屬性設置為 false 來阻止它默認的關閉行為。
其中,數(shù)據(jù)源(dataSource)類型有三種:
UNPOOLED:這個數(shù)據(jù)源的實現(xiàn)只是每次被請求時打開和關閉連接。
POOLED:這種數(shù)據(jù)源的實現(xiàn)利用“池”的概念將 JDBC 連接對象組織起來。
JNDI:這個數(shù)據(jù)源的實現(xiàn)是為了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置數(shù)據(jù)源,然后放置一個 JNDI 上下文的引用。
2)mapper標簽
該標簽的作用是加載映射的,加載方式有如下幾種:
使用相對于類路徑的資源引用,例如:
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>;
使用完全限定資源定位符(URL),例如:
<mapper url="file:///var/mappers/AuthorMapper.xml"/>;
使用映射器接口實現(xiàn)類的完全限定類名,例如:
<mapper class="org.mybatis.builder.AuthorMapper"/>;
將包內(nèi)的映射器接口實現(xiàn)全部注冊為映射器,例如:
<package name="org.mybatis.builder"/>。
3)Properties標簽
實際開發(fā)中,習慣將數(shù)據(jù)源的配置信息單獨抽取成一個properties文件,該標簽可以加載額外配置的properties文件
?
4)typeAliases標簽
類型別名是為Java 類型設置一個短的名字。原來的類型名稱配置如下
?
配置typeAliases,為com.itheima.domain.User定義別名為user
?
?
上面我們是自定義的別名,mybatis框架已經(jīng)為我們設置好的一些常用的類型的別名
?
5.3 知識小結(jié)
核心配置文件常用配置:
properties標簽:該標簽可以加載外部的properties文件
<properties resource="jdbc.properties"></properties>
typeAliases標簽:設置類型別名
<typeAlias type="com.itheima.domain.User" alias="user"></typeAlias>
mappers標簽:加載映射配置
<mapper resource="com/itheima/mapper/UserMapping.xml"></mapper>
environments標簽:數(shù)據(jù)源環(huán)境配置標簽
?
6.MyBatis相應API
6.1 SqlSession工廠構(gòu)建器SqlSessionFactoryBuilder
常用API:SqlSessionFactory build(InputStream inputStream)
通過加載mybatis的核心文件的輸入流的形式構(gòu)建一個SqlSessionFactory對象
String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
其中, Resources 工具類,這個類在 org.apache.ibatis.io 包中。Resources 類幫助你從類路徑下、文件系統(tǒng)或一個 web URL 中加載資源文件。
6.2 SqlSession工廠對象SqlSessionFactory
SqlSessionFactory 有多個個方法創(chuàng)建SqlSession 實例。常用的有如下兩個:
?
6.3 SqlSession會話對象
SqlSession 實例在 MyBatis 中是非常強大的一個類。在這里你會看到所有執(zhí)行語句、提交或回滾事務和獲取映射器實例的方法。
執(zhí)行語句的方法主要有:
<T> T selectOne(String statement, Object parameter)
<E> List<E> selectList(String statement, Object parameter)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)
操作事務的方法主要有
void commit();
void rollback()。
二、Mybatis的Dao層實現(xiàn)
1.Mybatis的Dao層實現(xiàn)
1.1 傳統(tǒng)開發(fā)方式
1.1.1編寫UserDao接口
public interface UserDao {
? ?List<User> findAll() throws IOException;
}
1.1.2.編寫UserDaoImpl實現(xiàn)
public class UserDaoImpl implements UserDao {
? ?public List<User> findAll() throws IOException {
? ? ? ?InputStream resourceAsStream =
? ? ? ? ? ? ? ? ? ?Resources.getResourceAsStream("SqlMapConfig.xml");
? ? ? ?SqlSessionFactory sqlSessionFactory = new
? ? ? ? ? ? ? ? ? ?SqlSessionFactoryBuilder().build(resourceAsStream);
? ? ? ?SqlSession sqlSession = sqlSessionFactory.openSession();
? ? ? ?List<User> userList = sqlSession.selectList("userMapper.findAll");
? ? ? ?sqlSession.close();
? ? ? ?return userList;
? }
}
1.1.3 測試傳統(tǒng)方式
@Test
public void testTraditionDao() throws IOException {
? ?UserDao userDao = new UserDaoImpl();
? ?List<User> all = userDao.findAll();
? ?System.out.println(all);
}
?
1.2 代理開發(fā)方式
1.2.1 代理開發(fā)方式介紹
采用 Mybatis 的代理開發(fā)方式實現(xiàn) DAO 層的開發(fā),這種方式是我們后面進入企業(yè)的主流。
Mapper 接口開發(fā)方法只需要程序員編寫Mapper 接口(相當于Dao 接口),由Mybatis 框架根據(jù)接口定義創(chuàng)建接口的動態(tài)代理對象,代理對象的方法體同上邊Dao接口實現(xiàn)類方法。
Mapper 接口開發(fā)需要遵循以下規(guī)范:
1) Mapper.xml文件中的namespace與mapper接口的全限定名相同;
2) Mapper接口方法名和Mapper.xml中定義的每個statement的id相同;
3) Mapper接口方法的輸入?yún)?shù)類型和mapper.xml中定義的每個sql的parameterType的類型相同;
4) Mapper接口方法的輸出參數(shù)類型和mapper.xml中定義的每個sql的resultType的類型相同
1.2.2 編寫UserMapper接口
?
1.2.3測試代理方式
@Test
public void testProxyDao() throws IOException {
? ?InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
? ?SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
? ?SqlSession sqlSession = sqlSessionFactory.openSession();
? ?//獲得MyBatis框架生成的UserMapper接口的實現(xiàn)類
?UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
? ?User user = userMapper.findById(1);
? ?System.out.println(user);
? ?sqlSession.close();
}
1.3 知識小結(jié)
MyBatis的Dao層實現(xiàn)的兩種方式:
手動對Dao進行實現(xiàn):傳統(tǒng)開發(fā)方式
代理方式對Dao進行實現(xiàn):
**UserMapper userMapper = sqlSession.getMapper(UserMapper.class);**
2.MyBatis映射文件深入
2.1 動態(tài)sql語句
2.1.1動態(tài)sql語句概述
Mybatis 的映射文件中,前面我們的 SQL 都是比較簡單的,有些時候業(yè)務邏輯復雜時,我們的 SQL是動態(tài)變化的,此時在前面的學習中我們的 SQL 就不能滿足要求了。
參考的官方文檔,描述如下:
?
2.1.2動態(tài) SQL 之<if>
我們根據(jù)實體類的不同取值,使用不同的 SQL語句來進行查詢。比如在 id如果不為空時可以根據(jù)id查詢,如果username 不同空時還要加入用戶名作為條件。這種情況在我們的多條件組合查詢中經(jīng)常會碰到。
<select id="findByCondition" parameterType="user" resultType="user">
? select * from User
? ?<where>
? ? ? ?<if test="id!=0">
? ? ? ? ? and id=#{id}
? ? ? ?</if>
? ? ? ?<if test="username!=null">
? ? ? ? ? and username=#{username}
? ? ? ?</if>
? ?</where>
</select>
?
當查詢條件id和username都存在時,控制臺打印的sql語句如下:
? ? … … …
? ? //獲得MyBatis框架生成的UserMapper接口的實現(xiàn)類
?UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
? ?User condition = new User();
? ?condition.setId(1);
? ?condition.setUsername("lucy");
? ?User user = userMapper.findByCondition(condition);
? ?… … …
?
當查詢條件只有id存在時,控制臺打印的sql語句如下:
… … …
//獲得MyBatis框架生成的UserMapper接口的實現(xiàn)類
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User condition = new User();
condition.setId(1);
User user = userMapper.findByCondition(condition);
… … …
?
?
2.1.3 動態(tài) SQL 之<foreach>
循環(huán)執(zhí)行sql的拼接操作,例如:SELECT * FROM USER WHERE id IN (1,2,5)。
<select id="findByIds" parameterType="list" resultType="user">
? select * from User
? ?<where>
? ? ? ?<foreach collection="array" open="id in(" close=")" item="id" separator=",">
? ? ? ? ? #{id}
? ? ? ?</foreach>
? ?</where>
</select>
測試代碼片段如下:
… … …
//獲得MyBatis框架生成的UserMapper接口的實現(xiàn)類
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int[] ids = new int[]{2,5};
List<User> userList = userMapper.findByIds(ids);
System.out.println(userList);
… … …
?
?foreach標簽的屬性含義如下:
<foreach>標簽用于遍歷集合,它的屬性:
?collection:代表要遍歷的集合元素,注意編寫時不要寫#{};
?open:代表語句的開始部分;
?close:代表結(jié)束部分;
?item:代表遍歷集合的每個元素,生成的變量名;
?sperator:代表分隔符。
2.2 SQL片段抽取
Sql 中可將重復的 sql 提取出來,使用時用 include 引用即可,最終達到 sql 重用的目的
<!--抽取sql片段簡化編寫-->
<sql id="selectUser" select * from User</sql>
<select id="findById" parameterType="int" resultType="user">
? ?<include refid="selectUser"></include> where id=#{id}
</select>
<select id="findByIds" parameterType="list" resultType="user">
? ?<include refid="selectUser"></include>
? ?<where>
? ? ? ?<foreach collection="array" open="id in(" close=")" item="id" separator=",">
? ? ? ? ? #{id}
? ? ? ?</foreach>
? ?</where>
</select>
2.3 知識小結(jié)
MyBatis映射文件配置:
?<select>:查詢;
<insert>:插入;
<update>:修改;
<delete>:刪除;
<where>:where條件;
<if>:if判斷;
<foreach>:循環(huán);
<sql>:sql片段抽取。
3. MyBatis核心配置文件深入
3.1 typeHandlers標簽
無論是 MyBatis 在預處理語句(PreparedStatement)中設置一個參數(shù)時,還是從結(jié)果集中取出一個值時, 都會用類型處理器將獲取的值以合適的方式轉(zhuǎn)換成 Java 類型。下表描述了一些默認的類型處理器(截取部分)。
?
你可以重寫類型處理器或創(chuàng)建你自己的類型處理器來處理不支持的或非標準的類型。具體做法為:實現(xiàn) org.apache.ibatis.type.TypeHandler 接口, 或繼承一個很便利的類org.apache.ibatis.type.BaseTypeHandler, 然后可以選擇性地將它映射到一個JDBC類型。例如需求:一個Java中的Date數(shù)據(jù)類型,我想將之存到數(shù)據(jù)庫的時候存成一個1970年至今的毫秒數(shù),取出來時轉(zhuǎn)換成java的Date,即java的Date與數(shù)據(jù)庫的varchar毫秒值之間轉(zhuǎn)換。
開發(fā)步驟:
①定義轉(zhuǎn)換類繼承類BaseTypeHandler<T>;
②覆蓋4個未實現(xiàn)的方法,其中setNonNullParameter為java程序設置數(shù)據(jù)到數(shù)據(jù)庫的回調(diào)方法,getNullableResult為查詢時 mysql的字符串類型轉(zhuǎn)換成 java的Type類型的方法;
③在MyBatis核心配置文件中進行注冊。
測試轉(zhuǎn)換是否正確
public class MyDateTypeHandler extends BaseTypeHandler<Date> {
? ?public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType type) {
? ? ? ?preparedStatement.setString(i,date.getTime()+"");
? }
? ?public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
? ? ? ?return new Date(resultSet.getLong(s));
? }
? ?public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
? ? ? ?return new Date(resultSet.getLong(i));
? }
? ?public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
? ? ? ?return callableStatement.getDate(i);
? }
}
<!--注冊類型自定義轉(zhuǎn)換器-->
<typeHandlers>
? ?<typeHandler handler="com.itheima.typeHandlers.MyDateTypeHandler"></typeHandler>
</typeHandlers>
測試添加操作:
user.setBirthday(new Date());
userMapper.add2(user);
數(shù)據(jù)庫數(shù)據(jù):
?
測試查詢操作:
?
3.2 plugins標簽
MyBatis可以使用第三方的插件來對功能進行擴展,分頁助手PageHelper是將分頁的復雜操作進行封裝,使用簡單的方式即可獲得分頁的相關數(shù)據(jù)。
開發(fā)步驟:
①導入通用PageHelper的坐標;
②在mybatis核心配置文件中配置PageHelper插件;
③測試分頁數(shù)據(jù)獲取。
①導入通用PageHelper坐標
<!-- 分頁助手 -->
<dependency>
? ?<groupId>com.github.pagehelper</groupId>
? ?<artifactId>pagehelper</artifactId>
? ?<version>3.7.5</version>
</dependency>
<dependency>
? ?<groupId>com.github.jsqlparser</groupId>
? ?<artifactId>jsqlparser</artifactId>
? ?<version>0.9.1</version>
</dependency>
?
②在mybatis核心配置文件中配置PageHelper插件
<!-- 注意:分頁助手的插件 配置在通用館mapper之前 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
? ?<!-- 指定方言 -->
? ?<property name="dialect" value="mysql"/>
</plugin>
③測試分頁代碼實現(xiàn)
@Test
public void testPageHelper(){
? ?//設置分頁參數(shù)
? ?PageHelper.startPage(1,2);
?
? ?List<User> select = userMapper2.select(null);
? ?for(User user : select){
? ? ? ?System.out.println(user);
? }
}
獲得分頁相關的其他參數(shù)
//其他分頁的數(shù)據(jù)
PageInfo<User> pageInfo = new PageInfo<User>(select);
System.out.println("總條數(shù):"+pageInfo.getTotal());
System.out.println("總頁數(shù):"+pageInfo.getPages());
System.out.println("當前頁:"+pageInfo.getPageNum());
System.out.println("每頁顯示長度:"+pageInfo.getPageSize());
System.out.println("是否第一頁:"+pageInfo.isIsFirstPage());
System.out.println("是否最后一頁:"+pageInfo.isIsLastPage());
?
3.3 知識小結(jié)
MyBatis核心配置文件常用標簽:
1、properties標簽:該標簽可以加載外部的properties文件;
2、typeAliases標簽:設置類型別名;
3、environments標簽:數(shù)據(jù)源環(huán)境配置標簽;
4、typeHandlers標簽:配置自定義類型處理器;
5、plugins標簽:配置MyBatis的插件。
三、Mybatis的注解開發(fā)
1.Mybatis的注解開發(fā)
1.1 MyBatis的常用注解
這幾年來注解開發(fā)越來越流行,Mybatis也可以使用注解開發(fā)方式,這樣我們就可以減少編寫Mapper
映射文件了。我們先圍繞一些基本的CRUD來學習,再學習復雜映射多表操作。
@Insert:實現(xiàn)新增;
@Update:實現(xiàn)更新;
@Delete:實現(xiàn)刪除;
@Select:實現(xiàn)查詢;
@Result:實現(xiàn)結(jié)果集封裝;
@Results:可以與@Result 一起使用,封裝多個結(jié)果集;
@One:實現(xiàn)一對一結(jié)果集封裝;
@Many:實現(xiàn)一對多結(jié)果集封裝。
1.2 MyBatis的增刪改查
我們完成簡單的user表的增刪改查的操作
private UserMapper userMapper;
?
@Before
public void before() throws IOException {
? ?InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
? ?SqlSessionFactory sqlSessionFactory = new
? ? ? ? ? ? ? ? SqlSessionFactoryBuilder().build(resourceAsStream);
? ?SqlSession sqlSession = sqlSessionFactory.openSession(true);
? ?userMapper = sqlSession.getMapper(UserMapper.class);
}
?
@Test
public void testAdd() {
? ?User user = new User();
? ?user.setUsername("測試數(shù)據(jù)");
? ?user.setPassword("123");
? ?user.setBirthday(new Date());
? ?userMapper.add(user);
}
@Test
public void testUpdate() throws IOException {
? ?User user = new User();
? ?user.setId(16);
? ?user.setUsername("測試數(shù)據(jù)修改");
? ?user.setPassword("abc");
? ?user.setBirthday(new Date());
? ?userMapper.update(user);
}
?
@Test
public void testDelete() throws IOException {
? ?userMapper.delete(16);
}
@Test
public void testFindById() throws IOException {
? ?User user = userMapper.findById(1);
? ?System.out.println(user);
}
@Test
public void testFindAll() throws IOException {
? ?List<User> all = userMapper.findAll();
? ?for(User user : all){
? ? ? ?System.out.println(user);
? }
}
?
修改MyBatis的核心配置文件,我們使用了注解替代的映射文件,所以我們只需要加載使用了注解的Mapper接口即可
<mappers>
? ?<!--掃描使用注解的類-->
? ?<mapper class="com.itheima.mapper.UserMapper"></mapper>
</mappers>
或者指定掃描包含映射關系的接口所在的包也可以
<mappers>
? ?<!--掃描使用注解的類所在的包-->
? ?<package name="com.itheima.mapper"></package>
</mappers>
1.3 MyBatis的注解實現(xiàn)復雜映射開發(fā)
實現(xiàn)復雜關系映射之前我們可以在映射文件中通過配置<resultMap>來實現(xiàn),使用注解開發(fā)后,我們可以使用@Results注解,@Result注解,@One注解,@Many注解組合完成復雜關系的配置
文章來源:http://www.zghlxwxcb.cn/news/detail-519072.html
?
到了這里,關于Mybatis基礎知識的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!