分页查询+通用mapper(Java数据库编程)
lipiwang 2024-11-17 13:26 11 浏览 0 评论
MyBatis
分页查询
分页简述
- 搭建环境
提供的资料包含了当天通用 mapper 的内容,一并导入jar 包和工具类即可。JavaBean 的定义和之前一样,不再提供
Mybatis 开发中我们采用 pagehelper 插件。
- 导入jar 包:
- 添加插件
<!-- 插件(放在 environments 标签上方即可) -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>
<property name="rowBoundsWithCount" value="true"/>
</plugin>
</plugins>
- 案例 1:分页查询用户信息需求说明
要求:每次查询仅展示 3 条数据
- API 讲解
- PageHelper 类:
静态方法 | 描述 |
startPage(int pageNum,int pageSize) | 设置本次查询的分页数据。(在本次查询之前设置) 参数:
|
- PageInfo 对象:
方法 | 描述 |
getPageNum() | 获取当前是第几页 |
getTotal() | 获取总记录数 |
getPages() | 获取总页数 |
getPageSize() | 获取一页显示多少条数据 |
getList() | 获取当前页的所有数据 |
- 代码实现
- 测试类
/** * 分页查询 */ @Test public void run2(){ UserDao dao = MyBatisUtils.getMapper(UserDao.class); //1、设置分页数据 PageHelper.startPage(1, 3); //2、正常查询所有(查询时已经进行分页) //注意,此时返回的ulist,不是ArrayList,而是继承了ArrayList的Page 类对象, //page类重写了toString,所以建议使用遍历来展示数据 | ||
List<User> ulist = dao.selectAll(); | ||
//3、封装分页数据(建议使用 pageInfo 对象封装转换,可以操作功能) | ||
PageInfo<User> pageInfo = new PageInfo<User>(ulist); | ||
System.out.println("当前页:"+pageInfo.getPageNum()); | ||
System.out.println("总记录数:"+pageInfo.getTotal()); | ||
System.out.println("总页数:"+pageInfo.getPages()); | ||
System.out.println("一页显示记录数:"+pageInfo.getPageSize()); | ||
//当前页的数据 | ||
for(User u:pageInfo.getList()){ | ||
System.out.println(u); | ||
} | ||
MyBatisUtils.close(); | ||
} |
- UserDao
@Select("select * from user")
List<User> selectAll();
- 通用 Mapper
- 概述
MyBatis 通用 Mapper 是用来简化 MyBatis 开发,它提供了一个名为 Mapper<T>的接口。这个 Mapper 接口中提供了常见的 DAO 方法,例如添加、修改、删除、查询等。我们在编写 DAO 接口时继承这个通用 Mapper 接口就可以得到 N 多常用方法。
如果通用 Mapper 中的方法还不能满足产你的需求,那么你只需在 DAO 中添加额外的方法即可。
public interface UserDao extends Mapper<User> {
}
//UserDao 可以使用从 Mapper 继承过来的所有方法
- 搭建环境
- 导入jar 包
- 修改工具类【直接复制使用即可】
factory = new SqlSessionFactoryBuilder().build(is);
=
is
// 会话工厂
private static SqlSessionFactory factory; static{
try {
// 1.1 加载核心配置文件
InputStream Resources.getResourceAsStream("SqlMapConfig.xml");
// 1.2 获得工厂
public class MyBatisUtils {
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static ThreadLocal<SqlSession> local = new ThreadLocal<>();
/**
- 获得新会话
- @return
*/
private static SqlSession openSession(){ SqlSession sqlSession = local.get(); if(sqlSession == null){
sqlSession = factory.openSession();
//创建一个 MapperHelper
MapperHelper mapperHelper = new MapperHelper();
//特殊配置
Config config = new Config();
// 设置 UUID 生成策略
// 配置 UUID 生成策略需要使用 OGNL 表达式
// 默 认 值 32 位 长度:@java.util.UUID@randomUUID().toString().replace("-", "")
//config.setUUID("");
// 主键自增回写方法,默认值 MYSQL,详细说明请看文档
// config.setIDENTITY("HSQLDB");
// 支持方法上的注解
// 3.3.1 版本增加config.setEnableMethodAnnotation(true); config.setNotEmpty(true);
// 序列的获取规则,使用{num}格式化参数,默认值为{0}.nextval,针对 Oracle
// 可选参数一共 3 个,对应 0,1,2,分别为 SequenceName,ColumnName,
PropertyName
//config.setSeqFormat("NEXT VALUE FOR {0}");
// 设置全局的 catalog, 默认为空, 如果设置了值, 操作表时的 sql 会是
catalog.tablename
//config.setCatalog("");
// 设置全局的 schema, 默认为空, 如果设置了值, 操作表时的 sql 会是
schema.tablename
// 如果同时设置了 catalog,优先使用 catalog.tablename
//config.setSchema("");
// 主键自增回写方法执行顺序,默认 AFTER,可选值为(BEFORE|AFTER)
//config.setOrder("AFTER");
//设置配置mapperHelper.setConfig(config);
// 注册通用 Mapper 接口 - 可以自动注册继承的接口mapperHelper.registerMapper(Mapper.class); mapperHelper.registerMapper(MySqlMapper.class);
// mapperHelper.registerMapper(SqlServerMapper.class);
// mapperHelper.registerMapper(IdsMapper.class);
//配置完成后,执行下面的操作
mapperHelper.processConfiguration(sqlSession.getConfiguration());
local.set(sqlSession);
}
return sqlSession;
}
/**
- 获得 mapper
- @param clazz
- @return
*/
public static <T> T getMapper(Class<T> clazz){ return openSession().getMapper(clazz);
}
/**
- 释放资源
*/
public static void close() {
SqlSession sqlSession = openSession(); if(sqlSession != null){
sqlSession.close();
}
}
/**
- 提交并释放资源
- @param sqlSession
*/
public static void commitAndclose() { SqlSession sqlSession = openSession(); if(sqlSession != null){
sqlSession.commit(); close();
}
}
/**
- 回滚并释放资源
- @param sqlSession
*/
public static void rollbackAndclose() { SqlSession sqlSession = openSession(); if(sqlSession != null){
sqlSession.rollback(); close();
}
}
}
JavaBean 编写@Table 和@Id
@Table(name=”表名”) : 表示当前 JavaBean 对应哪张 MySQL 表,默认对应 JavaBean
名称的表格
@Id :通用 mapper 必须设置,用于标识当前主键字段
@Table(name="t_user")
public class User implements Serializable {
/**
- uid INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
- username VARCHAR(32) NOT NULL COMMENT '用户名称',
- birthday DATE DEFAULT NULL COMMENT '生日',
- sex CHAR(1) DEFAULT NULL COMMENT '性别',
- address VARCHAR(256) DEFAULT NULL COMMENT '地址'
*/
@Id
private Integer uid; private String username; private Date birthday; private String sex; private String address;
public User(Integer uid, String username, Date birthday, String sex, String address) {
this.uid = uid;
this.username = username;
this.birthday = birthday; this.sex = sex; this.address = address;
}
@Override
public String toString() { return "User{" +
"uid=" + uid +
", username='" + username + '\'' + ", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' + '}';
}
public User() {
}
public Integer getUid() { return uid;
}
public void setUid(Integer uid) { this.uid = uid;
}
public String getUsername() { return username;
}
public void setUsername(String username) { this.username = username;
}
public Date getBirthday() { return birthday;
}
public void setBirthday(Date birthday) { this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) { this.sex = sex;
}
public String getAddress() { return address;
}
public void setAddress(String address) { this.address = address;
}
}
Dao 接口继承通用 Mapper
import tk.mybatis.mapper.common.Mapper;
public interface UserDao extends Mapper<User> {
}
- 编写测试类
通过主键查询
- 确定主键,否则所有字段都是主键
- 测试类
//1、获取Dao实现类对象
UserDao dao = MyBatisUtils.getMapper(UserDao.class);
//2、调用通过Mapper中继承而来的方法 User user = dao.selectByPrimaryKey(8); System.out.println(user);
//3、关闭资源
MyBatisUtils.close();
}
* 通过主键UID查询
*/ @Test
public void run1(){
/**
- 查询所有
- 测试类
//1、获取Dao实现类对象
UserDao dao = MyBatisUtils.getMapper(UserDao.class);
//2、调用通过Mapper中继承而来的方法
List<User> list = dao.selectAll();
* 查询所有数据
*/ @Test
public void run2(){
/**
for(User u:list){ System.out.println(u); | ||
} | ||
//3、关闭资源 | ||
MyBatisUtils.close(); | ||
} |
- 分页查询
- 测试类:
//1、获取Dao实现类对象
UserDao dao = MyBatisUtils.getMapper(UserDao.class);
//2、设置分页PageHelper.startPage(1, 3);
//3、调用通过Mapper中继承而来的方法List<User> list = dao.selectAll();
//4、封装分页数据
PageInfo<User> pageInfo = new PageInfo<User>(list); for(User u:pageInfo.getList()){
System.out.println(u);
}
//5、关闭资源
MyBatisUtils.close();
}
* 分页查询
*/ @Test
public void run3(){
/**
- 添加
- 测试类:
/**
* 添加: 测试 1,当前日期,男,沭阳
*/
@Test
public void run4_1(){
//1、获取Dao
UserDao dao = MyBatisUtils.getMapper(UserDao.class);
//2、调用Dao 方法
//添加数据,遇到null,添加null
int row = dao.insert(new User(null, "测试 1", new Date(), "男", "沭阳"));
//添加数据,遇到null,先尝试用数据库该字段默认值,该字段没有默认值,继续用null
//int row = dao.insertSelective(new User(null, "测试 1", new Date(), "男", "
沭阳"));
System.out.println("添加成功了"+row+"条数据");
//3、提交事务并关闭会话
MyBatisUtils.commitAndClose();
}
- 根据 ID 修改
- 测试类:
//1、获取Dao实现类对象
UserDao dao = MyBatisUtils.getMapper(UserDao.class);
//2、调用通过Mapper中继承而来的方法
User user = new User(9, "小王2",new Date(), "女", "测试区域2"); int i = dao.updateByPrimaryKey(user);
System.out.println("成功修改"+i+"行数据");
//3、关闭资源
MyBatisUtils.commitAndClose();
}
* 修 改
*/ @Test
public void run5(){
/**
- 根据 ID 删除
- 测试类:
/**
* 删 除
*/
@Test
public void run6(){
//1、获取Dao实现类对象 UserDao dao = MyBatisUtils.getMapper(UserDao.class); //2、调用通过Mapper中继承而来的方法 | ||
int i = dao.deleteByPrimaryKey(9); | ||
System.out.println("成功删除"+i+"行数据"); | ||
//3、关闭资源 | ||
MyBatisUtils.commitAndClose(); | ||
} |
- 多条件查询(and 模糊+and 等于+and 区间)
需求:用户名包含“小” 并且 性别为“男” 并且 出生日期在“2018-01-01”~“2018- 04-01”
- 测试类:
//1、获取Dao实现类对象
UserDao dao = MyBatisUtils.getMapper(UserDao.class);
//2、多条件查询
/**创建条件*/
Example example = new Example(User.class);
Criteria c = example.createCriteria();
//username模糊查询c.andLike("username", "%小%");
//sex等号查询c.andEqualTo("sex", "男");
//birthday区间查询
c.andBetween("birthday", "2018-01-01", "2018-04-01");
/**进行查询*/
List<User> ulist = dao.selectByExample(example); for(User u:ulist){
System.out.println(u);
}
//3、关闭资源
MyBatisUtils. close();
}
*/
@Test
public void run7(){
/**
* 多条件查询
* 用户名包含“小” 并且 性别为“男” 并且 出生日期在“2018-01-01”~
“2018-04-01”
- 多条件查询(andIn+and 非空)
需求:查询用户 ID 为 1 或 3 或 5 的数据,并且要求地址不能为空
- 测试类:
//1、获取Dao实现类对象
UserDao dao = MyBatisUtils.getMapper(UserDao.class);
//2、多条件查询
/**创建条件*/
Example example = new Example(User.class); Criteria c = example.createCriteria();
//uid 的in查询
List<Integer> uidList = new ArrayList<Integer>(); uidList.add(1);
uidList.add(3); uidList.add(5);
c.andIn("uid", uidList);
//address 的不为空查询c.andIsNotNull("address");
/**进行查询*/
List<User> ulist = dao.selectByExample(example); for(User u:ulist){
System.out.println(u);
}
//3、关闭资源
MyBatisUtils. close();
}
* 多条件查询
* 查询用户ID为1或3或5的数据,并且要求地址不能为空
*/ @Test
public void run8(){
/**
- 多条件查询(or 查询)
需求:查询用户名为“管理员” 或者 性别为“女”的所有数据
- 测试类:
//1、获取Dao实现类对象
UserDao dao = MyBatisUtils.getMapper(UserDao.class);
//2、多条件查询
/**创建条件*/
Example example = new Example(User.class);
Criteria c = example.createCriteria();
//username 的等于查询c.andEqualTo("username", "管理员");
//sex 的等于查询c.orEqualTo("sex", "女");
/**进行查询*/
List<User> ulist = dao.selectByExample(example); for(User u:ulist){
System.out.println(u);
}
//3、关闭资源
MyBatisUtils.close();
}
* 多条件查询
* 查询用户名为“管理员” 或者 性别为“女”的所有数据
*/ @Test
public void run9(){
/**
- 批量删除(andIn)
需求:根据 ID 删除信息,将 1,3,5 三条信息删除
//1、获取Dao实现类对象
UserDao dao = MyBatisUtils.getMapper(UserDao.class);
//2、调用通过Mapper中继承而来的方法
//创建条件
Example example = new Example(User.class); Criteria c = example.createCriteria();
//uid in
List<Integer> list = new ArrayList<Integer>(); list.add(1);
list.add(3);
list.add(5); c.andIn("uid", list);
//执行按条件删除
int row = dao.deleteByExample(example); System.out.println("成功删除了"+row+"条数据");
//3、关闭资源
MyBatisUtils.commitAndClose();
}
* 按条件删除
*/ @Test
public void run10(){
/**
总结:
1、条件查询一定要先创建查询条件:
2、遇到并且条件,就用 andXxx 遇到或者条件,就用 orXxx
3、最后调用方法查询即可:
- 通用 Mapper-API(附录)
- 查询方法
方法名 | 描述 |
T selectOne(T t) | 根据实体中的属性进行查询,只能有一个返回值,有多个 结果是抛出异常,查询条件使用等号 |
List<T> select(T t) | 根据实体中的属性值进行查询,查询条件使用等号 |
List<T> selectAll() | 查询全部结果 |
int selectCount(T t) | 根据实体中的属性查询总数,查询条件,使用等号 |
T selectByPrimaryKey(Object key) | 根据主键字段进行查询 |
boolean existsWhithPrimaryKey(Object key) | 根据主键字段查询记录是否存在 |
List<T> selectByExample(Object example) | 根据 Example 条件进行查询 |
T selectOneByExample(Object example) | 根据Example 条件进行查询,只能有一个返回值 |
int selectCountByExample(Object example) | 根据 Example 条件进行查询记录数 |
- 插入方法
方法名 | 描述 |
int insert(T t) | 保存一个实体,设置为 null 的属性会作为 null 保存,不使用该字段默认值 |
int intsertSelective(T t) | 保存一个实体,设置为 null 的属性不会直接保存 null,而是先尝试使用数 据库默认值保存 |
- 更新方法
方法名 | 描述 |
int updateByPrimaryKey(T t) | 根据主键更新实体全部字段,若属性设置为 null,则该字段 的值更新为 null |
int updateByPrimaryKeySelective(T t) | 根据主键更新实体,若属性设置为 null,则忽略该属性 |
- 删除方法
方法名 | 描述 |
int delete(T t) | 根据实体属性作为条件进行删除,查询条件使用等号 |
int deletePrimaryKey(Object key) | 根据主键字段进行删除 |
int deleteByExample(Object example) | 根据 Example 条件删除数据 |
相关推荐
- 前端入门——css 网格轨道详细介绍
-
上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...
- Islands Architecture(孤岛架构)在携程新版首页的实践
-
一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...
- HTML中script标签中的那些属性
-
HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...
- CSS 中各种居中你真的玩明白了么
-
页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...
- CSS样式更改——列表、表格和轮廓
-
上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...
- 一文吃透 CSS Flex 布局
-
原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...
- css实现多行文本的展开收起
-
背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...
- css 垂直居中的几种实现方式
-
前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...
- WordPress固定链接设置
-
WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...
- 面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿
-
前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...
- 3种CSS清除浮动的方法
-
今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...
- 2025 年 CSS 终于要支持强大的自定义函数了?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...
- css3属性(transform)的一个css3动画小应用
-
闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...
- CSS基础知识(七)CSS背景
-
一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...
- CSS 水平居中方式二
-
<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)