mybatis分頁的實現
mysql的分頁語句
select * from user limit #{startIndex},#{pageSize};
# startIndex : 起始位置 ,默認是0開始
# pageSize :頁面大小
# 如何計算出當前頁面
currentPage = (currentPage-1)* pageSize
使用limit實現分頁【掌握】
1.使用limit實現分頁【掌握】
UserDao編寫:
//查詢全部用戶實現分頁
List<User> selectUserByLimit(Map<String,Integer> map);
2.編寫對應mapper映射文件的方法
【參數我們可以使用map封裝,方便參數傳遞】
<select id="selectUserByLimit" parameterType="Map" resultType="User">
select * from mybatis.user limit #{startIndex},#{pageSize}
</select>
3.測試
【模擬分頁數據:currentPage,pageSize】
@Test
public void selectUserByLimit(){
//創建sqlSession
SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
//準備數據
int currentPage = 2;//當前是第幾頁
int pageSize = 2; //頁面大小
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("startIndex",(currentPage-1)*pageSize);
map.put("pageSize",pageSize);
//測試
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> users = mapper.selectUserByLimit(map);
for (User user : users) {
System.out.println(user);
}
sqlSession.close();//關閉連接
}
案例實現:
項目結構:
UserDao層編寫:
package com.kuang.dao;
import com.kuang.pojo.User;
import java.util.List;
import java.util.Map;
public interface UserDao {
//查詢全部用戶實現分頁
List<User> selectUserByLimit(Map<String,Integer> map);
}
對應的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.kuang.dao.UserDao">
<select id="selectUserByLimit" parameterType="Map" resultType="User">
select * from mybatis.user limit #{startIndex},#{pageSize}
</select>
<select id="selectUserByRowBounds" resultType="User">
select * from mybatis.user
</select>
</mapper>
測試結果:
總共分了兩頁當前顯示第二頁用戶;
使用RowBounds實現分頁(瞭解)
1.寫接口
//查詢全部用戶實現分頁使用RowBounds
List<User> selectUserByRowBounds();
2.寫Mapper映射文件
<select id="selectUserByRowBounds" resultType="User">
select * from mybatis.user
</select>
3.編寫測試代碼
@Test
public void selectUserByRowBounds(){
//創建sqlSession
SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
int currentPage = 2; //當前頁
int pageSize = 2; //頁面大小
RowBounds rowBounds = new RowBounds((currentPage - 1) * pageSize, pageSize);
//注意點;使用RowBounds就不能使用getMapper了
//selectList: 接收一個List
//selectMap: 接收一個Map
//selectOne : 接收只有一個對象的時候
List<User> users = sqlSession.selectList("com.kuang.dao.UserDao.selectUserByRowBounds", null, rowBounds);
for (User user : users) {
System.out.println(user);
}
}
測試結果:
總共輸出兩頁,顯示爲第一頁面用戶;
limit 和 rowBounds區別
- rowBounds 本質就是封裝了limit
- limit 是在SQL層面實現分頁
- rowBounds 在代碼層面實現分頁
優化項目(事務自動提交)
思考?我們之前的代碼,還能在優化嗎?
日誌,工具類,配置文件,別名… 事務
mybaits開發人員也想到了,有一個構造器,可以實現事務自動提交。
openSession(true); //openSession構造器如果參數爲true,則事務會自動提交。我們就不用每次都commit;
事務優化:自動提交事務
//獲得一個帶事務自動提交功能的SqlSession公共的方法
public static SqlSession getSqlSession(){
//自動提交事務
return sqlSessionFactory.openSession(true);
}
別名優化:pojo包下類自動設置別名
<!--配置別名-->
<typeAliases>
<!--<typeAlias type="com.kuang.pojo.User" alias="User"/>-->
<package name="com.kuang.pojo"/>
</typeAliases>
mapper映射文件路徑修改
<mappers>
<!--class對應的是一個接口類-->
<!--resource對應的是一個接口類的映射文件-->
<mapper class="com.kuang.dao.UserDao"/>
</mappers>
項目實現
1.項目結構:
2.myBatisUitils文件編寫
package com.kuang.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的工具類,重複的代碼的提純
public class MyBatisUtils {
//類變量不需要設置默認值;
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();
}
}
//設置SqlSessionFactory公共的方法
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
//獲得一個帶事務自動提交功能的SqlSession公共的方法
public static SqlSession getSqlSession(){
//自動提交事務
return sqlSessionFactory.openSession(true);
}
}
3.userDaoTest文件編寫:
package com.kuang.dao;
import com.kuang.pojo.User;
import com.kuang.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
@Test
public void getUserList(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();//關閉sqlSession;
}
@Test
public void getUserById(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();//關閉sqlSession;
}
@Test
public void addUser(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user = new User(5, "阿貓", "like-dog");
int i = mapper.addUser(user);
System.out.println(i);
sqlSession.close();//關閉sqlSession;
}
@Test
public void updateUser(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user = new User(5, "阿狗", "like-cat");
int i = mapper.updateUser(user);
System.out.println(i);
sqlSession.close();//關閉sqlSession;
}
@Test
public void deleteUser(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
UserDao mapper = sqlSession.getMapper(UserDao.class);
int i = mapper.deleteUser(5);
System.out.println(i);
sqlSession.close();//關閉sqlSession;
}
}
面向接口編程
提出的原因:解耦,方便拓展,提高代碼的複用性,上層不用管下層實現,只用去調用對應的接口即可。規範性好。
面向過程編程:隨着系統越來越大,我們無法使用面向過程的思想滿足。面對對象。
面向對象編程:所有系統耦合性高,所有的功能都是由許許多多不同的對象去完成的。隨着系統越來越大。
接口 & 抽象類
面向接口編程:約束開發人員操作,而且方便擴展以及規劃。
更深層次的分離:定義與實現的一個分離;
接口可以反映一個開發人員的水平高低以及對系統架構理解;
使用註解開發
早期的,mybatis都是使用xml進行配置的,直到註解的出現,註解可以替代一些xml中的配置。
連xml配置都不要了!
CRUD的註解:
- @insert()
- @delete()
- @update()
- @select()
UserDao.java
package com.kuang.dao;
import com.kuang.pojo.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface UserDao {
//查詢全部用戶
@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);
}
mybatis核心文件
之前不使用註解:
使用註解:
mybatis-config.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>
<!--配置文件修改-->
<properties resource="database.properties"/>
<!--Mybatis設置-->
<settings>
<!--默認日誌實現-->
<!--<setting name="logImpl" value="STDOUT_LOGGING"/>-->
<!--Log4j實現-->
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--配置別名-->
<typeAliases>
<!--<typeAlias type="com.kuang.pojo.User" alias="User"/>-->
<package name="com.kuang.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對應的是一個接口類-->
<!--resource對應的是一個接口類的映射文件-->
<mapper class="com.kuang.dao.UserDao"/>
</mappers>
</configuration>
測試類
package com.kuang.dao;
import com.kuang.pojo.User;
import com.kuang.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();//帶自動提交事務
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();//關閉sqlSession;
}
@Test
public void getUserById(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();//關閉sqlSession;
}
@Test
public void addUser(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user = new User(5, "阿貓", "like-dog");
int i = mapper.addUser(user);
System.out.println(i);
sqlSession.close();//關閉sqlSession;
}
@Test
public void updateUser(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user = new User(5, "阿狗", "like-cat");
int i = mapper.updateUser(user);
System.out.println(i);
sqlSession.close();//關閉sqlSession;
}
@Test
public void deleteUser(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
UserDao mapper = sqlSession.getMapper(UserDao.class);
int i = mapper.deleteUser(5);
System.out.println(i);
sqlSession.close();//關閉sqlSession;
}
}
注意事項
- 開啓事務自動提交了
- @param參數儘量都寫上,如果有多個參數,就必須填寫。