当前位置:   article > 正文

如何优雅设计mybtis工具类及实现分页查询,动态SQL&mybatis+struts组合使用_mybatis怎么分页 mybatis插件技术 mybatis动态代理

mybatis怎么分页 mybatis插件技术 mybatis动态代理

总结:

接口开发的方式: 程序员只需定义接口,就可以对数据库进行操作,那么具体的对象怎么创建?

1.程序员负责定义接口

2.在操作数据库,mybatis框架根据接口,通过动态代理的方式生成代理对象,负责数据库的crud操作

2、源码分析

  • 分析动态代理对象如何生成的?

通过动态代理开发模式,我们只编写一个接口,不写实现类,

我们通过 getMapper() 方法最终获取到 org.apache.ibatis.binding.MapperProxy 代理对象,

然后执行功能,而这个代理对象正是 MyBatis 使用了 JDK 的动态代理技术,

帮助我们生成了代理实现类对象。从而可以进行相关持久化操作。

  • 分析方法是如何执行的?

动态代理实现类对象在执行方法的时候最终调用了 mapperMethod.execute() 方法,

这个方法中通过 switch 语句根据操作类型来判断是新增、修改、删除、查询操作,

最后一步回到了 MyBatis 最原生的 SqlSession 方式来执行增删改查。

3、知识小结

接口代理方式可以让我们只编写接口即可,而实现类对象由 MyBatis 生成。

实现规则 :

  1. 映射配置文件中的名称空间必须和 Dao 层接口的全类名相同。

  2. 映射配置文件中的增删改查标签的 id 属性必须和 Dao 层接口的方法名相同。

  3. 映射配置文件中的增删改查标签的 parameterType 属性必须和 Dao 层接口方法的参数相同。

  4. 映射配置文件中的增删改查标签的 resultType 属性必须和 Dao 层接口方法的返回值相同。 

  5. 获取动态代理对象 SqlSession 功能类中的 getMapper() 方法。

三、动态sql语句

============================================================================

1、动态sql语句概述

Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。

2、动态 SQL 之<if>

我们根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。

如下图:

  • UserDao接口

/**

  • 多条件查询 condition:情况

  • @param user

  • @return User

*/

public List selectCondition(User user);

  • UserDaoImpl.xml

select * from t_user

and id=#{id}

and username=#{username}

  • 1.当查询条件id和username都存在时,控制台打印的sql语句如下:

public void selectByCondition() throws IOException {

SqlSession sqlSession = MybatisUtil.openSession();

UserDao mapper = sqlSession.getMapper(UserDao.class);

User user = new User();

user.setId(1);

user.setUsername(“王恒杰”);

List users = mapper.selectCondition(user);

for (User user1 : users) {

System.out.println(user1);

}

MybatisUtil.close(sqlSession);

}

在这里插入图片描述

  • 当查询条件只有id存在时,控制台打印的sql语句如下:

@Test

public void selectByCondition() throws IOException {

SqlSession sqlSession = MybatisUtil.openSession();

UserDao mapper = sqlSession.getMapper(UserDao.class);

User user = new User();

user.setId(1);

user.setUsername(“杨福君”);

List users = mapper.selectCondition(user);

for (User user1 : users) {

System.out.println(user1);

}

MybatisUtil.close(sqlSession);

}

}

总结语法:

:条件标签。如果有动态条件,则使用该标签代替 where 关键字。

:条件判断标签。

查询条件拼接

3、动态 SQL 之<foreach>

循环执行sql的拼接操作,例如:SELECT * FROM student WHERE id IN (1,3,4)。

  • UserDao

/**

  • foreach查询多个id

  • @param id

  • @return List

*/

public List selectByIds(List id);

  • UserDaoImpl.xml配置

select * from t_user

#{id}

  • 测试类

@Test

public void selectByIts() throws IOException {

SqlSession sqlSession = MybatisUtil.openSession();

UserDao mapper = sqlSession.getMapper(UserDao.class);

ArrayList list = new ArrayList<>();

list.add(1);

list.add(3);

list.add(4);

List users = mapper.selectByIds(list);

for (User user : users) {

System.out.println(user);

}

MybatisUtil.close(sqlSession);

}

总结语法:

:循环遍历标签。适用于多个参数或者的关系。

<foreach collection=“”open=“”close=“”item=“”separator=“”>

获取参数

属性

collection:参数容器类型, (list-集合, array-数组)。

open:开始的 SQL 语句。

close:结束的 SQL 语句。

item:参数变量名。

separator:分隔符。

4、 include 实现SQL片段抽取

Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的

select * from student

where id=#{id}

#{id}

总结语法:

我们可以将一些重复性的 SQL 语句进行抽取,以达到复用的效果。

:抽取 SQL 语句标签。

:引入 SQL 片段标签。

抽取的 SQL 语句

5、知识小结

MyBatis映射文件配置:

:查询

:插入

:修改

:删除

:where条件

:if判断

:循环

:sql片段抽取

四、分页插件

=========================================================================

1、分页插件介绍

  • 分页可以将很多条结果进行分页显示。

  • 如果当前在第一页,则没有上一页。如果当前在最后一页,则没有下一页。

  • 需要明确当前是第几页,这一页中显示多少条结果。

  • MyBatis分页插件总结

  1. 在企业级开发中,分页也是一种常见的技术。而目前使用的 MyBatis 是不带分页功能的,如果想实现分页的 功能,需要我们手动编写 LIMIT 语句。但是不同的数据库实现分页的 SQL 语句也是不同的,所以手写分页 成本较高。这个时候就可以借助分页插件来帮助我们实现分页功能。

  2. PageHelper:第三方分页助手。将复杂的分页操作进行封装,从而让分页功能变得非常简单。

2、分页插件的使用

MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据

  • 开发步骤:

①导入与PageHelper的jar包

在这里插入图片描述

jsqlparser-3.1.jar

pagehelper-5.1.10.jar

②在mybatis核心配置文件中配置PageHelper插件

在这里插入图片描述

③测试分页数据获取

public void testPageHelper() throws IOException {

SqlSession sqlSession = MybatisUtil.openSession();

UserDao mapper = sqlSession.getMapper(UserDao.class);

//通过分页助手来实现分页功能

// 第一页:显示3条数据

//PageHelper.startPage(1,3);

// 第二页:显示3条数据

//PageHelper.startPage(2,3);

// 第三页:显示3条数据

PageHelper.startPage(1,2);

//调用实现类的方法,接收结果

List users = mapper.selectUserAll();

// 处理结果

for (User user : users) {

System.out.println(user);

}

//获取分页相关参数

PageInfo info = new PageInfo<>(users);

System.out.println(“总条数”+info.getTotal());

System.out.println(“总页数”+info.getPages());

System.out.println(“当前页面”+info.getPageNum());

System.out.println(“每页显示条数”+info.getPageSize());

System.out.println(“上一页”+info.getPrePage());

System.out.println(“下一页”+info.getNextPage());

System.out.println(“是否是第一页”+info.isIsFirstPage());

System.out.println(“是否是最后一页”+info.isIsLastPage());

MybatisUtil.close(sqlSession);

}

}

3、分页插件的参数获取

//其他分页的数据

PageInfo pageInfo = new PageInfo(select);

System.out.println(“总条数:”+pageInfo.getTotal());

System.out.println(“总页数:”+pageInfo.getPages());

System.out.println(“当前页:”+pageInfo.getPageNum());

System.out.println(“每页显示长度:”+pageInfo.getPageSize());

System.out.println(“是否第一页:”+pageInfo.isIsFirstPage());

System.out.println(“是否最后一页:”+pageInfo.isIsLastPage());

4、分页插件知识小结

分页:可以将很多条结果进行分页显示。

  • 分页插件 jar 包: pagehelper-5.1.10.jar jsqlparser-3.1.jar

  • :集成插件标签。

  • 分页助手相关 API

  1. PageHelper:分页助手功能类。

  2. startPage():设置分页参数

  3. PageInfo:分页相关参数功能类。

  4. getTotal():获取总条数

  5. getPages():获取总页数

  6. getPageNum():获取当前页

  7. getPageSize():获取每页显示条数

  8. getPrePage():获取上一页

  9. getNextPage():获取下一页

  10. isIsFirstPage():获取是否是第一页

  11. isIsLastPage():获取是否是最后一页

五、结果映射ResultMap

==================================================================================

1、简化开发步骤 mapper.xml

2、自动进行ORM映射 前提:表中字段名和实体类中的属性名一致

3、查询优化 缓存Cache

1、Mybatis自动封装(ORM映射)

  • Mybatis自动ORM映射时,表中的字段名和实体类名一致

2、手工实现封装(ORM映射)mapResult

多表–>Mybatis不自动映射,可以匹配对应关系结果映射

作用:用于查询结果和实体类不匹配时,完成列名和属性名对应关系的映射

主键映射用id,其他用result

  • UserDaoImpl.xml实现手工映射(ORM映射)

select *

from t_user;

3、单表起别名实现ORM自动封装【简化操作】

单表操作简化写法,通过列名对应实体属性名

  • 给数据库中表的列名取别名

select id as id1,

username as username1,

password as password1,

age as age1,

birthday as birthday1

from t_user;

五、mybatis+Struts2整合开发

========================================================================================

1、分析框架的特点

2、根据框架特点完成整合

3、开发

1、编码流程

1、建表

2、实体

3、dao接口【Mybatis框架】

4、service接口

5、service实现类

6、action【Struts2框架】

7、jsp

2、Struts2框架+Mybatis框架整合

1、搭建开发环境

1、搭建开发环境

a、引入jar包

struts2 核心jar 三方依赖jar包 Servlet包 jstl jsp 验证码

mybatis 核心jar包 三方依赖jar包 数据库驱动jar包 Junit测试jar包

注意:

(1)jar包存放WEB-INF的lib目录中

(2)jar包冲突 避免相同Jar包出现多次 选择依据:就高不就低

b、引入配置文件

Struts2 核心配置文件 struts.xml 名字固定 位置固定:src下

Mybatis: 核心配置文件 mybatis-config.xml 名字随意 位置随意 建议 src下

日志相关配置文件 log4j.properties 名字随意 位置随意 建议 src下

mapper文件模型 xxxDaoImpl.Xml 名字随意 建议:dao层

数据库链接参数配置文件:jdbc.properties

c、初始化配置 让框架生效

Struts2 Web.xml中核心过滤器配置 拦截所有请求交由Struts2处理

Mybatis 数据库链接配置

  • mybatis+struts2整合开发jar包+环境配置:

gitee文件夹名:mybatis+struts2整合开发jar包环境配置:

https://gitee.com/wanghengjie563135/mybatis_struts2.git

2、编程步骤

1、建表

2、创建实体类

3、实体类起别名

4、创建Dao接口

5、书写Dao接口 书写Dao接口对应的mapper文件

6、注册Mapper 在mybatis-config.xml配置完成mapper文件路径注册

7、测试 用Mybatis中的Dao接口实现

8、创建Service接口

9、实现Service接口 MybatisUtil工具类

10、测试Service 测试业务方法是否正确 创建业务实现对象调用业务方法查看结果

11、Action 接收数据 调用业务 跳转页面

(1)写类 服务方法

(2)在struts.xml中进行配置

12、jsp展示数据 EL表达式+EL标签库

六、案例实战(mybatis+struts2+jsp)

==============================================================================================

注:全部源代码在githee仓库:详细源代码见文章底部

(1)搭建开发环境


1、jar包

2、初始化配置

初始化配置Gitee位置:https://gitee.com/wanghengjie563135/mybatis_struts2.git

1、web.xml
  • struts2核心过滤器配置 拦截所有请求交由Struts2处理

struts

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

struts

/*

2、struts.xml

/queryAll.jsp

3、mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>

4、UserDaoImpl.xml

select * from t_user;

5、jdbc.properties

driver=com.mysql.cj.jdbc.Driver

url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC

username=root

password=root

6、log4j.properties

log4j.rootLogger=DEBUG, stdout

SqlMap logging configuration…

log4j.logger.com.ibatis=DEBUG

log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG

log4j.logger.com.ibatis.sqlmap.engine.cache.CacheModel=DEBUG

log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientImpl=DEBUG

log4j.logger.com.ibatis.sqlmap.engine.builder.xml.SqlMapParser=DEBUG

log4j.logger.com.ibatis.common.util.StopWatch=DEBUG

log4j.logger.java.sql.Connection=DEBUG

log4j.logger.java.sql.Statement=DEBUG

log4j.logger.java.sql.PreparedStatement=DEBUG

log4j.logger.java.sql.ResultSet=DEBUG

Console output…

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

(2)编程


1、建表

2、创建实体类

private Integer id;

private String username;

private String password;

private int age;

private Date birthday;

3、实体类起别名

4、创建Dao接口

/**

  • 查询所有

  • @return用户集合

*/

public List selectUserAll();

5、书写Dao接口mapper.xml实现

select * from t_user;

6、注册Mapper mybatis-config.xml中实现

7、创建Service接口

/**

  • 查询所有

  • @return

*/

public List queryAll();

8、实现Service接口

@Override

public List queryAll() {

//调用DAO

UserDao mapper = (UserDao) MybatisUtil.getMapper(UserDao.class);

List users = mapper.selectUserAll();

MybatisUtil.close();

return users;

}

9、测试Service

@Test

public void testSelectAll() throws IOException {

UserDao userDAO = (UserDao) MybatisUtil.getMapper(UserDao.class);

List users = userDAO.selectUserAll();

for (User user : users) {

System.out.println(user);

}

MybatisUtil.close();

}

10、Action 接收数据 调用业务 跳转页面

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

小编精心为大家准备了一手资料

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

BATJ面试要点及Java架构师进阶资料

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
ass);

List users = mapper.selectUserAll();

MybatisUtil.close();

return users;

}

9、测试Service

@Test

public void testSelectAll() throws IOException {

UserDao userDAO = (UserDao) MybatisUtil.getMapper(UserDao.class);

List users = userDAO.selectUserAll();

for (User user : users) {

System.out.println(user);

}

MybatisUtil.close();

}

10、Action 接收数据 调用业务 跳转页面

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-dsoH1wMK-1713632398656)]

[外链图片转存中…(img-njbDHLMP-1713632398658)]

[外链图片转存中…(img-a9UKIjna-1713632398659)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

小编精心为大家准备了一手资料

[外链图片转存中…(img-X7VjwoA0-1713632398660)]

[外链图片转存中…(img-WhYMxF37-1713632398660)]

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

[外链图片转存中…(img-QliA8tyC-1713632398660)]

BATJ面试要点及Java架构师进阶资料

[外链图片转存中…(img-wHtli58q-1713632398660)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/809382
推荐阅读
相关标签
  

闽ICP备14008679号