1.Mybatis框架基本使用

特点:

  1. mybatis是一款优秀的持久层框架

  2. 支持定制化的SQL、存储过程以及高级映射

  3. mybatis可以使用简单的XML或注解来配置和映射原生类型、接口和java的POJO实例

     

优点:

1.简单、灵活、sql和代码分离,提高可维护性

2.提供映射标签,支持对象与数据库的orm字段关系映射

3.提供对象关系映射标签、支持对象关系组维护

4.提供xml标签,支持编写动态sql

 

持久化(内存中的数据转入硬盘存储)

就是将数据在瞬时状态和持久状态之间转化

1.准备测试环境

搭建环境、导入依赖、配置文件、编写代码、测试

<!--在build配置resources,来防止资源导出失败问题--><build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource></resources></build>

mybatis工具类读取配置文件,创建Sqlsession

//myabtsi工具类读取配置文件,创建Sqlsession
public class MybatisUtils {private  static SqlSessionFactory sqlSessionFactory;//加载配置文件,创建SqlsessionFactory工厂static{String resource="mybatis-config.xml";try {InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}//从工厂中获取Sqlsession,来执行数据库public static SqlSession getSqlsession(){SqlSession sqlSession = sqlSessionFactory.openSession();return sqlSession;}
}

注意:增删改需要提交事务

2.事务管理器

在mybatis中有两种类型的事务管理器,默认事务管理器是 JDBC

JDBC - 这个配置就是直接使用JDBC的提交和回滚设置

manage - 不常用,没有提交和回滚设置

如果你正在使用spring+mybatis,则不需要配置事务管理器,因为spring模块自带管理器会覆盖前面的配置

3.生命周期

db466e9c60f442bf8dc7a92534302d54.png

1、SqlSessionFactoryBuilder
SqlSessionFactoryBuilder的作用在于创建SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder就失去作用,所以它只能存在于创建SqlSessionFactory的方法中,而不要让其长期存在。

2、SqlSessionFactory
SqlSessionFactory可以被认为是一个数据库连接池,它的作用是创建SqlSession接口对象。因为MyBatis的本质就是Java对数据库的操作,所以SqlSessionFactory的生命周期存在于整个MyBatis的应用中,所以一旦创建了SqlSessionFactory,就要长期保存它,直至不在使用MyBatis应用,所以可以认为SqlSessionFactory的生命周期就等同与MyBatis的应用周期。

由于SqlSessionFactory是对一个数据库的连接池,所以它占据着数据库的连接资源。如果创建多个SqlSessionFactory,那么就存在多个数据库连接池,不利于对数据库资源的控制,也将导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免出现这种情况。因此在一般的应用中,我们往往希望SqlSessionFactory作为一个单例,让它在应用中被共享。

3、SqlSession
如果说SqlSessionFactory相当于数据库连接池,那么SqlSession就相当于一个数据库连接(Connection对象),我们可以在一个事务中执行多条SQL,然后通过它的commit、rollback等方法,提交或回滚事务。所以SqlSession应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给SqlSessionFactory,否则数据库资源将被耗光,系统瘫痪,所以使用try...catch...finally语句来保证SqlSession正确关闭。

4、Mapper
Mapper是一个接口,它由SqlSession所创建,所以它的最大生命周期至多和SqlSession保持一致,当SqlSession关闭时,Mapper的数据库连接资源也会消失,所以Mapper的生命周期应该小于等于SqlSession的生命周期。Mapper代表的是一个请求中的业务处理,所以它应该在一个请求中,一旦处理完了相关业务,就应该废弃它。
 

4.ResultMap结果集映射

解决数据库字段与java实例类上的字段不一致的问题

  	<!--结果集映射 --><resultMap id="UserMap" type="User"><result column="id" property="id"></result><result column="name" property="name"></result><result column="pwd" property="pwd"></result></resultMap>// ResultMap结果集映射<select id="getUserGetById2" resultMap="UserMap">select * from user where id = #{id}</select>

resultType与resultMap区别

resultType与resultMap都是用来对数据库返回的结果进行封装
resultType 只能封装简单类型的对象,对象中没有对象类型的属性 -> 简单对象
resultMap 封装复杂类型的对象, 处理库表关联关系 -> 一对一、一对多、多对多

 

5.mybatis设置日志

可以在控制台上查看sql语句执行情况

#输出查询结果
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#不输出查询结果
#mybatis.configuration.log-impl=org.apache.ibatis.logging.log4j2.Log4j2Impl

6.Mysql数据库实现分页

# 1.原始方法,使用 limit,需要自己处理分页逻辑
分页是为了减少数据的处理量

select * from table limit 5; --返回前5行

select * from table limit 0,5; --同上,返回前5行

select * from table limit 5,10; --返回6-15行

6.1.limit分页方式

public interface Usermapper {
    //分页
    List<User> getUserLimit(Map<String,Object> map);
}

<select id="getUserLimit" parameterType="map" resultType="user">
       select * from t_user limit #{startIndex},#{pageSize}
</select>

    @Test
    public void test4(){
        SqlSession sqlsession = MybatisUtils.getSqlsession();

        Usermapper usermapper = sqlsession.getMapper(Usermapper.class);
        Map<String, Object> map = new HashMap();
        map.put("startIndex", 0);
        map.put("pageSize", 10);

        List<User> userLimit = usermapper.getUserLimit(map);
        for (User user : userLimit) {
            System.out.println(user.getId());
            System.out.println(user.getUsername());
            System.out.println(user.getAge());
            System.out.println(user.getSex());
        }
        //关闭sqlsession
        sqlsession.close();
    }

6.2数组分页方式

# 查询出全部数据,然后再list中截取需要的部分

// mybatis接口

List<Student> queryStudentsByArray();

// xml配置文件

<select id="queryStudentsByArray"  resultMap="studentmapper">
        select * from student
</select>

// service

接口
List<Student> queryStudentsByArray(int currPage, int pageSize);

 

实现接口
 @Override
    public List<Student> queryStudentsByArray(int currPage, int pageSize) {
        //查询全部数据
        List<Student> students = studentMapper.queryStudentsByArray();
        //从第几条数据开始
        int firstIndex = (currPage - 1) * pageSize;
        //到第几条数据结束
        int lastIndex = currPage * pageSize;
        return students.subList(firstIndex, lastIndex); //直接在list中截取
    }

// controller

    @ResponseBody
    @RequestMapping("/student/array/{currPage}/{pageSize}")
    public List<Student> getStudentByArray(@PathVariable("currPage") int currPage,         @PathVariable("pageSize") int pageSize) {
        List<Student> student = StuServiceIml.queryStudentsByArray(currPage, pageSize);
        return student;
    }

6.3sql分页方式

// mybatis接口
List<Student> queryStudentsBySql(Map<String,Object> data);

// xml文件
<select id="queryStudentsBySql" parameterType="map" resultMap="studentmapper">
        select * from student limit #{currIndex} , #{pageSize}
</select>

// service
接口
List<Student> queryStudentsBySql(int currPage, int pageSize);
实现类
public List<Student> queryStudentsBySql(int currPage, int pageSize) {
        Map<String, Object> data = new HashedMap();
        data.put("currIndex", (currPage-1)*pageSize);
        data.put("pageSize", pageSize);
        return studentMapper.queryStudentsBySql(data);
    }

6.4RowBounds实现分页

数据量小时,RowBounds不失为一种好办法。但是数据量大时,实现拦截器就很有必要了。

// mybatis接口加入RowBounds参数
public List<UserBean> queryUsersByPage(String userName, RowBounds rowBounds);

// service
@Override
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.SUPPORTS)
    public List<RoleBean> queryRolesByPage(String roleName, int start, int limit) {
        return roleDao.queryRolesByPage(roleName, new RowBounds(start, limit));
    }

6.5.分页插件PageHelper

# 分页插件原理
就是使用MyBatis提供的插件接口,实现自定义插件,在插件的拦截方法内,拦截待执行的SQL,然后根据设置的dialect(方言),和设置的分页参数,重写SQL ,生成带有分页语句的SQL,执行重写后的SQL,从而实现分页

Mybatis分页插件PageHelper

6.5.1Springboot整合Mybatis分页插件PageHelper

# 简述
MyBatis使用分页查询功能,需要配置分页插件,如果没有配置,则分页功能不生效

 

https://blog.csdn.net/weixin_38568503/article/details/121543656  参考 

// 实体
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {private Integer id;private String bookName;private String bookAuthor;private Double bookMoney;public Book(String bookName, String bookAuthor, Double bookMoney) {this.bookName = bookName;this.bookAuthor = bookAuthor;this.bookMoney = bookMoney;}
}
@Mapper  //此注解可以加,也可以不加,因为我们在主启动类加了@MapperScan
@Repository //dao层的注解
public interface BookMaper {//分页查询所有public List<Book> selectAllByPage();//动态条件查询加分页public List<Book> selectByPageAndCondition(Book book);
}

# 注意:selectAllByPage这个sql语句最后不能加分号,因为要拼接limit语句的

<?xml version="1.0" encoding="UTF-8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/282250.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python+pytest接口自动化(16)-接口自动化项目中日志的使用 (使用loguru模块)

通过上篇文章日志管理模块loguru简介&#xff0c;我们已经知道了loguru日志记录模块的简单使用。在自动化测试项目中&#xff0c;一般都需要通过记录日志的方式来确定项目运行的状态及结果&#xff0c;以方便定位问题。 这篇文章我们使用loguru模块来记录接口自动化测试中的日…

灾备建设中,虚拟机异构平台恢复技术原理与应用

在如今混合云环境下&#xff0c;实现异构虚拟化恢复与迁移面临着极大挑战。不同于市面上有代理的恢复方案&#xff0c;虚拟机无代理跨平台恢复解决方案利用自主研发的转换引擎&#xff08;VMCE&#xff09;对已备份虚拟机文件进行高效的存储格式转换和配置信息转换&#xff0c;…

介绍strncpy函数

strncpy函数需要引用#include <string.h>头文件 函数原型&#xff1a; char *_Dest 是字符串的去向 char *_Source是字符串的来源 size_t_Count是复制字符串的大小 #include <stdio.h> #include <string.h> int main() { char arr[128] { \0 }; …

openGauss学习笔记-163 openGauss 数据库运维-备份与恢复-导入数据-使用COPY FROM STDIN导入数据-简介

文章目录 openGauss学习笔记-163 openGauss 数据库运维-备份与恢复-导入数据-使用COPY FROM STDIN导入数据-简介163.1 关于COPY FROM STDIN导入数据163.2 CopyManager类简介163.2.1 CopyManager的继承关系163.2.2 构造方法163.2.3 常用方法 openGauss学习笔记-163 openGauss 数…

Android动画

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、动画实现3.1 帧动画资源文件中实现…

【PHP入门】1.2-常量与变量

-常量与变量- PHP是一种动态网站开发的脚本语言&#xff0c;动态语言特点是交互性&#xff0c;会有数据的传递&#xff0c;而PHP作为“中间人”&#xff0c;需要进行数据的传递&#xff0c;传递的前提就是PHP能自己存储数据&#xff08;临时存储&#xff09; 1.2.1变量基本概…

字符迷宫(期末考模拟题)

很有趣的一道题 难点主要在于对于 * 的处理 题目描述的是可以多次匹配相同的字母&#xff0c;这就涉及到两个方面&#xff1a; 一是这个匹配的相同的字母如何储存 二是当你’ * ‘位置递归结束的时候&#xff0c;你该什么时候变回‘ * ’号 这里给出我的思路&#xff0c;如…

Web安全漏洞分析—文件包含

在当今数字化时代&#xff0c;随着Web应用程序的广泛应用&#xff0c;网络安全问题愈加凸显。其中&#xff0c;文件包含漏洞作为一种常见但危险的安全隐患&#xff0c;为恶意攻击者提供了可乘之机。在这篇博客中&#xff0c;我们将深入探讨文件包含漏洞的本质、攻击手法以及应对…

MeterSphere files 任意文件读取漏洞复现 (CVE-2023-25573)

0x01 产品简介 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能,全面兼容 JMeter、Selenium 等主流开源标准。 0x02 漏洞概述 MeterSphere /api/jmeter/download/files 路径文件存在文件读取漏洞,攻击者可通过该漏洞读取系统重要…

uniapp使用vue3的ref获取dom元素出现undefined

在我的代码里面&#xff0c;已经通过ref来定义想要获取的dom了&#xff0c;但是最后在页面渲染完之后&#xff0c;打印这个dom发现竟然是undefined&#xff1a; 获取不到dom元素&#xff1a; 最后查资料发现&#xff1a; 小程序中&#xff0c;uniapp的ref要绑定在子组件中才能…

银行数字化转型导师坚鹏:银行数字化转型正在重塑您的工作

您好&#xff0c;我是银行数字化转型导师坚鹏。坚持知行果合一&#xff0c;赋能数字化转型&#xff01;非常荣幸和您分享关于银行数字化转型如何影响老百姓工作的一些思考。 您知道吗&#xff1f;银行数字化转型给您的工作方式带来新变化、新趋势、新潮流啦&#xff01;在这个…

电脑技巧:笔记本电脑保养技巧诀,让你的电脑多用几年

新到手的宝贝笔记本电脑爱不释手&#xff0c;要想它长久的陪伴&#xff0c;平时的维护与保养自然不能少&#xff0c;今天小编给大家分享一下&#xff0c;如何保养和维护笔记本的各个部件。 一、电 池 电池是笔记本实现移动办公的重要部件&#xff0c;电池状况直接影响了电池的…