Mybatis?ResultMap和分頁操作示例詳解
1. ResultMap
現(xiàn)有數(shù)據(jù)庫的字段為:
- id
- name
- pwd
為了其字段的名字,在pojo中的User的字段名和其一樣:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
int id;
String name;
String pwd;
}UserMapper.xml :
<?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.dao.UserMapper">
<select id="getAllUser" resultType="com.pojo.User">
select * from user
</select>
</mapp這樣能保證不會出錯。若是將User的“pwd”改為“password”,則對應(yīng)的password結(jié)果就會為空。
解決該問題,
方法一:"as"
<select id="getAllUser" resultType="com.pojo.User">
select id, name, pwd as password from user
</select>User字段的為“password”,數(shù)據(jù)庫字段為“pwd”,那就使用Sql的原生語句as,就可以將查詢字段和User中字段相對應(yīng)。
方法二:resultMap(結(jié)果映射)
可以使用 <ResultMap>標簽將數(shù)據(jù)庫中的字段和User中的字段相對應(yīng):
<?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.dao.UserMapper">
<resultMap id="UserMapper" type="com.pojo.User">
<!-- column是數(shù)據(jù)庫表的列名 , property是對應(yīng)實體類的屬性名 -->
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getAllUser" resultMap="UserMapper">
select * from user
</select>
</mapper>其中,單獨設(shè)置resultMap標簽,來使數(shù)據(jù)庫中的字段和User對應(yīng)上。 resultMap中的id 對應(yīng)著 <select>標簽中的resultMap (原來為resultType)
2. 日志
日志工廠
思考:我們在測試SQL的時候,要是能夠在控制臺輸出 SQL 的話,是不是就能夠有更快的排錯效率?
如果一個 數(shù)據(jù)庫相關(guān)的操作出現(xiàn)了問題,我們可以根據(jù)輸出的SQL語句快速排查問題。
對于以往的開發(fā)過程,我們會經(jīng)常使用到debug模式來調(diào)節(jié),跟蹤我們的代碼執(zhí)行過程。但是現(xiàn)在使用Mybatis是基于接口,配置文件的源代碼執(zhí)行過程。因此,我們必須選擇日志工具來作為我們開發(fā),調(diào)節(jié)程序的工具。

使用方法:
在 mybatis-config.xml 中添加。
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>注意:日志功能的開啟是 name = "logImpl", value的值就是各種類型的日志。
注意:
- value="STDOUT_LOGGING"中不能出現(xiàn)空格,例如 value="STDOUT_LOGGING "就是錯誤的。
- STDOUT_LOGGING是標準輸出日志
Log4j
- Log4j是Apache的一個開源項目
- 通過使用Log4j,我們可以控制日志信息輸送的目的地:控制臺,文本,GUI組件....
- 我們也可以控制每一條日志的輸出格式;
- 通過定義每一條日志信息的級別,我們能夠更加細致地控制日志的生成過程。最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應(yīng)用的代碼。
- 要使用 Log4j首先導入相關(guān)的包:
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
- 創(chuàng)建 log4j.properties 配置文件:
#將等級為DEBUG的日志信息輸出到console和file這兩個目的地,console和file的定義在下面的代碼
log4j.rootLogger=DEBUG,console,file
#控制臺輸出的相關(guān)設(shè)置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件輸出的相關(guān)設(shè)置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志輸出級別
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG- 配置 log4j的實現(xiàn):
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>- log4j簡單使用:
- 導入的包是org.apache.log4j.Logger
一個配置完整的 settings 元素的示例如下:
<settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25"/> <setting name="defaultFetchSize" value="100"/> <setting name="safeRowBoundsEnabled" value="false"/> <setting name="mapUnderscoreToCamelCase" value="false"/> <setting name="localCacheScope" value="SESSION"/> <setting name="jdbcTypeForNull" value="OTHER"/> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> </settings>
3. 分頁
在學習mybatis等持久層框架的時候,會經(jīng)常對數(shù)據(jù)進行增刪改查操作,使用最多的是對數(shù)據(jù)庫進行查詢操作,如果查詢大量數(shù)據(jù)的時候,我們往往使用分頁進行查詢,也就是每次處理小部分數(shù)據(jù),這樣對數(shù)據(jù)庫壓力就在可控范圍內(nèi)。
Limit 分頁
#語法 SELECT * FROM table LIMIT stratIndex,pageSize SELECT * FROM table LIMIT 5,10; // 檢索記錄行 6-15 #為了檢索從某一個偏移量到記錄集的結(jié)束所有的記錄行,可以指定第二個參數(shù)為 -1: SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last. #如果只給定一個參數(shù),它表示返回最大的記錄行數(shù)目: SELECT * FROM table LIMIT 5; //檢索前 5 個記錄行 #換句話說,LIMIT n 等價于 LIMIT 0,n。
步驟:
- UserMapper接口中添加:
//選擇全部用戶實現(xiàn)分頁 List<User> selectUser(Map<String,Integer> map);
- UserMapp.xml中添加:
<select id="selectUser" parameterType="map" resultType="com.pojo.user">
select * from user limit #{startIndex},#{pageSize}
</select>- Test:
@Test
public void testLimitUser(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("indexPage",0);
map.put("endPage",2);
List<User> userList = userMapper.getLimitByUser(map);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}4. 注解開發(fā)
mybatis最初配置信息是基于 XML ,映射語句(SQL)也是定義在 XML 中的。而到MyBatis 3提供了新的基于注解的配置。不幸的是,Java 注解的的表達力和靈活性十分有限。最強大的 MyBatis 映射并不能用注解來構(gòu)建。
sql 類型主要分成 :
- @Select ()
- @Update ()
- @Insert ()
- @Delete ()
注意:利用注解開發(fā)就不需要mapper.xml映射文件了 .
在mybatis-config.xml這樣導入:
<mappers>
<mapper class="com.dao.UserMapper" />
</mappers>區(qū)別于之前的mapper.xml的導入:
<mappers>
<mapper resource="com/dao/UserMapper.xml"/>
</mappers>為了實現(xiàn)事務(wù)的提交,在MyBatis中:
public class MyBatisUtils {
static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}中對sqlSessionFactory.openSession()的參數(shù)設(shè)置:
sqlSessionFactory.openSession(true);就可以實現(xiàn)自動提交事務(wù)。
查詢
編寫接口方法注解
//根據(jù)id查詢用戶
@Select("select * from user where id = #{id}")
User selectUserById(@Param("id") int id);- 測試
@Test
public void testSelectUserById() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user);
session.close();
}新增
//添加一個用戶
@Insert("insert into user (id,name,pwd) values (#{id},#{name},#{pwd})")
int addUser(User user);Test:
@Test
public void testAddUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(6, "秦疆", "123456");
mapper.addUser(user);
session.close();
}修改
//修改一個用戶
@Update("update user set name=#{name},pwd=#{pwd} where id = #{id}")
int updateUser(User user);刪除
//根據(jù)id刪除用
@Delete("delete from user where id = #{id}")
int deleteUser(@Param("id")int id);Test:
@Test
public void testDeleteUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.deleteUser(6);
session.close();
}注意:
- 增刪改一定記得對事務(wù)的處理
- 注釋的話,一定要把類通過<mappers class="">注冊到 mybatis-config.xml 中去;配置的話,一定要把UserMapper.xml(xxMapper.xml)通過<mappers resouce="">注冊到 mybatis-config.xml 中去
@Param
@Param注解用于給方法參數(shù)起一個名字。以下是總結(jié)的使用原則:
- 在方法只接受一個參數(shù)的情況下,可以不使用@Param。
- 在方法接受多個參數(shù)的情況下,建議一定要使用@Param注解給參數(shù)命名。
- 如果參數(shù)是 JavaBean , 則不能使用@Param。
- 不使用@Param注解時,參數(shù)只能有一個,并且是Javabean。
以上就是Mybatis ResultMap和分頁操作示例詳解的詳細內(nèi)容,更多關(guān)于Mybatis ResultMap分頁的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)和算法之冒泡,選擇和插入排序算法
這篇文章主要為大家介紹了Java冒泡,選擇和插入排序算法 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01
Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組實例代碼
這篇文章主要介紹了Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-01-01
Java構(gòu)造代碼塊,靜態(tài)代碼塊原理與用法實例分析
這篇文章主要介紹了Java構(gòu)造代碼塊,靜態(tài)代碼塊,結(jié)合實例形式分析了Java構(gòu)造代碼塊,靜態(tài)代碼塊的功能、原理、用法及操作注意事項,需要的朋友可以參考下2020-04-04
SpringBoot @Import與@Conditional注解使用詳解
在了解spring boot自動配置原理前,再來了解下兩個注解@Import注解和@Conditional注解,@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進行判斷,滿足條件給容器注冊bean2022-10-10
Java之a(chǎn)pi網(wǎng)關(guān)斷言及過濾器案例講解
這篇文章主要介紹了Java之a(chǎn)pi網(wǎng)關(guān)斷言及過濾器案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08
Spring集成Web環(huán)境與SpringMVC組件的擴展使用詳解
這篇文章主要介紹了Spring集成Web環(huán)境與SpringMVC組件,它是一個MVC架構(gòu),用來簡化基于MVC架構(gòu)的Web應(yīng)用開發(fā)。SpringMVC最重要的就是五大組件2022-08-08

