Mybatis分頁的實現(xiàn)及使用注解開發(fā)操作
分頁的實現(xiàn)
sql的分頁語句為(第一個參數(shù)為當(dāng)前頁面的索引起始位置,第二個參數(shù)為頁面的展示個數(shù))
select * from user limit #{startIndex},#{pageSize}; # startIndex : 起始位置 ,默認(rèn)是0開始 # pageSize :頁面大小 # 如何計算出當(dāng)前頁面索引起始位置 # currentPage = (currentPage-1)* pageSize
limit實現(xiàn)分頁
1、編寫dao接口
//查詢?nèi)坑脩魧崿F(xiàn)分頁 List<User> selectUserByLimit(Map<String,Integer> map);
2、編寫對應(yīng)mapper映射文件的方法(參數(shù)我們可以使用map封裝,方便參數(shù)傳遞)
<select id="selectUserByLimit" parameterType="Map" resultType="User"> select * from mybatis.user limit #{startIndex},#{pageSize} </select>
3、創(chuàng)建了獲取sqlSession對象的工具類,并使之可以進(jìn)行自動提交事務(wù)
package com.MLXH.utils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; //mybatis的工具類,重復(fù)的代碼的提純 public class MyBatisUtils { //類變量不需要設(shè)置默認(rèn)值; private static SqlSessionFactory sqlSessionFactory; static { //在maven中,所有的資源文件一般都放在resources目錄下,我們可以直接拿到。 try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //設(shè)置SqlSessionFactory公共的方法 public static SqlSessionFactory getSqlSessionFactory(){ return sqlSessionFactory; } //獲得一個帶事務(wù)自動提交功能的SqlSession公共的方法 public static SqlSession getSqlSession(){ //自動提交事務(wù) return sqlSessionFactory.openSession(true); } }
RowBounds實現(xiàn)分頁
1、寫接口
//查詢?nèi)坑脩魧崿F(xiàn)分頁使用RowBounds List<User> selectUserByRowBounds();
2、寫Mapper映射文件
<select id="selectUserByRowBounds" resultType="User"> select * from mybatis.user </select>
3、工具類同上(只是為了獲取sqlSession對象簡單而已)
4、編寫測試代碼
@Test public void selectUserByRowBounds(){ //創(chuàng)建sqlSession SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory(); SqlSession sqlSession = sqlSessionFactory.openSession(); int currentPage = 2; //當(dāng)前頁 int pageSize = 2; //頁面大小 RowBounds rowBounds = new RowBounds((currentPage - 1) * pageSize, pageSize); //注意點;使用RowBounds就不能使用getMapper了 //selectList: 接收一個List //selectMap: 接收一個Map //selectOne : 接收只有一個對象的時候 List<User> users = sqlSession.selectList("com.MLXH.dao.UserDao.selectUserByRowBounds", null, rowBounds); for (User user : users) { System.out.println(user); } }
兩者的區(qū)別
- rowBounds 本質(zhì)就是封裝了limit
- limit 是在SQL層面實現(xiàn)分頁,在測試中使用getMapper獲得對象
- rowBounds 在代碼層面實現(xiàn)分頁,創(chuàng)建rowBounds對象
注解開發(fā)
根據(jù)之前寫的這篇博客,鏈接: 使用Mybatis實現(xiàn)數(shù)據(jù)庫的增刪改查實例.(內(nèi)有詳細(xì)的代碼和目錄布局)
可以發(fā)現(xiàn),對UserDao接口,我們需要創(chuàng)建一個userMapper.xml來實現(xiàn)這個接口,并在其內(nèi)部寫入sql語句
接下來我們使用注解來簡化其代碼操作
package com.MLXH.dao; import com.MLXH.pojo.User; import org.apache.ibatis.annotations.*; import java.util.List; public interface UserDao { //查詢?nèi)坑脩? @Select("select * from user") List<User> getUserList(); //通過ID查詢用戶 @Select("select * from user where id = #{id}") User getUserById(@Param("id") int id); //添加用戶 @Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})") int addUser(User user); //修改用戶信息 @Update("update user set name = #{name}, pwd = #{pwd} where id = #{id}") int updateUser(User user); //刪除用戶 @Delete("delete from user where id =#{uid}") int deleteUser(@Param("uid") int id); }
UserDao
package com.MLXH.dao; import com.MLXH.pojo.User; import org.apache.ibatis.annotations.*; import java.util.List; public interface UserDao { //查詢?nèi)坑脩? @Select("select * from user") List<User> getUserList(); //通過ID查詢用戶 @Select("select * from user where id = #{id}") User getUserById(@Param("id") int id); //添加用戶 @Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})") int addUser(User user); //修改用戶信息 @Update("update user set name = #{name}, pwd = #{pwd} where id = #{id}") int updateUser(User user); //刪除用戶 @Delete("delete from user where id =#{uid}") int deleteUser(@Param("uid") int id); }
@Param為參數(shù)注解,當(dāng)所傳入的參數(shù)為一個時,默認(rèn)為Param,但當(dāng)傳入的參數(shù)為多個時,每一個參數(shù)前都要加入@Param來標(biāo)識其是一個參數(shù)
例如:
int update(@Param("id") int id,@Param("name") String name,@Param("pwd") String pwd)
Mybatis核心配置文件
<?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="database.properties"/> <!--Mybatis設(shè)置--> <settings> <!--默認(rèn)日志實現(xiàn)--> <!--<setting name="logImpl" value="STDOUT_LOGGING"/>--> <!--Log4j實現(xiàn)--> <setting name="logImpl" value="LOG4J"/> </settings> <!--配置別名--> <typeAliases> <!--<typeAlias type="com.MLXH.pojo.User" alias="User"/>--> <package name="com.MLXH.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <!--class對應(yīng)的是一個接口類--> <!--resource對應(yīng)的是一個接口類的映射文件--> <mapper class="com.MLXH.dao.UserDao"/> </mappers> </configuration>
這里我們將創(chuàng)建sqlSession對象封裝為一個工具方法,并設(shè)置了事務(wù)的自動提交(sqlSessionFactory.openSession(true))
工具類
package com.MLXH.utils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; //mybatis的工具類,重復(fù)的代碼的提純 public class MyBatisUtils { //類變量不需要設(shè)置默認(rèn)值; private static SqlSessionFactory sqlSessionFactory; static { //在maven中,所有的資源文件一般都放在resources目錄下,我們可以直接拿到。 try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //設(shè)置SqlSessionFactory公共的方法 public static SqlSessionFactory getSqlSessionFactory(){ return sqlSessionFactory; } //獲得一個帶事務(wù)自動提交功能的SqlSession公共的方法 public static SqlSession getSqlSession(){ //自動提交事務(wù) return sqlSessionFactory.openSession(true); } }
測試
package com.MLXH.dao; import com.MLXH.pojo.User; import com.MLXH.utils.MyBatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import sun.rmi.server.UnicastServerRef; import java.util.List; public class UserDaoTest { @Test public void getUserList(){ SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務(wù) UserDao mapper = sqlSession.getMapper(UserDao.class); List<User> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } sqlSession.close();//關(guān)閉sqlSession; } @Test public void getUserById(){ SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務(wù) UserDao mapper = sqlSession.getMapper(UserDao.class); User user = mapper.getUserById(1); System.out.println(user); sqlSession.close();//關(guān)閉sqlSession; } @Test public void addUser(){ SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務(wù) UserDao mapper = sqlSession.getMapper(UserDao.class); User user = new User(5, "寒雪", "hanxue"); int i = mapper.addUser(user); System.out.println(i); sqlSession.close();//關(guān)閉sqlSession; } @Test public void updateUser(){ SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務(wù) UserDao mapper = sqlSession.getMapper(UserDao.class); User user = new User(5, "暮凌寒雪", "mulinghanxue"); int i = mapper.updateUser(user); System.out.println(i); sqlSession.close();//關(guān)閉sqlSession; } @Test public void deleteUser(){ SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務(wù) UserDao mapper = sqlSession.getMapper(UserDao.class); int i = mapper.deleteUser(5); System.out.println(i); sqlSession.close();//關(guān)閉sqlSession; } }
總結(jié):
可以看到,注解開發(fā)其實就是將接口的mapper實現(xiàn)文件封裝,并在接口方法上添加了sql語句…
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
線程池之newFixedThreadPool定長線程池的實例
這篇文章主要介紹了線程池之newFixedThreadPool定長線程池的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Java基礎(chǔ)之JDK1.8新特性lambda表達(dá)式詳解
函數(shù)式接口有且僅有一個抽象方法,但是可以有多個非抽象方法的接口,函數(shù)式接口可以被隱式轉(zhuǎn)換為lambda表達(dá)式,這篇文章主要介紹了Java基礎(chǔ)之lambda表達(dá)式(JDK1.8新特性),需要的朋友可以參考下2023-08-08Java窗體動態(tài)加載磁盤文件的實現(xiàn)方法
這篇文章主要介紹了Java窗體動態(tài)加載磁盤文件的實現(xiàn)方法,需要的朋友可以參考下2014-03-03Spring Boot 2.2 正式發(fā)布,大幅性能提升 + Java 13 支持
隨著 Spring Framework 5.2.0 成功發(fā)布之后,Spring Boot 2.2 也緊跟其后,發(fā)布了第一個版本:2.2.0。下面就來一起來看看這個版本都更新了些什么值得我們關(guān)注的內(nèi)容2019-10-10使用@value注解取不到application.xml配置文件中的值問題
這篇文章主要介紹了使用@value注解取不到application.xml配置文件中的值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03