9、MyBatis框架——使用注解开发实现数据库增删改查操作、一级缓存、二级缓存、MyBatis实现分页

news2024/11/28 2:29:31

目录

一、使用注解开发实现数据库增删改查操作

1、搭建项目

2、使用注解开发操作数据库

二、一级缓存

1、一级缓存失效的情况

三、二级缓存

1、手动开启二级缓存cacheEnabled

2、二级缓存机制

四、MyBatis实现分页

1、配置环境

2、startPage()开启分页

3、PageInfo查询分页信息

(1)PageInfo对象

(2) getList()方法

(3)getTotal()方法


一、使用注解开发实现数据库增删改查操作

不通过mapper配置文件,通过注解实现数据库增删改查操作

1、搭建项目

(1)创建数据库表admin

CREATE DATABASE mybatisdatabase;
USE mybatisdatabase;
CREATE TABLE IF NOT EXISTS `admin`(
`uid` INT PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(20),
`upassword` VARCHAR(20) NOT NULL,
`phone` VARCHAR(11) UNIQUE NOT NULL,
`address` VARCHAR(10) NOT NULL
);

INSERT INTO `admin`(`username`,`upassword`,`phone`,`address`) VALUES
('张三','123456','15689609560','安徽合肥包河区'),
('王二','666666','13395581841','安徽合肥蜀山区'),
('李四','456789','18144172517','安徽合肥高新区');

(2)新建module--->java框架Maven工程--->完善工程目录

(3) 在pom.xml中添加需要使用的依赖 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mybatis</groupId>
  <artifactId>mybayis06</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>mybayis06</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.11</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.48</version>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version>
    </dependency>

    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
  </dependencies>
</project>

(4)创建实体类和Mapper接口 

package com.mybatis.entity;

import lombok.Data;

@Data
public class Admin {

  private long uid;
  private String username;
  private String upassword;
  private String phone;
  private String address;


}

(5)在resources目录下新建config文件,存放mybatis全局配置文件和外部数据源  

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!--    引入外部数据源参数-->
    <properties resource="config/jdbc.properties"></properties>

    <settings>
        <!--        开启驼峰映射-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--        开启日志打印-->
        <setting name="logImpl" value="LOG4J"/>
    </settings>

    <!--    给表起别名-->
    <typeAliases>
        <package name="com.mybatis.entity"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name="com.mybatis.mapper"/>
    </mappers>
</configuration>
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatisdatabase
jdbc.username=root
jdbc.password=123456

 (6)在resources目录下新建与Mapper接口层级相同的文件夹存放Mapper映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.mapper.AdminMapper">

</mapper>

(7)在resources目录下添加日志配置文件log4j.properties 

#打印日志的级别:可控制打印信息,哪些打印,哪些不打印
#Console:打印窗口
log4j.rootLogger=DEBUG,Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
#设置打印格式
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
#设置打印信息
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
#打印日志级别:设置打印级别只要不是ERROR级别就不打印
log4j.logger.org.apache=ERROR
log4j.logger.org.mybatis=ERROR
log4j.logger.org.springframework=ERROR
#这个需要
log4j.logger.log4jdbc.debug=ERROR
log4j.logger.com.gk.mapper=ERROR
log4j.logger.jdbc.audit=ERROR
log4j.logger.jdbc.resultset=ERROR
#这个打印SQL语句非常重要
log4j.logger.jdbc.sqlonly=DEBUG
log4j.logger.jdbc.sqltiming=ERROR
log4j.logger.jdbc.connection=FATAL

2、使用注解开发操作数据库

在Mapper接口的方法上直接使用相应的注解来完成对数据库的操作

package com.mybatis.mapper;

import com.mybatis.entity.Admin;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface AdminMapper {

    @Select("select * from admin where uid = #{uid}")
    public Admin selectByUid(int uid);

    @Select("select * from admin")
    public List<Admin> selectAll();

    @Insert("insert into admin(username,upassword,phone,address) values (#{username},#{upassword},#{phone},#{address})")
    public Integer insert(Admin admin);

    @Delete("delete from admin where uid = #{uid}")
    public Integer delete(int uid);

    @Update("update admin set username = #{username},upassword = #{upassword},phone = #{phone},address = #{address} where uid = #{uid}")
    public Integer update(Admin admin);
}
package com.mybatis.mapper;

import com.mybatis.entity.Admin;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import static org.junit.Assert.*;

public class AdminMapperTest {
    SqlSessionFactory sqlSessionFactory = null;

    @Before
    public void init(){
        InputStream resourceAsStream = null;
        try {
            resourceAsStream = Resources.getResourceAsStream("config/mybatis-config.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    }

    @Test
    public void selectByUid() {
        //创建sqlSession会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取AdminMapper接口动态代理对象
        AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);
        //通过接口调用方法
        Admin admin = mapper.selectByUid(1);
        System.out.println("admin = " + admin);
        //关闭资源
        sqlSession.close();
    }

    @Test
    public void selectAll() {
        //创建sqlSession会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取AdminMapper接口动态代理对象
        AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);
        //通过接口调用方法
        List<Admin> adminList = mapper.selectAll();
        for (Admin admin : adminList) {
            System.out.println("admin = " + admin);
        }
        //关闭资源
        sqlSession.close();
    }

    @Test
    public void insert() {
        //创建sqlSession会话,开启事务自动提交
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //获取AdminMapper接口动态代理对象
        AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);
        //创建Admin对象
        Admin admin = new Admin();
        admin.setUsername("老六");
        admin.setUpassword("666666");
        admin.setPhone("19144756263");
        admin.setAddress("老北京");
        //通过接口调用方法
        Integer line = mapper.insert(admin);
        System.out.println("line = " + line);
        //关闭资源
        sqlSession.close();
    }

    @Test
    public void delete() {
        //创建sqlSession会话,开启事务自动提交
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //获取AdminMapper接口动态代理对象
        AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);
        //通过家口调用方法
        Integer line = mapper.delete(2);
        System.out.println("line = " + line);
        //关闭资源
        sqlSession.close();
    }

    @Test
    public void update() {
        //创建sqlSession会话,开启事务自动提交
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //获取AdminMapper接口动态代理对象
        AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);
        //创建Admin对象
        Admin admin = new Admin();
        admin.setUsername("老马");
        admin.setUpassword("666666");
        admin.setPhone("18874151577");
        admin.setAddress("安徽芜湖");
        admin.setUid(3);
        //通过接口调用方法
        Integer line = mapper.update(admin);
        System.out.println("line = " + line);
        //关闭资源
        sqlSession.close();
    }
}

二、一级缓存

MyBatis一级缓存是默认开启的,在一次SqlSession会话下有效。执行两次相同查询时,为了缓解服务器的压力,第二次的查询结果来自MyBatis的缓存,不再将查询指向数据库

package com.mybatis.mapper;

import com.mybatis.entity.Admin;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class SelectTest {
    SqlSessionFactory sqlSessionFactory = null;

    @Before
    public void init(){
        InputStream resourceAsStream = null;
        try {
            resourceAsStream = Resources.getResourceAsStream("config/mybatis-config.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    }

    @Test
    public void selectAll() {
        //创建sqlSession会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取AdminMapper接口动态代理对象
        AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);
        //通过接口调用方法
        //第一次查询
        List<Admin> adminList = mapper.selectAll();
        for (Admin admin : adminList) {
            System.out.println("admin = " + admin);
        }

        //第二次查询
        List<Admin> adminList1 = mapper.selectAll();
        System.out.println("adminList1 = " + adminList1);

        //关闭资源
        sqlSession.close();
    }
}

 在程序中调用了两次selectAll()方法,却只执行了一次SQL语句

1、一级缓存失效的情况

(1)执行的查询条件不同,或者SQL语句不同;

(2)两次相同的SQL语句查询之间,做了增删改的操作

(3)手动提交事务也会清空一级缓存;

(4)手动清空缓存:clearCache() 

三、二级缓存

一级缓存只在一次SqlSession会话有效,为进一步扩大数据共享的范围,缓解数据库的压力,可手动开启MyBatis二级缓存

写入二级缓存的实例对象需要实现序列化接口

1、手动开启二级缓存cacheEnabled

在MyBatis全局配置文件中,设置<setting>标签

cacheEnabled:全局性地开启或关闭所有映射器配置文件中已配置的任何缓存

<!--        全局开启二级缓存-->
        <setting name="cacheEnabled" value="true"/>

在mapper映射文件中添加cache标签 

2、二级缓存机制

(1)手动提交事务,会将一级缓存写入二级缓存;

(2)SqlSession会话对象关闭时,会将一级缓存写入二级缓存。

四、MyBatis实现分页

1、配置环境

(1)在pom.xml中引入pagehelper依赖 

<dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.3.2</version>
    </dependency>

(2)在mybatis全局配置文件中添加plugins标签

 <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>

2、startPage()开启分页

在调用方法查询记录之前,调用PageHelper类中的startPage()方法开启分页:

        pageNum:当前页码;

        pageSize:每页显示的数量

3、PageInfo查询分页信息

(1)PageInfo对象

创建PageInfo对象,PageInfo有参构造的参数为查询获取的集合,直接输出PageInfo对象为分页信息导航

(2) getList()方法

获取当前页面的分页信息 

(3)getTotal()方法

总记录数 

package com.mybatis.mapper;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.mybatis.entity.Admin;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class SelectTest {
    SqlSessionFactory sqlSessionFactory = null;

    @Before
    public void init(){
        InputStream resourceAsStream = null;
        try {
            resourceAsStream = Resources.getResourceAsStream("config/mybatis-config.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    }

    @Test
    public void selectAll() {
        //创建sqlSession会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取AdminMapper接口动态代理对象
        AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);
        //开启分页
            //pageNum:当前页码;pageSize:每页显示数量
        PageHelper.startPage(1,5);
        //通过接口调用方法
        List<Admin> adminList = mapper.selectAll();
        for (Admin admin : adminList) {
            System.out.println("admin = " + admin);
        }

        PageInfo<Admin> adminPageInfo = new PageInfo<>(adminList);
        System.out.println("adminPageInfo = " + adminPageInfo);
        long total = adminPageInfo.getTotal();
        System.out.println("total = " + total);
        List<Admin> list = adminPageInfo.getList();
        System.out.println("list = " + list);
        
        //关闭资源
        sqlSession.close();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

charles+夜神模拟器抓包

1.资料地址: 链接&#xff1a;https://pan.baidu.com/s/1w9qYfFPJcduN4If50ICccw 提取码&#xff1a;a7xa2.安装charles 和夜神模拟器并配置参考地址: https://www.beierblog.com/archives/%E4%BA%B2%E6%B5%8B%E5%AE%8C%E5%85%A8%E5%8F%AF%E8%A1%8Ccharles%E6%8A%93%E5%8C%85%E…

两道链表经典算法题---链表有无环(基础+进阶)

生活就像一盒巧克力&#xff0c;你永远不知道你会得到什么。——《阿甘正传》目前自己粗略的学完数据结构&#xff0c;正在开始刷算法题目。个人觉得算法是一个积累&#xff0c;循序渐进的的过程&#xff0c;需要不断加量&#xff0c;进而达到所谓的质。链表作为数据结构一个重…

全网详解MyBatis-Plus LambdaQueryWrapper的使用说明以及LambdaQueryWrapper和QueryWapper的区别

文章目录1. 文章引言2. 代码演示3. 分析LambdaQueryWrapper3.1 引入LambdaQueryWrapper的原因3.2 LambdaQueryWrapper和QueryWapper的区别4. 重要总结1. 文章引言 今天在公司写代码时&#xff0c;发现同事使用LambdaQueryWrapper来查询数据&#xff0c;而我一直习惯使用QueryW…

没对比没伤害,浙江男不买包包被女友拖拽,深圳男收三个女孩红包

又是一年一度的情人节&#xff0c;虽然这只是一个西方的节日&#xff0c;却被中国的商人们充分利用&#xff0c;也造成了不小的社会矛盾。在今年的情人节里&#xff0c;浙江就发生了一件奇葩的事情&#xff0c;一位女子因不满其男友 不给自己买两万元包包&#xff0c;就在商场里…

Onvif协议如何判断摄像机支持 —— 筑梦之路

有人就问什么是Onvif协议呢&#xff1f; 全称为&#xff1a;Open Network Video Interface Forum.缩写成Onvif。 翻译过来是&#xff1a;开放型网络视频接口论坛&#xff0c;目的是确保不同安防厂商的视频产品能够具有互通性&#xff0c;这样对整体安防行业才是良性发展。 现…

【C语言编译器】01程序-编译器-IDE

目录一、程序的几个基本概念二、什么是编译器三、集成开发环境3.1 IDE简介3.2 windows 下的C语言IDE一、程序的几个基本概念 计算机程序&#xff08;Computer Program&#xff09;&#xff1b;港、台译做电脑程式。计算机程序是一组计算机能识别和执行的指令&#xff0c;运行于…

5 款最好的免费 SSD 数据恢复软件

SSD&#xff08;固态硬盘&#xff09;提供比传统硬盘更快的读/写速度&#xff0c;使启动、软件加载和游戏启动更快。因此&#xff0c;在我们选择存储设备时&#xff0c;它是一个极好的选择。但是&#xff0c;它仍然存在数据丢失的风险。假设您是受害者之一&#xff0c;正在寻找…

SpringBoot的创建和使用

SpringBoot是什么&#xff1f;SpringBoot诞生的目的就是为了简化Spring开发&#xff0c;而相对于Spring&#xff0c;SpringBoot算是一个很大的升级&#xff0c;就如同汽车手动挡变成了自动挡。Spring&#xff1a;SpringBoot&#xff1a;SpringBoot的优点SpringBoot让Spring开发…

[技术选型] ClickHouse和StarRocks的介绍

文章目录1.ClickHouse介绍2.StarRocks介绍1.ClickHouse介绍 ClickHouse是面向联机分析处理&#xff08;OLAP&#xff09;的开源分析引擎。最初由俄罗斯第一搜索引擎Yandex开发&#xff0c;于2016年开源&#xff0c;开发语言为C。由于其优良的查询性能&#xff0c;PB级的数据规…

Linux的ACL(扩展权限)规划:setfacl、getfacl

目录 什么是ACL与如何支持启动ACL ACL设置技巧&#xff1a;getfacl、setfacl getfacl命令用法 setfacl命令用法 最简单的【u&#xff1a;账号&#xff1a;权限】设置 使用默认权限设置目录未来文件的ACL权限继承 什么是ACL与如何支持启动ACL ACL是Access Control List的…

【基础篇】7 # 队列:队列在线程池等有限资源池中的应用

说明 【数据结构与算法之美】专栏学习笔记 什么是队列&#xff1f; 队列是一种操作受限的线性表数据结构&#xff0c;特点是先进先出&#xff0c;最基本的操作有&#xff1a;入队 enqueue()&#xff0c;放一个数据到队列尾部&#xff1b;出队 dequeue()&#xff0c;从队列头…

综合保税区快速发展,卖家抓紧瞄准跨境电商

综合保税区指的是我国设立在内陆地区的海关特殊监管区域&#xff0c;具有报税港区的功能&#xff0c;这是由海关参照有关规定对综合保税区进行管理&#xff0c;执行保税港区的外汇政策和税收&#xff0c;集合众多功能于一身&#xff0c;包括保税区、保税物流区、出口加工区、港…

JNI开发之-CMake方式调用第三方so

CMake方式调用第三方so背景CMake工程配置工程配置配置CMakeLists.txt配置build.gradle调用第三方so中的方法背景 最近一个项目是对接自研团队的个so库&#xff0c;因为之前都是用ndk来编译自己的so库&#xff0c;一直没有问题&#xff0c;但是用到这个自研的的so库一直有问题&…

usbmon+tcpdump+wireshark USB抓包

文章目录usbmon抓包及配合wireshark解析usbmon抓包及配合wireshark解析 usbmon首先编译为内核模块&#xff0c;然后通过modprobe usbmon加载到linux sys文件系统中 rootroot-PC:~# modprobe usbmon​ 而后 linux系统下安装 tcpdump rootroot-PC:~# apt-get install tcpdump​…

如何开发一个好用的公共组件

写在前面 当你对某一个业务场景有自己的理解&#xff0c;想提炼开发了一个很好用的组件&#xff0c;想开放给别的同学使用&#xff0c;或者甚至放在社区给任何一个人使用&#xff0c;你应该会产生以下疑问&#xff1a; 一个标准的组件是怎么样的&#xff0c;在开发过程中有哪…

android-java同步方法和异步方法

接口 Java接口是一系列方法的声明&#xff0c;是一些方法特征的集合&#xff0c;一个接口只有方法的特征没有方法的实现&#xff0c;因此这些方法可以在不同的地方被不同的类实现&#xff0c;而这些实现可以具有不同的行为&#xff08;功能&#xff09;。 两种含义&#xff1a…

中文编程发展不起来,无代码开发能否打个翻身仗

中文编程夹缝里生存众所周知&#xff0c;易语言开创了中文编写程序的先河&#xff0c;最早可追溯到2000年。当时易语言风靡一时&#xff0c;背后积攒了大批的用户&#xff0c;承载着那一代人的青春。也帮助了很多普通的初学者能够在短时间的入门。如今的易语言早已失去了往日的…

大咖说·图书分享|狼书(卷3):Node.js高级技术

Node.js都有哪些需要掌握的高级技术&#xff1f;前端为什么同样需要学习&#xff1f; Node.js未来的发展趋势究竟如何&#xff1f;本期大咖说&#xff0c;Node布道师桑世龙携新作《狼书(卷3)&#xff1a;Node.js高级技术》展开分享。 ● 嘉宾介绍 桑世龙&#xff1a;Node布道…

博客系统 SSM 超强硬核良心推荐之第一弹 - 预备工作

硬核 ! 从 0 到 1 完美实现 SSM 版本的博客系统 , 学会保准不吃亏!一 . SSM 版本相比于 Servlet 版本的亮点二 . 初始化数据库三 . 前端页面3.1 注册页面3.2 登录功能3.3 文章总列表页3.4 自己的文章列表页3.5 文章详情页3.6 编写博客页面大家好 , 这是新的专栏 , 博客系统 SSM…

嵌入式Linux学习经典书籍-学完你就是高手

很多刚入门的朋友一直都有人问我要学习资料&#xff0c;嵌入式实在太杂&#xff0c;网上很多人写的太不负责了&#xff0c;本书单综合了本人以及一些朋友多年的经验整理而成。 本人见识和阅读量有限&#xff0c;本书单可能有不对的地方&#xff0c;欢迎朋友指正&#xff0c;交…