百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

分页查询+通用mapper(Java数据库编程)

mhr18 2024-10-11 12:43 21 浏览 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)

设置本次查询的分页数据。(在本次查询之前设置) 参数:

  • pageNum:当前展示数据的第几页
  • 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();

  1. 通用 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 条件删除数据

相关推荐

订单超时自动取消业务的 N 种实现方案,从原理到落地全解析

在分布式系统架构中,订单超时自动取消机制是保障业务一致性的关键组件。某电商平台曾因超时处理机制缺陷导致日均3000+订单库存锁定异常,直接损失超50万元/天。本文将从技术原理、实现细节、...

使用Spring Boot 3开发时,如何选择合适的分布式技术?

作为互联网大厂的后端开发人员,当你满怀期待地用上SpringBoot3,准备在项目中大显身手时,却发现一个棘手的问题摆在面前:面对众多分布式技术,究竟该如何选择,才能让SpringBoot...

数据库内存爆满怎么办?99%的程序员都踩过这个坑!

你的数据库是不是又双叒叕内存爆满了?!服务器监控一片红色警告,老板在群里@所有人,运维同事的电话打爆了手机...这种场景是不是特别熟悉?别慌!作为一个在数据库优化这条路上摸爬滚打了10年的老司机,今天...

springboot利用Redisson 实现缓存与数据库双写不一致问题

使用了Redisson来操作Redis分布式锁,主要功能是从缓存和数据库中获取商品信息,以下是针对并发时更新缓存和数据库带来不一致问题的解决方案1.基于读写锁和删除缓存策略在并发更新场景下,...

外贸独立站数据库炸了?对象缓存让你起死回生

上周黑五,一个客户眼睁睁看着服务器CPU飙到100%——每次页面加载要查87次数据库。这让我想起2024年Pantheon的测试:Redis缓存能把WooCommerce查询速度提升20倍。跨境电商最...

手把手教你在 Spring Boot3 里纯编码实现自定义分布式锁

为什么要自己实现分布式锁?你是不是早就受够了引入各种第三方依赖时的繁琐?尤其是分布式锁这块,每次集成Redisson或者Zookeeper,都得额外维护一堆配置,有时候还会因为版本兼容问题头疼半...

如何设计一个支持百万级实时数据推送的WebSocket集群架构?

面试解答:要设计一个支持百万级实时数据推送的WebSocket集群架构,需从**连接管理、负载均衡、水平扩展、容灾恢复**四个维度切入:连接层设计-**长连接优化**:采用Netty或Und...

Redis数据结构总结——面试最常问到的知识点

Redis作为主流的nosql存储,面试时经常会问到。其主要场景是用作缓存,分布式锁,分布式session,消息队列,发布订阅等等。其存储结构主要有String,List,Set,Hash,Sort...

skynet服务的缺陷 lua死循环

服务端高级架构—云风的skynet这边有一个关于云风skynet的视频推荐给大家观看点击就可以观看了!skynet是一套多人在线游戏的轻量级服务端框架,使用C+Lua开发。skynet的显著优点是,...

七年Java开发的一路辛酸史:分享面试京东、阿里、美团后的心得

前言我觉得有一个能够找一份大厂的offer的想法,这是很正常的,这并不是我们的饭后谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司...

mysql mogodb es redis数据库之间的区别

1.MySQL应用场景概念:关系型数据库,基于关系模型,使用表和行存储数据。优点:支持ACID事务,数据具有很高的一致性和完整性。缺点:垂直扩展能力有限,需要分库分表等方式扩展。对于复杂的查询和大量的...

redis,memcached,nginx网络组件

1.理解阻塞io,非阻塞io,同步io,异步io的区别2.理解BIO和AIO的区别io多路复用只负责io检测,不负责io操作阻塞io中的write,能写多少是多少,只要写成功就返回,譬如准备写500字...

SpringBoot+Vue+Redis实现验证码功能

一个小时只允许发三次验证码。一次验证码有效期二分钟。SpringBoot整合Redis...

AWS MemoryDB 可观测最佳实践

AWSMemoryDB介绍AmazonMemoryDB是一种完全托管的、内存中数据存储服务,专为需要极低延迟和高吞吐量的应用程序而设计。它与Redis和Memcached相似,但具有更...

从0构建大型AI推荐系统:实时化引擎从工具到生态的演进

在AI浪潮席卷各行各业的今天,推荐系统正从幕后走向前台,成为用户体验的核心驱动力。本文将带你深入探索一个大型AI推荐系统从零起步的全过程,揭示实时化引擎如何从单一工具演进为复杂生态的关键路径。无论你是...

取消回复欢迎 发表评论: