javaee实验:Spring Boot 整合 Mybatis

目录

  • Mybatis
    • MyBatis 框架简介
    • Mybatis 框架执行流程图
    • 映射器
  • 实验目的
  • 实验内容
  • 实验过程
    • 数据库准备
    • 项目结构
    • 代码实现
  • 实验结果

Mybatis

MyBatis 框架简介

Mybatis 的前身是 Apache 的开源框架 iBatis,与 Hibernate 一样是一个 Java 持久层的框
架。Mybatis 的优势在于灵活,它几乎可以替代 JDBC,同时提供了接口编程。目前 Mybatis
的数据访问层 DAO(Data Access Object)是不需要实现类的,它只需要一个接口和 XML(或
者注解)。Mybatis 提供自动映射,动态 SQL,级联,缓存,注解,代码和 SQL 分离等特性,
使用方便,同时也对 SQL 进行优化。因为其具有封装少,映射多样化,支持存储过程,可
以进行 SQL 优化等特点,使得它取代了 Hibernate 成为 Java 互联网中首选持久层框架。
Mybatis 在完成其功能的过程中,主要完成两件事情:
1)封装 JDBC 操作;
2)利用反射打通 Java 类和 sql 语句之间的关系。
Mybatis 框架的建立是为了解决传统 JDBC 连接数据库中存在的大量编码问题。Mybatis
可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 中的普通对象映射成数
据库中的记录

Mybatis 框架执行流程图

在这里插入图片描述
SqlSession 去执行操作查询数据库映射文件,用途:
1)获取映射器,让映射器通过命名空间和方法名称找到对应的 SQL,发送给数据库,执
行后返回结果。
2)直接通过命名信息去执行 SQL 返回结果。

映射器

MyBatis 框架包括两种类型的 XML 文件,一类是配置文件,即 mybatis-config.xml,另外
一类是映射文件,例如 XXXMapper.xml 等。在 MyBatis 的配置文件 mybatis-config.xml 包含了
节点,这里就是 MyBatis 映射器。

  1. MyBatis 映射器分为三类,如下所示:
    (1)纯 XML 映射器,利用 SqlSession 的各种方法实现增删改查。例如:
    Person p = session.selectOne(“cn.mybatis.mydemo.mapper.PersonMapper.selectPersonById”, 1);
    (2)XML 映射器+接口映射器的混合类型
    先定义接口映射器,然后再定义 xml 映射器,其中 xml 映射器的 namespace 应该对应接
    口映射器的类名。
    (3)注解+接口映射器的混合形式
    此类形式,将原先 xml 里面的 sql 配置信息,变成 Java 注解的形式写到接口映射器,用
    法与上面的例子雷同。
  2. XML 映射器+接口映射器的混合类型
    映射器由 Java 接口和 XML 文件(或注解)共同组成,它的作用:
     定义参数类型
     描述缓冲描述
     SQL 语句定义
     查询结果和 POJO 的映射关系
    实例:先定义一个映射器接口,如下所示
public interface StudentMapper {public Student getStudent(Long id);
}

注意:映射器只是一个接口,而不是一个实现类。初学者可能会产生一个很大的疑问:
接口不是不能运行吗?的确,接口不能直接运行,但是 MyBatis 内部运用了动态代理技术,
生成接口的实现类,从而完成接口的相关功能。只要明白 MyBatis 会为这个接口生成一个
代理对象,代理对象会去处理映射器接口相关的逻辑即可。
然后,用 XML 方式创建映射器,如下所示:

<?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="cn.mybatis.mydemo.mapper.StudentMapper"><select id="getStudent" parameterType="long" resultType="student">SELECT id,name,address FROM Student WHERE id =#{id}</select>
</mapper>

有了这两个文件,就完成了一个映射器的定义。关于 XML 文件内容介绍,如下所示:
(1) 元素中的属性 namespace 所对应的是一个接口的全限定名,于是
MyBatis 上下文就可以通过它找到对应的接口。
3
(2) 元素表明这是一条查询语句,而属性 id 标识了这条 SQL,属性
parameterType=“long” 说明传递给 SQL 的是一个 long 型的参数,而 resultType=“student”
表示返回的是一个 Student 类型的返回值。而 student 是配置文件 mybatis-config.xml 配置
的别名,指代的是 com.mybatis.domain.Student。这条 SQL 中的 #{id} 表示传递进去的参数

实验目的

(1) 掌握 Mybatis 框架的基本构成
(2) 掌握如何在 Spring Boot 中集成 Mybatis 框架
(3) 掌握 Mybatis 框架实现查询等操作方法

实验内容

Spring Boot 集成 Mybatis 框架实现用户信息的增删改查操作

实验过程

数据库准备

在mysql中准备一个有username并且内容不是中文的表
实例如下

CREATE TABLE `t_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_name` varchar(32) NOT NULL COMMENT '用户名称',`note` varchar(256) DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`)
)

录入数据
在这里插入图片描述

项目结构

在这里插入图片描述

代码实现

IUserDao

import java.util.List;/*** @author hongjun* @create 2020-10-28 17:27*/
public interface IUserDao {/** 查询所有用户信息* */List<User> findAll();
}

IUserDaoImpl

import com.example.mybatis1.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;import java.util.List;/*** @author hongjun* @create 2020-11-01 9:49*/
public class IUserDaoImpl  implements IUserDao{private SqlSessionFactory sqlSessionFactory;public IUserDaoImpl(SqlSessionFactory sqlSessionFactory){this.sqlSessionFactory=sqlSessionFactory;}@Overridepublic List<User> findAll() {SqlSession sqlSession= sqlSessionFactory.openSession();List<User> userList=sqlSession.selectList("com.example.mybatis1.dao.IUserDao.findAll");sqlSession.close();return userList;}
}

User

import lombok.Data;import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** @author hongjun* @create 2020-08-24 15:28*  id                   bigint not null,*     dept_id              bigint,*     username             varchar(20),*     password             varchar(50),*     realname             varchar(10),*     sex                  varchar(10),*     telephone            varchar(30),*     email                varchar(200),*     avatar               varchar(300),*     job_title            varchar(30),*     status               tinyint,*     sort                 int,*     del_flag             int comment '0 未删除 1 已删除',*     create_time          datetime,*     create_by            varchar(20),*     update_time          datetime,*/
@Data
public class User {private Integer id;private Integer dept_id;private String username;private String password;private String realname;private String sex;private String telephone;private String email;private String avastar;private String jobTitle;private Integer status;private Integer sort;private Integer delFlag;private Date createTime;private Date updateTime;private String createBy;
}

IUserDao.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mybatis1.dao.IUserDao"><select id="findAll" resultType="com.example.mybatis1.domain.User">select * from user</select>
</mapper>

SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--配置环境--><environments default="mysql"><!--配置mysql环境--><environment id="mysql"><!--配置事务--><transactionManager type="JDBC"></transactionManager><!--配置连接池--><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/stu?serverTimezone=Asia/Shanghai"/><property name="username" value="root"/><property name="password" value="password"/></dataSource></environment></environments><!--配置映射文件的位置--><mappers><!--配置文件方式,每一个映射文件所在的地方--><mapper resource="com/example/mybatis1/dao/IUserDao.xml"></mapper><!--注解方式--><!-- <mapper class="nuc.edu.mybatis.dao.IUserDao"></mapper>--></mappers></configuration>

实验结果

在这里插入图片描述
如图所示,已经查询了出来

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

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

相关文章

使用Python实现的Excel像素画

简介&#xff1a;本项目主要使用python语言&#xff0c;将图片转为 Excel&#xff0c;图片中的每一个像素转化为 Excel 中的每一个单元格。主要使用pillow和xlsxwriter这两个模块。项目使用一个python文件即可。 一&#xff1a;项目功能和流程介绍 项目的主要功能&#xff1a…

Python-封装配置文件

Code [url] baidu http://www.baidu.com[value] send_value 百度[server] ip 220.181.111.188封装的格式可以套用 # 封装,类似函数调用 import configparserclass ReadConfigIni():def __init__(self,filename):self.cf configparser.ConfigParser()self.cf.read(filenam…

Pr项目标准化ProjectNormalizer插件|解决PR剪辑视频在Windows和Mac电脑切换打开pr项目工程文件需要重新链接媒体问题

当我们在 Windows 中打开在 Mac 上剪辑视频的 Premiere Pro 项目文件时&#xff0c;需要重新链接媒体。通常&#xff0c;如果选中“自动重新链接其他人”复选框&#xff0c;媒体将在某种程度上链接在一起。但是&#xff0c;有时这是行不通的&#xff0c;并且可能是一个非常困难…

java获取ip的工具类

java获取ip的工具类 直接上代码 package com.loit.park.common.utils;import org.slf4j.Logger; import org.slf4j.LoggerFactory;import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException;/*** author hanjinqun*…

百面嵌入式专栏(岗位分析)大疆嵌入式工程师【通信/流媒体】

文章目录 一、岗位简介二、解析2.1、网络协议2.2、音视频传输算法2.3、大规模音视频会议或直播系统 三、简历 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2;本篇我们将对大疆嵌入式工程师【通信/流媒体】岗位进行分析 。 一、…

使用微信虚拟支付后端请求API总是支付签名校验失败

请求失败报错 {"errcode":268490003,"errmsg":"支付签名(pay_sig)校验失败 rid: 65713307-300240ee-3bfad3fa"}访问query_order 我的代码&#xff1a; OrderParam orderParam new OrderParam(); orderParam.setEnv(env); orderParam.setOpen…

facebook广告的开户要求

Facebook广告开户的要求包括以下几个方面&#xff1a; 资质合规&#xff1a;包括营业执照及授权资质。营业执照图片必须清晰&#xff0c;没有PS痕迹&#xff0c;有公司盖章&#xff1b;通过企查查、爱企查、天眼查看开户主体是否存在高危风险提示&#xff0c;与开户时填写的基…

视频封面提取:精准截图,如何从指定时长中提取某一帧图片

在视频制作和分享过程中&#xff0c;一个有吸引力的封面或截图往往能吸引更多的观众点击观看。有时候要在特定的时间段内从视频中提取一帧作为封面或截图。如果每个视频都手动提取的话就会耗费很长时间&#xff0c;那么如何智化能批量提取呢&#xff1f;现在一起来看下云炫AI智…

用户案例|Milvus 助力 Credal.AI 实现 GenAI 安全与可控

AIGC 时代&#xff0c;企业流程中是否整合人工智能&#xff08;AI&#xff09;对于的企业竞争力至关重要。然而&#xff0c;随着 AI 不断发展演进&#xff0c;企业也在此过程中面临数据安全管理、访问权限、数据隐私等方面的挑战。 为了更好地解决上述问题&#xff0c;Credal.A…

# 如何在Nginx中配置服务器负载均衡(SLB)

服务器负载均衡&#xff08;SLB&#xff09;是一种技术&#xff0c;用于在多台服务器之间分发网络或应用程序流量。这有助于提高应用程序的可用性和可靠性&#xff0c;同时还可以优化资源的使用。在这篇文章中&#xff0c;我们将详细介绍如何在Nginx中配置SLB。 什么是Nginx&a…

0011Java程序设计-ssm药店管理系统微信小程序

文章目录 摘 要目 录系统实现5.2服务端开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机…

利用eclipse导入外部java工程

利用eclipse导入外部java工程&#xff0c;打开eclipse&#xff0c;依次点击File-Import&#xff0c;…按下图依次执行…

粒子库particles.vue3在项目中的使用

一、particles.vue3是什么 particles.vue3 是一个 Vue 3 的组件库&#xff0c;用于在 Vue 3 项目中创建和管理粒子效果。它基于 tsparticles 引擎&#xff0c;提供了一系列的 Vue 组件&#xff0c;使我们能够轻松地在应用程序中添加动态的粒子效果。   如果您正在开发一个 V…

Redis配置项汇总(chao详细)

基本配置 port 6379 # 监听端口号&#xff0c;默认为6379&#xff0c;如果你设为 0 &#xff0c;redis 将不在 socket 上监听任何客户端连接。 daemonize no #指定redis是否以守护线程的方式启动 databases 16 #创建database的数量&#xff0c;默认为0库 save 900 1 #刷新快照…

【redis笔记】分布式锁

什么需要分布式锁 分布式场景下&#xff0c;原单机的多进程多线程并发控制策略会失效&#xff0c;典型的像海量key分布在redis集群中&#xff0c;那么对这些key的并发修改操作就不像单机那样容易保证有序&#xff08;单机的锁只对单机有效&#xff09;&#xff0c;这时就需要使…

Xilinx FPGA——ISE时序约束“建立时间不满足”问题解决记录

一、现象 最近使用赛灵思的FPGA设计项目时&#xff0c;出现时序约束失效问题。 点进去发现如下&#xff1a; 一个始终约束没有生效&#xff0c;有多处报错。 二、原因 出现这个问题的原因是&#xff0c;建立时间不满足。 时序违例的主要原因是建立时间和保持时间不满足要求&a…

服务器ipv6地址显示“scope global dadfailed tentative noprefixroute”无法连通的问题处理一例

服务器规模启用ipv6地址后&#xff0c;遇到一起案例 &#xff0c;配置的服务ipv6地址显示“scope global dadfailed tentative noprefixroute”&#xff0c;无法连通&#xff0c;现将解决过程记录如下。 一、问题情况 1、ipv6信息检查 某台服务器配置ipv6地址后&#xff0c…

性能优化一条龙

性能优化 根据实际情况做性能优化的流程和分析。 性能优化的话&#xff0c;可以从很多方面&#xff0c;ui优化&#xff0c;组件优化&#xff0c;打包体积优化&#xff0c;页面优化等&#xff0c;但我们要监控这个页面哪些指标需要优化&#xff0c;比如FP&#xff0c;FCP&#x…

vue实现页面之间的el-select同步数据选项

demo案例&#xff1a; 父组件的el-select发生改变&#xff0c;子组件的el-select也可以发生改变 子组件的el-select发生改变&#xff0c;父组件的el-select也可以发生改变 核心就是给el-select组件的v-modle值互传 Index父组件页面 <template lang""><d…

Spark RDD惰性计算的自主优化

原创/朱季谦 RDD&#xff08;弹性分布式数据集&#xff09;中的数据就如final定义一般&#xff0c;只可读而无法修改&#xff0c;若要对RDD进行转换或操作&#xff0c;那就需要创建一个新的RDD来保存结果。故而就需要用到转换和行动的算子。 Spark运行是惰性的&#xff0c;在…