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;本篇我们将对大疆嵌入式工程师【通信/流媒体】岗位进行分析 。 一、…

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

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

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

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

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

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

Spark RDD惰性计算的自主优化

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

【Python】Python仓储管理系统(源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

uni-app 微信小程序之好看的ui登录页面(二)

文章目录 1. 页面效果2. 页面样式代码 更多登录ui页面 uni-app 微信小程序之好看的ui登录页面&#xff08;一&#xff09; uni-app 微信小程序之好看的ui登录页面&#xff08;二&#xff09; uni-app 微信小程序之好看的ui登录页面&#xff08;三&#xff09; uni-app 微信小程…

go的两大测试方法- 官网推荐

go的两大测试方法- 官网推荐 go的两大测试方法- 官网推荐常见的不正规测试方法main方法个例测试验证 - 不正规1. 提供一个函数&#xff1a;Reverse(input string)进行测试2. 直接在函数下创建main函数下进行个例测试3. 测试发现&#xff0c;Reverse方法不支持某些汉字&#xff…

【SQL开发实战技巧】系列(四十九):Oracle12C常用新特性☞表分区部分索引(Partial Indexes)

系列文章目录 【SQL开发实战技巧】系列&#xff08;一&#xff09;:关于SQL不得不说的那些事 【SQL开发实战技巧】系列&#xff08;二&#xff09;&#xff1a;简单单表查询 【SQL开发实战技巧】系列&#xff08;三&#xff09;&#xff1a;SQL排序的那些事 【SQL开发实战技巧…

数据分析基础之《matplotlib(4)—柱状图》

一、柱状图绘制 1、柱状图要素 有类别 2、需求&#xff1a;对比每部电影的票房收入 电影数据如下图所示&#xff1a; 3、matplotlib.pyplot.bar(x, height, width0.8, bottomNone, *, aligncenter, dataNone, **kwargs) 说明&#xff1a; x&#xff1a;有几个类别 height&am…

玩转Sass:掌握数据类型!

当我们在进行前端开发的时候&#xff0c;有时候需要使用一些不同的数据类型来处理样式&#xff0c;Sass 提供的这些数据类型可以帮助我们更高效地进行样式开发&#xff0c;本篇文章将为您详细介绍 Sass 中的数据类型。 布尔类型 在 Sass 中&#xff0c;布尔数据类型可以表示逻…

每日一练:插入排序

1. 概念及原理 插入排序是一种简单直观的排序算法&#xff0c;其基本思想是将一个元素插入到已经排序好的部分&#xff0c;然后不断地重复这个过程&#xff0c;直到整个数组有序。下面是插入排序的算法原理&#xff1a; 初始状态&#xff1a; 数组被分为已排序和未排序两个部分…

Qt::UniqueConnection和lambda一块用无效

如果槽函数是lambda。 那么用了Qt::UniqueConnection也会出现槽函数被多次调用的问题。 原因&#xff1a; 参考官方文档&#xff1a; QObject Class | Qt Core 5.15.16https://doc.qt.io/qt-5/qobject.html#connect