赞
踩
总结:
接口开发的方式: 程序员只需定义接口,就可以对数据库进行操作,那么具体的对象怎么创建?
1.程序员负责定义接口
2.在操作数据库,mybatis框架根据接口,通过动态代理的方式生成代理对象,负责数据库的crud操作
通过动态代理开发模式,我们只编写一个接口,不写实现类,
我们通过 getMapper() 方法最终获取到 org.apache.ibatis.binding.MapperProxy 代理对象,
然后执行功能,而这个代理对象正是 MyBatis 使用了 JDK 的动态代理技术,
帮助我们生成了代理实现类对象。从而可以进行相关持久化操作。
动态代理实现类对象在执行方法的时候最终调用了 mapperMethod.execute() 方法,
这个方法中通过 switch 语句根据操作类型来判断是新增、修改、删除、查询操作,
最后一步回到了 MyBatis 最原生的 SqlSession 方式来执行增删改查。
接口代理方式可以让我们只编写接口即可,而实现类对象由 MyBatis 生成。
实现规则 :
映射配置文件中的名称空间必须和 Dao 层接口的全类名相同。
映射配置文件中的增删改查标签的 id 属性必须和 Dao 层接口的方法名相同。
映射配置文件中的增删改查标签的 parameterType 属性必须和 Dao 层接口方法的参数相同。
映射配置文件中的增删改查标签的 resultType 属性必须和 Dao 层接口方法的返回值相同。
获取动态代理对象 SqlSession 功能类中的 getMapper() 方法。
============================================================================
Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。
我们根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。
如下图:
/**
多条件查询 condition:情况
@param user
@return User
*/
public List selectCondition(User user);
select * from t_user
and id=#{id}
and username=#{username}
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);
}
@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 关键字。
:条件判断标签。
查询条件拼接
循环执行sql的拼接操作,例如:SELECT * FROM student WHERE id IN (1,3,4)。
/**
foreach查询多个id
@param id
@return List
*/
public List selectByIds(List id);
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:分隔符。
Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的
select * from student
where id=#{id}
#{id}
总结语法:
我们可以将一些重复性的 SQL 语句进行抽取,以达到复用的效果。
:抽取 SQL 语句标签。
:引入 SQL 片段标签。
抽取的 SQL 语句
MyBatis映射文件配置:
:查询
:插入
:修改
:删除
:where条件
:if判断
:循环
:sql片段抽取
=========================================================================
分页可以将很多条结果进行分页显示。
如果当前在第一页,则没有上一页。如果当前在最后一页,则没有下一页。
需要明确当前是第几页,这一页中显示多少条结果。
MyBatis分页插件总结
在企业级开发中,分页也是一种常见的技术。而目前使用的 MyBatis 是不带分页功能的,如果想实现分页的 功能,需要我们手动编写 LIMIT 语句。但是不同的数据库实现分页的 SQL 语句也是不同的,所以手写分页 成本较高。这个时候就可以借助分页插件来帮助我们实现分页功能。
PageHelper:第三方分页助手。将复杂的分页操作进行封装,从而让分页功能变得非常简单。
MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据
①导入与PageHelper的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);
}
}
//其他分页的数据
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());
分页:可以将很多条结果进行分页显示。
分页插件 jar 包: pagehelper-5.1.10.jar jsqlparser-3.1.jar
:集成插件标签。
分页助手相关 API
PageHelper:分页助手功能类。
startPage():设置分页参数
PageInfo:分页相关参数功能类。
getTotal():获取总条数
getPages():获取总页数
getPageNum():获取当前页
getPageSize():获取每页显示条数
getPrePage():获取上一页
getNextPage():获取下一页
isIsFirstPage():获取是否是第一页
isIsLastPage():获取是否是最后一页
==================================================================================
1、简化开发步骤 mapper.xml
2、自动进行ORM映射 前提:表中字段名和实体类中的属性名一致
3、查询优化 缓存Cache
多表–>Mybatis不自动映射,可以匹配对应关系结果映射
作用:用于查询结果和实体类不匹配时,完成列名和属性名对应关系的映射
主键映射用id,其他用result
select *
from t_user;
单表操作简化写法,通过列名对应实体属性名
select id as id1,
username as username1,
password as password1,
age as age1,
birthday as birthday1
from t_user;
========================================================================================
1、分析框架的特点
2、根据框架特点完成整合
3、开发
1、建表
2、实体
3、dao接口【Mybatis框架】
4、service接口
5、service实现类
6、action【Struts2框架】
7、jsp
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 数据库链接配置
gitee文件夹名:mybatis+struts2整合开发jar包环境配置:
https://gitee.com/wanghengjie563135/mybatis_struts2.git
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标签库
==============================================================================================
注:全部源代码在githee仓库:详细源代码见文章底部
初始化配置Gitee位置:https://gitee.com/wanghengjie563135/mybatis_struts2.git
struts
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts
/*
/queryAll.jsp
select * from t_user;
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
username=root
password=root
log4j.rootLogger=DEBUG, stdout
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
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
private Integer id;
private String username;
private String password;
private int age;
private Date birthday;
/**
查询所有
@return用户集合
*/
public List selectUserAll();
select * from t_user;
/**
查询所有
@return
*/
public List queryAll();
@Override
public List queryAll() {
//调用DAO
UserDao mapper = (UserDao) MybatisUtil.getMapper(UserDao.class);
List users = mapper.selectUserAll();
MybatisUtil.close();
return users;
}
@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();
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
小编精心为大家准备了一手资料
以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术
【附】架构书籍
BATJ面试要点及Java架构师进阶资料
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
ass);
List users = mapper.selectUserAll();
MybatisUtil.close();
return users;
}
@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();
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-dsoH1wMK-1713632398656)]
[外链图片转存中…(img-njbDHLMP-1713632398658)]
[外链图片转存中…(img-a9UKIjna-1713632398659)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
小编精心为大家准备了一手资料
[外链图片转存中…(img-X7VjwoA0-1713632398660)]
[外链图片转存中…(img-WhYMxF37-1713632398660)]
以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术
【附】架构书籍
[外链图片转存中…(img-QliA8tyC-1713632398660)]
BATJ面试要点及Java架构师进阶资料
[外链图片转存中…(img-wHtli58q-1713632398660)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。