Mybatis框架的集成使用

news2024/10/6 7:00:30

1_框架概述

框架是一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架时直接调用封装好的api可以省去很多代码编写,从而提高工作效率和开发速度,框架是一种经过校验、具有一定功能的半成品软件.

经过校验:指框架本身经过测试,且框架自身所具有的功能已经实现具有一定功能:指框架可以完成特定的功能,不同的框架功能不同

半成品软件:指框架自身是一个软件,但是该软件无法直接运行,需要配合其他的程序才可以完成指定的工作.

框架的工作模式:

开发工程师建立在框架的基础之上完成开发部分功能 加 框架自身完成部分功能组成一个完整的产品

2_MyBatis 基础

2.1_MyBatis的概述

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java  POJOPlain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

mybatis框架架构图:

我们把Mybatis的功能架构分为三层:

  1. API接口层:提供给外部使用的接口API开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
  2. 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
  3. 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

2.2_环境准备

需求: 向用户表中添加一条数据

  1. 添加项目需要的 jar
  2. lombok-1.16.6.jar(新的IDEA不用添加)

Lombok自动生成 getter/setter/toString 等方法使用的前提是已经在 idea 中安装了 lombok 插件

  1. mysql-connector-java-5.1.26-bin.jar

MySQL 数据库的 JDBC 驱动包,访问 MySQL 必须导入备 jar

  1. mybatis-3.4.5.jar MyBatis 框架的核心 jar
  2. 创建一张用户表:user

CREATE TABLE `user` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL,

`age` int(255) DEFAULT NULL,

`salary` decimal(10,0) DEFAULT NULL

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

  1. 根据表结构创建实体类

@Getter@Setter@ToString

@NoArgsConstructor@AllArgsConstructor

public class User {

private Long id;

private String name;

private Integer age;

private BigDecimal salary;

private Date hiredate;

}

  1. mybatis主配置文件: mybatis-config.xml
  2. 在项目的resources(source folder)下创建mybatis-config.xml配置文件
  3. 拷贝xml的约束

<?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">

添加环境配置(事务管理器 / 连接池 / 映射文件)

<?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>

<environments default="dev">

<environment id="dev">

<!--

MyBatis 内置的事务管理器

JDBC:org.apache.ibatis.transaction.jdbc.JdbcTransaction的别名

-->

<transactionManager type="JDBC"/>

<!--

MyBatis 内置的连接池

POOLED:org.apache.ibatis.datasource.pooled.PooledDataSource的别

-->

<dataSource type="POOLED">

<!--

driver:这是POOLED连接池对象的驱动类的属性名,

Druid连接池对象的驱动类属性名是driverClassName

-->

<property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mybatis"/

<property name="username" value="root"/>

<property name="password" value="admin"/>

</dataSource>

</environment>

</environments>

<mappers>

<mapper resource="cn/UserMapper.xml"/> </mappers>

</configuration>

  1. mapper 映射文件: UserMapper.xml

mybatis,访问数据库的SQL语句是编写在mapper配置文件中的,程序员按照这个文件约定的格式进行配置即可

中创建配置文件: UserMapper.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">

在配置文件中添加 SQL 语句

<!--

一个项目可以操作多张表

每张表都需要一个mapper配置文件来编写SQL语句

每条SQL语句都需要有一个唯一的标识

这个唯一的标识由 namespace + sqlid 组成

使用下面的namespace+sqlid就得到了保存用户信息的唯一标识:

insert 接下来,我们就可以使用上面的标识找到这条SQL语句了

-->

<mapper namespace="cn.UserMapper"> <insert id="insert">

insert into user(name,age,salary,hiredate)

values(#{name}, #{age}, #{salary}, #{hiredate})

</insert>

</mapper>

注意: 一定记得在 mybatis-config.xml 配置文件中关联映射文件

<mappers>

<!--

这里是mapper文件的路径,所以使用/分割

-->

<mapper resource="cn/UserMapper.xml"/> </mappers>

2.3_DAO层开发

  1. dao接口

创建 dao 接口: IUserDAO.java

public interface IUserDAO {

/**

  • user表中插入一条数据
  • @param u 要插入的数据

 */

void insert(User u);

}

  1. dao 接口实现类

创建 dao 的实现类: UserDAOImpl.java

按以下 API 实现数据的保存操作:

  1. SqlSessionFactory : 对连接池(DataSource)的封装

SqlSession openSession() : 获取SqlSession对象

  1. SqlSession,对连接(Connection)的封装

int insert(String statementid, Object param);

statementid: mapper配置文件中的namespace+sqlid组成 void commit(): 提交事务

void close() : 释放资源

  1. 调用 SqlSession 中的 insert 方法,执行指定的 SQL

public class UserDAOImpl implements IUserDAO { public void insert(User u) {

try {

InputStream in = Resources.getResourceAsStream("mybatis-config.xml");

SqlSessionFactory fac = new

SqlSessionFactoryBuilder().build(in);

SqlSession session = fac.openSession();

session.insert("UserMapper.insert",

);

session.commit();

session.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

在测试类中测试 insert 方法

public class UserDAOTest {

private IUserDAO dao = new UserDAOImpl();

@Test

public void testInsert() {

User u = new User(null,"张三",20,new BigDecimal(20000), new Date()); dao.insert(u);

}

}

2.4_MyBatis 执行流程

  • 加载主配置文件(mybatis-config.xml)到内存中,将数据封装成对象Configuration/Environment/TransactionManager/DataSource
  • 通过操作拿到访问数据库的基本信息,根据这些数据创建 SqlSessionFactory 对象
  •  SqlSessionFactory 对象中获取到 SqlSession 对象,然后执行SQL
  • INSERT INTO user(name,age,salary,hiredate) VALUES(#{name},#{age},#{salary},#{hiredate})

被翻译成

INSERT INTO user(name,age,salary,hiredate)

VALUES(?, ?, ?, ?)

  1. 使用 PreparedStatement 来执行指定的SQL

从传递进来的 User 对象中依次获取到 name/age/salary/hiredate这些属性的值这里需要使用到内省机制来访问对象中的属性

:

在加载完当前映射文件之后,会将SQL中的 #{} OGNL表达式翻译成对应的占位符?,

执行上面的SQL,需要将数据设置给当前的语句对象 ps.setObect(1, 从参数中获取到name属性的值); ps.setObect(2, 从参数中获取到age属性的值); ps.setObect(3, 从参数中获取到salary属性的值); ps.setObect(4, 从参数中获取到hiredate属性的值);

操作步骤回顾:

  1. 创建项目,导入jar
  2. 创建表和模型

3 创建 mybatis-config.xml 配置环境

4 创建 UserMapper.xml 文件 存在 mapper包中,配置sql语句

5 创建 dao 接口和实现类

6 启动 MyBatis 去执行插入操作

  1. 测试插入操作

3_获取插入数据生成的主键

在开发中,如果需要获取到数据库中自动生成的主键,那么使用 MyBatis 应该如何实现呢?

<insert id="insert" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> insert into user(name,age,salary,hiredate)

values(#{name}, #{age}, #{salary}, #{hiredate})

</insert>

useGeneratedKeys: 是否要获取自动生成的主键

keyColumn: 表中的主键列

keyProperties: 主键列对应的属性

表示从获取哪个列的值封装到哪个属性中

通过上面的配置,在执行了保存操作后,mybatis 会自动将主键值封装到传递进来的 User 对象的 id 属性

所以,此时的 User 对象的 id 属性就有值了(在保存之前是没有的)

parameterType : 参数类型,可以不用写,MyBatis自己通过用户传入的对象去推导.

4_更新和删除操作

和保存操作的开发流程一致,在完成了保存操作之后,更新和删除操作一样可以实现 dao 中更新的实现

@Overrid

public void update(User u) {

try {

InputStream in = Resources.getResourceAsStream("mybatis-config.xml");

SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(in);

SqlSession session = fac.openSession();

session.update("UserMapper.update", u);

session.commit();

session.close();

} catch (Exception e) { e.printStackTrace();

}

}

更新在 mapper 中的 SQL

<update id="insert">

update user

set name=#{name}, age = #{age}, salary = #{salary}, hiredate = #{hiredate} where

id = #{id}

</insert>

dao 中删除的实现

@Override

public void delete(long id) {

try {

InputStream in = Resources.getResourceAsStream("mybatis-config.xml");

SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(in);

SqlSession session = fac.openSession();

session.delete("UserMapper.delete", id);

session.commit();

session.close();

} catch (Exception e) { e.printStackTrace();

}

}

删除在 mapper 中的 SQL

<delete id="delete">

delete from user where id = #{id}

</delete>

注意:

1 当传入的只有一个普通类型(一个值)的时候#{} 中的名称可以随便写,但是建议见名知义

2 不管使用的是 insert 方法还是 delete 方法,底层调用的还是update方法,通过sql语句来区别dml操作

5_查询操作

根据 id 查询用户

dao 实现

@Override

public User selectOne(long id) {

User u = null;

try {

InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(in); SqlSession session = fac.openSession();

u = session.selectOne("cn.UserMapper.selectOne",

id);

session.close();

} catch (Exception e) {

e.printStackTrace();

}

return u;

}

mapper 中的 SQL

<select id="selectOne" resultType="cn.domain.User"> select * from user where id = #{id}

</select>

 DML 不一样的地方,查询操作需要指定把查询的结果集数据封装成什么类型的对象,resultType 属性就是这个作用

思考: resultType 可以不配置吗? 不可以,需要告诉 MyBatis 把一行数据封装成什么类型的对象

目前: 需要模型的属性和表的列需要一一匹配,如果不匹配,无法获取到数据.

查询所有用户

dao 实现

@Override

public List<User> selectList() {

List<User> users = null;

try {

InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(in); SqlSession session = fac.openSession(); users =

session.selectList("cn.UserMapper.selectAll");

session.close();

} catch (Exception e) { e.printStackTrace();

}

return users;

}

mapper 中的 SQL

<select id="selectAll" resultType="cn.domain.User"> select * from user

</select>

6_细节处理

类型别名

在查询操作中, 我们需要使用result属性指定数据封装的类型, 这里的值类型的全限定名, 每次都编写的话比较麻烦,为了简化这里的配置,我们可以在主配置文件(mybatis-config.xml)中对指定的类型做别名的配置

<!-- 为指定包中的类来生成别名,默认是类的简单名称 -->

<typeAliases>

<package name="cn.domain"/> </typeAliases>

如此,我们在查询的SQL, 使用类的全限定名和使用别名是等价的修改前:

<select id="selectAll" resultType="cn.User"> select * from user

</select>

修改后:

<select id="selectAll" resultType="User">

select * from user

</select>

日志管理

在持久层的开发过程中,我们程序员需要随时观察SQL的执行情况,如果sql有问题,我们能够及时发现所以,如果能够在控制台中将我们执行的SQL全部打印出来,那么就可以方便的观察SQL的相关问题

配置日志文件监控MyBatis的运行.

  1. 将日志相关的jar包添加到项目中

​​​​​​​

2. resources(source folder)中创建配置文件, log4j.properties ,添加下面的内容(直接拷贝)

  1. Global logging configuration log4j.rootLogger=ERROR, stdout
  2. 配置要打印日志的包 log4j.loggr..mybatis=TRACE
  3. Console output...

log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

将配置中的 包路径修改为项目中对应的路径,我们这里可以使用: cn.mybatis

到此,我们每执行一条 SQL, 都会在控制台中打印出来,这非常有助于我们对 SQL 的分析,特别是 SQL 不正确的时候

7_抽取 MyBatisUtil 工具类

 JDBC 中的连接池使用一样,在整个项目中,我们只需要一个SqlSessionFactory对象,而不需要每次都创建一个新的,

所以,我们将SqlSessionFactory的创建和SqlSession对象的获取都抽取到工具类中: MyBatisUtil

注意:

加载配置文件没有填写:

8_抽取db.properties

在主配置文件中配置的内容较多, 其中包括我们修改频率较高的数据库连接信息(driver/url/username/password),我们可以在修改这些信息的过程中误改或者误删到其他的配置,为了解决这个问题,我们仍然是将这些信息配置到db.propertie配置文件中,然后再合并到主配置文件即可,如下:

db.properties

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/javaweb

username=root

password=admin

mybatis-cofnig.xml

<configuration>

<!-- 关联db.properties:为了把连接数据库的信息单独放到一个配置文件 --> <properties resource="db.properties" />

<!-- 为指定包中的类来生成别名 -->

<typeAliases>

<package name="cn.domain"/> </typeAliases>

<!-- 连接数据库的环境

default:指定使用哪一个环境的配置

-->

<environments default="dev">

<environment id="dev">

<transactionManager type="JDBC"/>

<dataSource type="POOLED">

<!--

使用${key}取出db.properties中配置的信息

keydb.properties文件中的可以一直即可

-->

<property name="driver" value="${driverClassName}"/> <property name="url" value="${url}"/>

<property name="username" value="${username}"/> <property name="password" value="${password}"/>

</dataSource>

</environment>

</environments>

<!-- 关联映射文件 -->

<mappers>

<mapper resource="cn\mapper\ProductMapper.xml"/> </mappers>

</configuration>

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

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

相关文章

Python酷库之旅-第三方库Pandas(002)

目录 一、用法精讲 1、pandas.read_pickle函数 1-1、语法 1-2、参数 1-3、功能 1-4、返回值 1-5、说明 1-6、用法 1-6-1、代码示例 1-6-2、结果输出 2、pandas.DataFrame.to_pickle方法 2-1、语法 2-2、参数 2-3、功能 2-4、返回值 2-5、说明 2-5-1、文件路径…

MacOS下更新curl

苹果自带的curl不支持Https&#xff0c;我们可以通过curl -V看到如下结果 curl 7.72.0 (x86_64-apple-darwin18.6.0) libcurl/7.72.0 zlib/1.2.12 libidn2/2.3.7 librtmp/2.3 Release-Date: 2020-08-19 Protocols: dict file ftp gopher http imap ldap ldaps pop3 rtmp rtsp …

python 发布应用程序包

文章目录 发布python包toml配置文件构建发布python包 官方文档参考 将自己的python项目发布成源码包或者wheel二进制包,供其他开发者使用。 方式: 使用py工具; distutils,该工具的使用已过时;setuptools,常用方式;wheel,在setuptools的基础上添加了 bdist_wheel, …

量产工具一一UI系统(四)

前言 前面我们实现了显示系统框架&#xff0c;输入系统框架和文字系统框架&#xff0c;链接&#xff1a; 量产工具一一显示系统&#xff08;一&#xff09;-CSDN博客量产工具一一输入系统&#xff08;二&#xff09;-CSDN博客量产工具一一文字系统&#xff08;三&#xff09;…

不到 5 元的随身 WiFi 刷 Debian 系统 做轻量家庭服务器

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 前不久在某宝均价 5 元买了两个随身 WiFi,拆机看了看丝印都是 MSM8916 ,正好是红米 2 同款的骁龙 410 的芯片,可以刷个 Debian 当作家庭服务器来跑一些轻量的服务。 不过手气不是很好,两个都是 512M + 4G 的配置…

快手矩阵系统源码:构建高效短视频生态的引擎

在短视频内容创作和管理领域&#xff0c;快手矩阵系统源码提供了一套全面的解决方案&#xff0c;帮助用户和企业高效地构建和管理自己的短视频平台。本文将深入探讨快手矩阵系统源码的核心功能&#xff0c;以及它如何助力用户在短视频领域取得成功。 快手矩阵系统源码概述 快…

【图书推荐】《HTML5+CSS3 Web前端开发与实例教程(微课视频版)》

本书用来干什么 详解HTML5、CSS3、Flex布局、Grid布局、AI技巧&#xff0c;通过两个网站设计案例提升Web前端开发技能&#xff0c;为读者深入学习Web前端开发打下牢固的基础。 配套资源非常齐全&#xff0c;可以当Web前端基础课的教材。 内容简介 本书秉承“思政引领&#…

后台管理系统日志管理模块的实现

一、日志管理系统 1.1目标效果图 1.2创建日志表&#xff0c;和对应的实体类 Data public class SysLog implements Serializable {private static final long serialVersionUID 1123526L;private Integer id;private String module;private String content;private Integer c…

Android C++系列:JNI中的Handler--ALooper

1. Android Handler回顾 在Android中,UI线程是一个很重要的概念。我们在日常开发中对UI的更新和一些系统行为,都必须在UI线程(主线程)中进行调用。我们在子线程更新UI时最常用的手段就是Handler,Handler的主要原理: 主要是有一个Looper不停的从队列读消息,子线程通过持有…

Redis-Redis可视化工具Redis Insight下载及安装

下载 1、博主已经上传资源&#xff0c;点此下载 2、点此进入官方下载 2.1 点击Installing Redis Insight 2.2 点击Install on desktop 2.3 选择Install on desktop&#xff0c;点击Redis Insight is available for download for free from this web site从网站下载 2.4 下载…

Anaconda+Pycharm两个软件从头到尾下载流程

前言&#xff1a; 1、使用教程前&#xff0c;请将电脑上的所有的Python卸载掉。再下载Anaconda&#xff0c;Anaconda这个软件里面就含有python。 彻底删除python方法&#xff1a; 1、计算机——属性——高级系统设置——环境变量 2、查看电脑用户自己设计的环境变量&#x…

FileZilla的安装和使用(快速上手版)

下载 登陆官网下载下载 - FileZilla中文网 服务端 我们选择一个中文安装最新版本下载 客户端 我们选择绿色免安装版进行下载 安装 安装服务端 双击运行下载好的服务端安装包 点击 我接受 点击 下一步 设置好安装路径&#xff0c;点击 下一步 这里默认即可&#xff0c;点击…

昇思25天学习打卡营第16天|文本解码原理——以MindNLP为例

在大模型中&#xff0c;文本解码通常是指在自然语言处理&#xff08;NLP&#xff09;任务中使用的大型神经网络模型&#xff08;如Transformer架构的模型&#xff09;将编码后的文本数据转换回可读的原始文本的过程。这些模型在处理自然语言时&#xff0c;首先将输入文本&#…

Understanding Zero Knowledge Proofs (ZKP)

Bilingual Tutorial: Understanding Zero Knowledge Proofs (ZKP) 双语教程&#xff1a;理解零知识证明&#xff08;ZKP&#xff09; Introduction 介绍 English: Zero Knowledge Proofs (ZKP) are a fascinating concept in cryptography where one party (the prover) can…

java项目自定义打印日志,打印请求方式,参数用时等

1.相关依赖 <!-- 私人工具包 --><dependency><groupId>cn.changeforyou</groupId><artifactId>location</artifactId><version>1.13-SNAPSHOT</version></dependency><!-- hutool工具依赖 --><dependency>…

六大Pixel新AI功能提升使用体验

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

探索如何赋予对象迭代魔法,轻松实现非传统解构赋值的艺术

前言 今天下午在网上冲浪过程中看到这样一个问题 面试题&#xff1a;如何让 var [a, b] {a: 1, b: 2} 解构赋值成功&#xff1f; 据说是某大厂面试题&#xff0c;于是我学习了一下这个问题&#xff0c;写下这篇文章记录一下。 学习过程 要想解决这个问题首先要知道什么是解…

nginx安装升级修复HTTP头信息泄露Nginx版本信息漏洞(并保持https配置)

文章目录 1. 准备工作2. 修改web服务器所使用的nginx的名称和版本信息2.1 修改以下三个文件&#xff1a;(1) src/core目录下的nginx.h文件(2) src/http目录下的ngx_http_header_filter_module.c文件(3) src/http目录下的ngx_http_special_response.c文件 2.2 重新编译nginx2.3 …

Spring框架的学习前言

1.注意事项 1.在接下来的学习中我们会将jdk的版本升级到17。 2.引入maven仓库用来存储依赖 3.在后面的javaSpring框架中要第一个项目的创建要选javaweb和lombook这两个依赖 2.Maven的主要功能 &#xff08;1&#xff09;maven的主要功能是引入依赖和管理依赖&#xff0c;在…

第7章:Electron文件系统操作(2)

7.2 文件对话框 Electron 提供了 dialog 模块用于显示文件打开和保存对话框。 7.2.1 显示文件打开对话框 主进程代码&#xff1a; const { app, BrowserWindow, ipcMain, dialog } require(electron); const path require(path);let mainWindow;const createMainWindow …