持久层框架(Mybatis)

article/2025/8/13 9:37:53

持久层框架

工具和框架

工具:
JDBC -> DbUtils(QueyRunner) -> JdbcTemplate:
功能简单,SQL语句编写在Java代码中,这是硬编码,高耦合。
框架:
框架是整体解决方案。
如何进行事务控制,如何实现查询缓存。框架考虑的就很多。

Jdbc工具

在这里插入图片描述

Hibernate

全自动全映射Orm(Object Relation Mapping) 框架,旨在消除Sql,只要告诉它javaBean和对应的数据库中的表,就可以完成映射,但是这样也有他自己的问题,不能优化Sql,无法定制Sql
在这里插入图片描述
在这里插入图片描述我们希望sql语句能够交给开发人员来编写,我们还希望Sql不失去灵活性。

Mybatis

Sql与java代码分离,SQL是开发人员控制,只需要掌握好Sql就行了。
Mysql是一个半自动的轻量级的Orm框架

在这里插入图片描述

Mybatis开发步骤

基本开发步骤

1、引入Mybatis开发依赖jar包,和mysql数据库驱动包
2、创建Mybatis核心配置文件
3、创建MybatisSQL文件,并将SQL文件注册到核心配置文件中
4、根据Mybatis核心配置文件创建SqlSessionFactory对象
5、Mysql通过SqlSessionFactory.openSession()来获取SqlSession对象
6、Mysql通过sqlSession.selectOne(“命名空间.唯一标识”, 参数);执行SQL并接收处理数据库的返回值。

Mybatis开发实例

1、基本开发实例
(1)添加maven依赖
(2)编写Mybatis核心配置文件
(3)编写SQL文件
(4)整合SQL文件和核心配置文件
(5)创建SqlSessionFactory对象
(6)获取SqlSession对象,SqlSession.method(namespace.id,param)
(7)释放资源
2、函数式接口
(1)添加maven依赖
(2)编写Mybatis核心配置文件
(3)编写SQL文件
(4)整合SQL文件和核心配置文件
(5)创建SqlSessionFactory对象
(6)获取SqlSession对象,SqlSession.getMapper( 编写Mapper接口,通过全限定类名.方法名 绑定 Mapper.xml文件,param)
(7)释放资源
公共部分:
(1)(2)(3)(4)

基本开发实例

  • 依赖文件
<?xml version="1.0" encoding="UTF-8"?>
<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.dashu</groupId><artifactId>mybatis</artifactId><version>V1.0.1</version><dependencies><!--引入druid数据源--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.8</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.37</version></dependency><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.1</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>compile</scope></dependency></dependencies>
</project>
  • Sql文件
<?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.dashu.mybatis.EmployeeMapper"><!--id:唯一标识resultType:返回值类型#{id}:从传递过来的参数中取出id值。这个参数就是id--><select id="selectEmp" resultType="com.dashu.bean.Employee">select id,last_name lastName,gender,email from tbl_employee where id = #{id}</select>
</mapper>
  • 核心配置文件
<?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="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><!--在类路径下直接写配置文件名--><!--将我们写好的Mapper文件注册到核心配置文件当中--><mapper resource="EmployeeMapper.xml"/></mappers>
</configuration>
package com.dashu.application;import com.dashu.bean.Employee;
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.Test;
import java.io.IOException;
import java.io.InputStream;/*** @Auther: DaShu* @Date: 2021/7/22 21:56* @Description:*/
public class MybatisTest {@Testpublic void testOne() throws IOException {//创建SqlSessionFactory对象,String path = "mybatis-config.xml";//全局配置文件。InputStream resourceAsStream = Resources.getResourceAsStream(path);SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);//获取SqlSession实例,能执行已经映射的SQL语句。SqlSession sqlSession = sessionFactory.openSession();try {//第一个参数:明名空间+idEmployee employee = sqlSession.selectOne("com.dashu.mybatis.EmployeeMapper.selectEmp", 1);System.out.println(employee.toString());//Employee{id=1, lastName='null', email='tom@guigu.com', gender='0'}/*** 为什么last_name没有值?* 因为这个字段和数据库中字段不一致,所以不知道赋值给谁,所以就是null;* 解决办法:*      (1)起别名。* 解决之后:*      (1)Employee{id=1, lastName='tom', email='tom@guigu.com', gender='0'}* */}finally {sqlSession.close();//释放资源}}
}

接口式编程

  • Sql文件
<?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.dashu.mapper.EmployeeMapper"><!--id:唯一标识resultType:返回值类型#{id}:从传递过来的参数中取出id值。这个参数就是id--><select id="getEmpById" resultType="com.dashu.bean.Employee">select id,last_name lastName,gender,email from tbl_employee where id = #{id}</select>
</mapper>
  • 函数式接口
package com.dashu.mapper;import com.dashu.bean.Employee;
import org.apache.ibatis.annotations.Mapper;/*** @Auther: DaShu* @Date: 2021/7/23 18:46* @Description:*/
@Mapper
public interface EmployeeMapper {public Employee getEmpById(Integer id);
}
  • 实现逻辑
    public SqlSessionFactory getSqlSessionFactory() throws IOException {//获取SqlsessionFactory对象;String path = "mybatis-config.xml";//全局配置文件。InputStream resourceAsStream = Resources.getResourceAsStream(path);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);return sqlSessionFactory;}@Testpublic void testTwo() throws IOException {SqlSession sqlSession = null;try {//获取SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();//获取SessionFactory对象sqlSession = sqlSessionFactory.openSession();//获取接口的实现类对象,调用接口的方法。EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);Employee employee = mapper.getEmpById(1);System.out.println(employee);} catch (IOException e) {e.printStackTrace();sqlSession.close();}}
  • 函数式接口总结

1、函数式接口的函数中Mybatis会为接口创建实现类对象,这是一种代理对象,方法的真正的执行者是代理对象。
2、函数式接口的编写方式是使用的最多的,我们使用这个也是最多的。
3、SqlSession代表和数据库的一次会话,使用这个SqlSession的原生Api还是使用getMapper,这个对象都代表和数据库的一次会话,用完必须关闭,里边有一个getConnection()方法
4、SqlSession和Connection对象一样,都是非线程安全的,非线程安全的话不能把他编写成成员变量,这样的话多线程条件下,不能公用,每次使用都应该获取新的对象。
5、Mapper接口没有实现类,Mybatis会为这个接口生成一个代理对象,这个sqlSession.getMapper(Employee.class)返回的是接口的代理对象,这个代理对象一定是把xml文件和接口绑定起来了的对象。
6、两个重要的配置文件,Mybatis全局配置文件,包含数据库连接池信息,事务管理器信息等系统运行环境,SQL映射文件,这个是必须要有的,里边有每一个SQL语句映射信息,在这个文件中每一个SQL语句,唯一标识和返回的结果和参数都会在SQL语句 中有体现,Mybatis就是通过这类映射文件将SQL抽取出来访问数据库。

Mybatis核心配置文件

引入dtd约束

1、Mybatis配置文件在文档声明处,引入了一个dtd约束文件,他就是用来约束Mybatis核心配置文件中的标签语法规则的。
2、有了约束文件之后,就有提示了,联网的时候文件可以自动导入,没有网络的时候需要和文件下载绑定一下。全局配置文件有一个dtd,sql文件有一个dtd。

Properties标签

1、Properties标签用来引入外部properties类型配置文件的配置。
2、resource:引入类路径下的配置文件,源码包是类路径的开始,就是java包下,编译之后就是classes目录下,我们的Sp项目也是如此。
3、url:引入互联网或者磁盘中的配置文件
4、引入properteis文件之后,通过${key}就可以获取相应的值。
5、Spring整合Mybatis之后,这个连接池配置操作直接交给了Spring来做,非常方便,所有这个标签基本不用了。


http://chatgpt.dhexx.cn/article/yCbQcdEI.shtml

相关文章

【Java必学框架】一文搞懂Java持久层框架Mybatis,由浅入深

文章目录 一.简介二.快速入门三.映射文件配置详解1.基本增删改查标签、属性2.动态sql2.1\标签2.2\标签 四.核心配置文件1.核心配置文件标签层级关系及作用2.配置示例3.事务管理器4.数据源5.Mapper标签6.自定义类型转换器7.插件机制 五.相应API1.工具对象2.openSession方法3.Sql…

python怎么输入根号

今天我们来说一说Python中如何实现对一个数字开平方。有三种解决办法、 下面我们分别来演示Python中数字开平方的三种方法 第一种方法&#xff1a;使用math模块&#xff0c;使用之前需要先调用,如下 第二种方法&#xff1a;使用内置函数pow(),如下 第三种方法&#xff1a;使用数…

Python-开根号的几种方式

文章目录 前言方法一方法二方法三 前言 使用Python中的自带库math、自带函数pow和自带库cmath来对数字进行开根号运算 方法一 使用&#xff1a;math.sqrt(数字) import math n int(input(数字:)) x math.sqrt(n) print(x) print(type(x)) #开根号后的类型为float方法二 使用&…

chatgpt赋能python:Python开根号:从入门到精通

Python开根号&#xff1a; 从入门到精通 Python是一种通用的高级编程语言&#xff0c;被广泛应用于数据、人工智能、网络应用、图像处理等多个领域。其中&#xff0c;数学计算是使用Python的常见场景之一&#xff0c;而在数学计算中&#xff0c;常常需要对数值进行开根号运算。…

求解任意正整数n开根号的值,不用函数求解√2(根号二),二分法求根号,定义函数fun()求根号,二分法查找

求解任意正整数n开根号的值 提示&#xff1a;理解二分法、函数调用 定义函数double fun(int n)实现 #include<bits/stdc.h> //万能函数头文件 using namespace std; double fun(int n); //定义一个求解根号的函数声明 int main() { int n;cout<<"输入想…

C语言根号作用,c语言中如何开根号运算

用math.h里封装好的函数&#xff0c;具体如下&#xff1a; 求平方根&#xff1a;double sqrt(double x) 例&#xff1a; #include #include int main(void) { double x 4.0, result; result sqrt(x); printf("The square root of %lf is %lf ", x, result); retu…

JavaScript中的乘方和开根号的使用方法

1、乘方 <script>var ikun Math.pow(4,3);console.log(ikun); </script> 2、开根号 <script>var ikun Math.sqrt(64);console.log(ikun); </script> 我们在开根号后还可以再次开根号 <script>var ikun Math.sqrt( Math.sqrt(81));console.…

python三种方法开根号(穷举法、二分法、牛顿拉夫逊法)

文章目录 方法一&#xff1a;穷举法方法二&#xff1a;二分法方法三&#xff1a;牛顿-拉夫逊算法总结 方法一&#xff1a;穷举法 positive_num int(input("输入一个正数:")) #无穷逼近法 answer0 #正数的根号结果 numGuess0 #循环次数 epsilon0.01 …

计算机开根号原理,根号的原理_怎么开的根号,有原理吗

怎么开的根号,有原理吗 JPG&#xff0c;526x296&#xff0c;128KB&#xff0c;444_250 怎么在数轴上画出根号3,求详细过程和原理 JPG&#xff0c;600x293&#xff0c;231KB&#xff0c;514_250 求根号 X 2 2 9 根号 X 3 2 4 的最小值 JPG&#xff0c;598x800&#xff0c;128KB&…

python中根号怎么输入_python中根号怎么表示

sqrt() 方法返回数字x的平方根。 以下是 sqrt() 方法的语法:&#xff08;推荐学习&#xff1a;Python视频教程&#xff09;import math math.sqrt( x ) 注意&#xff1a;sqrt()是不能直接访问的&#xff0c;需要导入 math 模块&#xff0c;通过静态对象调用该方法。 参数 x…

java 开三次根号_java里实现开根号

java里实现开根号 [2021-02-03 08:57:13] 简介: php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐:《PHP视频教 excel中开根号的函数…

开根号的笔算算法图解_一个数的开根号怎么计算

一个数的开根号怎么计算2020-11-08 15:46:47文/钟诗贺 带根号的式子可以直接进行开平方的运算。一些特殊的根号运算有;√2≈1.414、1/2-√3≈0.5-1.732≈-1.232、2√5≈22.236≈4.236、√7-√6≈2.646-2.449≈0.197。 开平方的笔算方法 1&#xff0e;将被开方数的整数部分从个位…

chatgpt赋能python:如何在Python中表示开根号?

如何在Python中表示开根号&#xff1f; 在Python中&#xff0c;表示开根号有多种方法。本文将介绍其中最常用的三种方法&#xff0c;并对它们的优缺点进行比较&#xff0c;以便读者意识到哪种方法最适合他们的需求。 方法一&#xff1a;使用math模块的sqrt函数 在Python中&a…

python中根号怎么表示_根号python_python根号_python 根号 - 云+社区 - 腾讯云

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 语法以下是sqrt()方法的语法 -import mathmath.sqrt( x )python注意 -此函数不可直接访问,需要导入math模块,然后需要使用math静态对象调用此函数。 2,开n次…

python开根_python如何开根号

平方根&#xff0c;又叫二次方根&#xff0c;表示为〔√&#xffe3;〕&#xff0c;如&#xff1a;数学语言为&#xff1a;√&#xffe3;164。语言描述为&#xff1a;根号下164。python学习网&#xff0c;大量的免费python基础教程&#xff0c;欢迎在线学习&#xff01; 以下…

python开根号_python 开根号

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 语法以下是sqrt()方法的语法 -import mathmath.sqrt( x )python注意 -此函数不可直接访问,需要导入math模块,然后需要使用math静态对象调用此函数。 2,开n次…

MySQL这一章就够了(一)

前言&#xff1a;呕心沥血5个月淦出本文&#xff0c;整理所有MySQL知识。我愿称之为地表最强MySQL。 MySql笔记 MySQL是关系型数据库&#xff0c;基于SQL查询的开源跨平台数据库管理系统。它最初是由瑞典MySQL AB公司开发的。现在它是Oracle Corporation的分支机构。 Mysql特点…

dolphinscheduler 海豚调度历史版本梳理

海豚调度历史版本梳理 概述大版本架构演进趋势版本时间轴记录历史版本3.1.8-release (20230802)3.1.7-release (20230522)3.1.6-release (20230510)3.1.5-release (20230403)3.1.4-release (20230221)3.1.3-release (20230105)3.1.2-release (20221207)3.1.1-release (20221109…

kali视频学习笔记

DAY1 系统安装 1. 用u盘烧录KALI镜像&#xff0c;不含live开头&#xff0c;含amd64&#xff0c;&#xff14;&#xff27; 2. 用u盘启动安装图形界面&#xff0c;选简单中文-汉语&#xff0c;默认KFCE&#xff0c;全工具 3. 改密码&#xff0c;sudo passwd root &#xff0c;原…

NodeJs 面试题 2023

&#xff08;要知道对好事的称颂过于夸大&#xff0c;也会招来人们的反感轻蔑和嫉妒。——培根&#xff09; ㅤㅤㅤ ㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ NodeJs相关 什么是NodeJs Nodejs是一个基于V8虚拟机的JavaScript的运行时平台&#xff0c;使用了事件驱动和非阻塞I…