Mybatis?ResultMap和分頁(yè)操作示例詳解
1. ResultMap
現(xiàn)有數(shù)據(jù)庫(kù)的字段為:
- 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
這樣能保證不會(huì)出錯(cuò)。若是將User的“pwd”改為“password”,則對(duì)應(yīng)的password結(jié)果就會(huì)為空。
解決該問題,
方法一:"as"
<select id="getAllUser" resultType="com.pojo.User"> select id, name, pwd as password from user </select>
User字段的為“password”,數(shù)據(jù)庫(kù)字段為“pwd”,那就使用Sql的原生語(yǔ)句as,就可以將查詢字段和User中字段相對(duì)應(yīng)。
方法二:resultMap(結(jié)果映射)
可以使用 <ResultMap>標(biāo)簽將數(shù)據(jù)庫(kù)中的字段和User中的字段相對(duì)應(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ù)庫(kù)表的列名 , property是對(duì)應(yīng)實(shí)體類的屬性名 --> <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>
其中,單獨(dú)設(shè)置resultMap標(biāo)簽,來使數(shù)據(jù)庫(kù)中的字段和User對(duì)應(yīng)上。 resultMap中的id 對(duì)應(yīng)著 <select>標(biāo)簽中的resultMap (原來為resultType)
2. 日志
日志工廠
思考:我們?cè)跍y(cè)試SQL的時(shí)候,要是能夠在控制臺(tái)輸出 SQL 的話,是不是就能夠有更快的排錯(cuò)效率?
如果一個(gè) 數(shù)據(jù)庫(kù)相關(guān)的操作出現(xiàn)了問題,我們可以根據(jù)輸出的SQL語(yǔ)句快速排查問題。
對(duì)于以往的開發(fā)過程,我們會(huì)經(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 "就是錯(cuò)誤的。
- STDOUT_LOGGING是標(biāo)準(zhǔn)輸出日志
Log4j
- Log4j是Apache的一個(gè)開源項(xiàng)目
- 通過使用Log4j,我們可以控制日志信息輸送的目的地:控制臺(tái),文本,GUI組件....
- 我們也可以控制每一條日志的輸出格式;
- 通過定義每一條日志信息的級(jí)別,我們能夠更加細(xì)致地控制日志的生成過程。最令人感興趣的就是,這些可以通過一個(gè)配置文件來靈活地進(jìn)行配置,而不需要修改應(yīng)用的代碼。
- 要使用 Log4j首先導(dǎo)入相關(guān)的包:
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
- 創(chuàng)建 log4j.properties 配置文件:
#將等級(jí)為DEBUG的日志信息輸出到console和file這兩個(gè)目的地,console和file的定義在下面的代碼 log4j.rootLogger=DEBUG,console,file #控制臺(tái)輸出的相關(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 #日志輸出級(jí)別 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的實(shí)現(xiàn):
<settings> <setting name="logImpl" value="LOG4J"/> </settings>
- log4j簡(jiǎn)單使用:
- 導(dǎo)入的包是org.apache.log4j.Logger
一個(gè)配置完整的 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. 分頁(yè)
在學(xué)習(xí)mybatis等持久層框架的時(shí)候,會(huì)經(jīng)常對(duì)數(shù)據(jù)進(jìn)行增刪改查操作,使用最多的是對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢操作,如果查詢大量數(shù)據(jù)的時(shí)候,我們往往使用分頁(yè)進(jìn)行查詢,也就是每次處理小部分?jǐn)?shù)據(jù),這樣對(duì)數(shù)據(jù)庫(kù)壓力就在可控范圍內(nèi)。
Limit 分頁(yè)
#語(yǔ)法 SELECT * FROM table LIMIT stratIndex,pageSize SELECT * FROM table LIMIT 5,10; // 檢索記錄行 6-15 #為了檢索從某一個(gè)偏移量到記錄集的結(jié)束所有的記錄行,可以指定第二個(gè)參數(shù)為 -1: SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last. #如果只給定一個(gè)參數(shù),它表示返回最大的記錄行數(shù)目: SELECT * FROM table LIMIT 5; //檢索前 5 個(gè)記錄行 #換句話說,LIMIT n 等價(jià)于 LIMIT 0,n。
步驟:
- UserMapper接口中添加:
//選擇全部用戶實(shí)現(xiàn)分頁(yè) 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 ,映射語(yǔ)句(SQL)也是定義在 XML 中的。而到MyBatis 3提供了新的基于注解的配置。不幸的是,Java 注解的的表達(dá)力和靈活性十分有限。最強(qiáng)大的 MyBatis 映射并不能用注解來構(gòu)建。
sql 類型主要分成 :
- @Select ()
- @Update ()
- @Insert ()
- @Delete ()
注意:利用注解開發(fā)就不需要mapper.xml映射文件了 .
在mybatis-config.xml這樣導(dǎo)入:
<mappers> <mapper class="com.dao.UserMapper" /> </mappers>
區(qū)別于之前的mapper.xml的導(dǎo)入:
<mappers> <mapper resource="com/dao/UserMapper.xml"/> </mappers>
為了實(shí)現(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(); } }
中對(duì)sqlSessionFactory.openSession()的參數(shù)設(shè)置:
sqlSessionFactory.openSession(true);
就可以實(shí)現(xiàn)自動(dòng)提交事務(wù)。
查詢
編寫接口方法注解
//根據(jù)id查詢用戶 @Select("select * from user where id = #{id}") User selectUserById(@Param("id") int id);
- 測(cè)試
@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(); }
新增
//添加一個(gè)用戶 @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(); }
修改
//修改一個(gè)用戶 @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(); }
注意:
- 增刪改一定記得對(duì)事務(wù)的處理
- 注釋的話,一定要把類通過<mappers class="">注冊(cè)到 mybatis-config.xml 中去;配置的話,一定要把UserMapper.xml(xxMapper.xml)通過<mappers resouce="">注冊(cè)到 mybatis-config.xml 中去
@Param
@Param注解用于給方法參數(shù)起一個(gè)名字。以下是總結(jié)的使用原則:
- 在方法只接受一個(gè)參數(shù)的情況下,可以不使用@Param。
- 在方法接受多個(gè)參數(shù)的情況下,建議一定要使用@Param注解給參數(shù)命名。
- 如果參數(shù)是 JavaBean , 則不能使用@Param。
- 不使用@Param注解時(shí),參數(shù)只能有一個(gè),并且是Javabean。
以上就是Mybatis ResultMap和分頁(yè)操作示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Mybatis ResultMap分頁(yè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)和算法之冒泡,選擇和插入排序算法
這篇文章主要為大家介紹了Java冒泡,選擇和插入排序算法 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01java實(shí)現(xiàn)幸運(yùn)抽獎(jiǎng)功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)幸運(yùn)抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03java基于swing實(shí)現(xiàn)的連連看代碼
這篇文章主要介紹了java基于swing實(shí)現(xiàn)的連連看代碼,包含了游戲中涉及的事件處理與邏輯功能,需要的朋友可以參考下2014-11-11Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組實(shí)例代碼
這篇文章主要介紹了Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Java構(gòu)造代碼塊,靜態(tài)代碼塊原理與用法實(shí)例分析
這篇文章主要介紹了Java構(gòu)造代碼塊,靜態(tài)代碼塊,結(jié)合實(shí)例形式分析了Java構(gòu)造代碼塊,靜態(tài)代碼塊的功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04SpringBoot @Import與@Conditional注解使用詳解
在了解spring boot自動(dòng)配置原理前,再來了解下兩個(gè)注解@Import注解和@Conditional注解,@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿足條件給容器注冊(cè)bean2022-10-10Java之a(chǎn)pi網(wǎng)關(guān)斷言及過濾器案例講解
這篇文章主要介紹了Java之a(chǎn)pi網(wǎng)關(guān)斷言及過濾器案例講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Spring集成Web環(huán)境與SpringMVC組件的擴(kuò)展使用詳解
這篇文章主要介紹了Spring集成Web環(huán)境與SpringMVC組件,它是一個(gè)MVC架構(gòu),用來簡(jiǎn)化基于MVC架構(gòu)的Web應(yīng)用開發(fā)。SpringMVC最重要的就是五大組件2022-08-08