select * from user limit #{startIndex},#{pageSize};
# startIndex : 起始位置 ,默认是0开始
# pageSize :页面大小
# 如何计算出当前页面
currentPage = (currentPage-1)* pageSize
1.使用limit实现分页【掌握】
UserDao编写:
//查询全部用户实现分页
List selectUserByLimit(Map map);
2.编写对应mapper映射文件的方法
【参数我们可以使用map封装,方便参数传递】
3.测试
【模拟分页数据:currentPage,pageSize】
@Test
public void selectUserByLimit(){
//创建sqlSession
SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
//准备数据
int currentPage = 2;//当前是第几页
int pageSize = 2; //页面大小
Map map = new HashMap();
map.put("startIndex",(currentPage-1)*pageSize);
map.put("pageSize",pageSize);
//测试
UserDao mapper = sqlSession.getMapper(UserDao.class);
List users = mapper.selectUserByLimit(map);
for (User user : users) {
System.out.println(user);
}
sqlSession.close();//关闭连接
}
package com.kuang.dao;
import com.kuang.pojo.User;
import java.util.List;
import java.util.Map;
public interface UserDao {
//查询全部用户实现分页
List selectUserByLimit(Map map);
}
对应的userMapper.xml配置文件编写:
1.写接口
//查询全部用户实现分页使用RowBounds
List selectUserByRowBounds();
2.写Mapper映射文件
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 users = sqlSession.selectList("com.kuang.dao.UserDao.selectUserByRowBounds", null, rowBounds);
for (User user : users) {
System.out.println(user);
}
}
思考?我们之前的代码,还能在优化吗?
日志,工具类,配置文件,别名… 事务
mybaits开发人员也想到了,有一个构造器,可以实现事务自动提交。
openSession(true); //openSession构造器如果参数为true,则事务会自动提交。我们就不用每次都commit;
事务优化:自动提交事务
//获得一个带事务自动提交功能的SqlSession公共的方法
public static SqlSession getSqlSession(){
//自动提交事务
return sqlSessionFactory.openSession(true);
}
别名优化:pojo包下类自动设置别名
mapper映射文件路径修改
项目实现
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 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的注解:
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 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文件:
测试类
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 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;
}
}
注意事项