MyBatis及相关文件配置

MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。以下是对MyBatis的详细讲解:

一、MyBatis的起源与发展

  • MyBatis最初是Apache的一个开源项目iBATIS,2010年迁移到Google Code并改名为MyBatis,2013年11月又迁移到GitHub。
  • MyBatis的最新版本是3.5.13,发布于2023年3月11日。

二、MyBatis的核心特性

  • 定制化SQL:MyBatis允许开发人员直接编写SQL语句,可以更灵活地控制SQL语句的编写和执行过程,适用于复杂查询需求。
  • 存储过程支持:MyBatis支持存储过程的调用,使得数据库操作更加灵活和高效。
  • 高级映射:MyBatis提供了强大的对象关系映射功能,可以将数据库中的记录映射成Java对象,也可以将Java对象映射成数据库中的记录。

三、MyBatis的工作原理

  • 配置文件:MyBatis通过配置文件来配置数据库连接信息、SQL语句的映射关系以及其他的一些配置项。
  • 映射文件:映射文件定义了SQL语句与Java方法的映射关系,包括SQL语句的编写、参数的绑定以及结果集的映射等。
  • SQL会话:应用程序通过调用MyBatis的API来创建SQL会话对象,SQL会话是与数据库交互的入口。
  • SQL执行器:SQL执行器负责将SQL语句发送给数据库执行,并将执行结果返回给应用程序。
  • 对象映射器:对象映射器负责将数据库返回的结果集映射成Java对象,同时也负责将Java对象转换成数据库操作所需的参数。

四、MyBatis的功能架构

MyBatis的功能架构可以分为三层:

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

五、MyBatis的应用场景

  • 数据访问层:MyBatis可以作为数据库访问层框架,简化数据库操作的编码工作,提供了灵活的SQL映射和参数绑定功能。
  • 企业级应用:MyBatis适用于各种规模的企业级应用,可以与Spring等容器框架集成,提供灵活的数据库访问解决方案。
  • 分布式系统:MyBatis可以与分布式系统集成,通过配置多个数据源实现数据的分布式访问,可以在分布式环境下提供高性能的数据库操作。
  • 高性能需求:MyBatis是一个轻量级的数据库访问框架,具有较高的性能,适合对数据库操作性能要求较高的场景。
  • 多数据库支持:MyBatis支持多种类型的数据库,包括关系型数据库(如MySQL、Oracle等)和非关系型数据库(如MongoDB、Redis等),适用于需要同时操作多种数据库的场景。

六、MyBatis的优缺点

  • 优点

    • 灵活性高:MyBatis相对于其他ORM框架更加灵活,可以直接编写SQL语句,更加精确地控制数据库操作。
    • SQL优化能力强:MyBatis可以通过手动编写SQL语句来优化数据库查询,减少不必要的查询操作,提高性能。
    • 易于集成:MyBatis可以与其他框架(如Spring)无缝集成,方便使用。
    • 易于学习和使用:MyBatis的学习曲线相对较低,使用简单,对于熟悉SQL语句的开发人员来说更容易上手。
  • 缺点

    • SQL编写工作量大:相对于其他ORM框架,MyBatis需要手动编写SQL语句,对于复杂的查询操作或者数据库表结构变化较大时,需要编写大量的SQL语句。
    • 不适合简单的增删改操作:对于简单的增删改操作,MyBatis相对于其他ORM框架来说需要编写更多的代码。
    • 缺乏自动化功能:MyBatis缺乏一些自动化功能,需要手动编写大部分的SQL语句和映射配置。
    • 灵活性可能导致开发人员犯错:MyBatis的灵活性可能导致开发人员在编写SQL语句时出现错误,对于不熟悉SQL语句的开发人员来说可能更容易出错。

综上所述,MyBatis是一款功能强大、灵活易用的持久层框架,适用于各种规模的企业级应用。然而,它也存在一些缺点,需要开发人员在使用时注意并采取相应的措施来避免潜在的问题。

MyBatis的第一个项目

1. 创建一个maven类型的项目,使用maven帮我们导入框架需要的jar包。

2.创建数据库和表
3.创建MyBatis配置文件conf.xml

mybatis-config.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><!-- 引入外部的资源文件 --><properties resource="db.properties"/><settings><setting name="logImpl" value="STDOUT_LOGGING"/>
<!--        开启二级缓存的总开关  --><setting name="cacheEnabled" value="true"/>
<!--        下划线命名方式自动转驼峰命名方式--><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases><!--        给book类设置别名--><typeAlias type="mybatis.Book" alias="book"/></typeAliases><environments default="dev"><environment id="dev"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${driverClassName}"/><property name="url" value="${url}"/><property name="username" value="${dbusername}"/><property name="password" value="${dbpassword}"/></dataSource></environment></environments><mappers><!-- 告诉核心配置文件,要加载一下图书表的映射文件 --><mapper resource="mappers/bookMapper.xml"/><mapper resource="mappers/userMapper.xml"/>
</mappers>
</configuration>

userMapper.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"><!-- namespace属性的作用是用来关联该文件对应的dao接口的 -->
<mapper namespace="mybatis.UserDao"><!--    设置数据库表的字段名与user类的属性名的对应关系-->
<!--    在数据库字段名与类中的属性名不一致的时候,必须使用resultMap,对于名称相同的字段,可以不用写在里面--><resultMap id="abc" type="mybatis.User"><!--    <id column="id" property="id"/>    -->
<!--        column表示数据库里的字段名,property表示类中的属性名--><result column="ctime" property="createTime"/></resultMap><select id="selectById" resultMap="abc">select * from user where id=#{id}</select><insert id="batchInsert">insert into user (username, password, real_name, age, ctime) values<foreach collection="list" item="u" separator=",">(#{u.username}, #{u.password}, #{u.realName}, #{u.age}, #{u.createTime})</foreach></insert>
</mapper>

bookMapper.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"><!-- namespace属性的作用是用来关联该文件对应的dao接口的 -->
<mapper namespace="mybatis.BookDao"><cache><property name="size" value="10"/></cache><!-- id必须与对应的方法名一样,resultType表示本次查询的结果类型 -->
<!-- #{}用来读取方法的参数值 -->
<select id="selectById" resultType="book" useCache="true">select * from book where id=#{id}</select><select id="selectAll" resultType="mybatis.Book">select * from book</select>
</mapper>
public class test1 {public static void main(String[] args) throws Exception {String config = "mybatis-config.xml";//使用io流读取配置文件InputStream in = Resources.getResourceAsStream(config);//通过配置文件的内容,构建连接工厂SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//从工厂中获取一个数据库的连接SqlSession session = factory.openSession();//从session中获取mybatis给我们生成的BookDao接口的实现类对象BookDao bookDao = session.getMapper(BookDao.class);Book book = bookDao.selectById(1);System.out.println(book.getName());List<Book> books = bookDao.selectAll();System.out.println(books.size());List<Book> list = bookDao.selectByName("三国演义");System.out.println(list.size());int i = bookDao.deleteById(3);System.out.println(i);List<Book> books1 = bookDao.selectByAuthorAndPub("罗贯中", "北京大学出版社");Book b = new Book();b.setName("水浒传");b.setAuthor("施耐庵");b.setPrice(40);b.setPublish("清华大学出版社");bookDao.insert(b);Book b2 = bookDao.selectById(2);b2.setName("西游记");b2.setPrice(70);bookDao.update(b2);//增删改操作,需要提交事务才会生效session.commit();}
}
public interface BookDao {Book selectById(int id);List<Book> selectAll();@Select("select * from book where name=#{name}")List<Book> selectByName(String name);//新增,修改,删除这三种操作都只能返回int结果,或者void,返回的值表示受影响的行数@Delete("delete from book where id=#{id}")int deleteById(int id);//同一个方法,注解和配置文件,不可以同时存在//@Select("select * from book where author=#{param1} and publish=#{param2}")@Select("select * from book where author=#{author} and publish=#{publish}")List<Book> selectByAuthorAndPub(@Param("author") String author,@Param("publish") String publish);//values左边的字段名是与数据库表保持一致的,values右边的@Insert("insert into book(name,author,price,publish) values" +"(#{name},#{author},#{price},#{publish})")int insert(Book bo);@Update("update book set name=#{name},author=#{author},price=#{price}," +"publish=#{publish} where id=#{id}")int update(Book bo);}
//这个类与数据库里的表是对应的,数据库表中有几个字段,这个类中就要有几个属性
//而且数据类型要适配
public class Book implements Serializable {private int id;private String name;private String author;private int price;private String publish;public int getId() {return id;}public String getName() {return name;}public String getAuthor() {return author;}public int getPrice() {return price;}public String getPublish() {return publish;}public void setId(int id) {this.id = id;}public void setName(String name) {this.name = name;}public void setAuthor(String author) {this.author = author;}public void setPrice(int price) {this.price = price;}public void setPublish(String publish) {this.publish = publish;}
}

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

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

相关文章

【FastAPI】1-url参数

fastapi的核心功能是提供HTTP请求接口 “幂等”和“非幂等” 幂等&#xff08;idempotent&#xff09;&#xff1a;如果一个方法重复执行多次&#xff0c;产生的效果是一样的&#xff0c;那么这个方法就是幂等的 “Methods can also have the property of “idempotence” in …

CentOS Stream 9设置静态IP

CentOS Stream 9设置静态IP CentOS Stream 9作为CentOS Stream发行版的下一个主要版本&#xff0c;已经发布有一段时间&#xff0c;但与目前广泛使用的CentOS7有较大区别。安装试用Stream 9的过程中&#xff0c;就发现设置静态IP的方式和CentOS7/8差别较大&#xff0c;在此记录…

机器人学 雅可比矩阵

雅可比矩阵&#xff08;Jacobian Matrix&#xff09;是机器人学中一个非常重要的工具&#xff0c;广泛应用于分析机器人末端执行器的速度和力学&#xff08;静力&#xff09;关系。理解雅可比矩阵的速度和静力作用对于机器人运动控制、动力学分析以及优化设计具有重要意义。 一…

【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-最小的数

CL13 最小的数(20 分) 输入一个有 n 个无重复元素的整数数组 a&#xff0c;输出数组中最小的数。提示&#xff1a;如使用排序库函数 sort()&#xff0c;需要包含头文件#include 。输入&#xff1a; 第一行一个正整数 n(2<n<20)&#xff1b; 第二行 n 个不重的整数 a[i]…

python数据写入excel文件

主要思路&#xff1a;数据 转DataFrame后写入excel文件 一、数据格式为字典形式1 k e &#xff0c; v [‘1’, ‘e’, 0.83, 437, 0.6, 0.8, 0.9, ‘好’] 1、这种方法使用了 from_dict 方法&#xff0c;指定了 orient‘index’ 表示使用字典的键作为行索引&#xff0c;然…

制作自己的刷题小题库,提高刷题效率

日常刷题 乱序/背题多种模式 组队刷题 查看小组的刷题统计 在线考试 创建考试多人同时答题 ----这是一条分割线----- 土著刷题&#xff0c;是一款可以导入题库的在线刷题学习小&#x1f34a;序&#xff0c;提供一套以【搭建题库-组建小组-刷题练习-在线考试】为中心的完整服务…

在 Oracle Linux 8.9 上安装Oracle Database 23ai 23.5

在 Oracle Linux 8.9 上安装Oracle Database 23ai 23.5 1. 安装 Oracle Database 23ai2. 连接 Oracle Database 23c3. 重启启动后&#xff0c;手动启动数据库4. 重启启动后&#xff0c;手动启动 Listener5. 手动启动 Pluggable Database6. 自动启动 Pluggable Database7. 设置开…

springboot线下培训机构集中管理和推荐平台-计算机毕业设计源码48919

摘 要 该论文研究了一种线下培训机构集中管理和推荐平台的设计与实现。该平台旨在解决传统线下培训机构管理和推荐过程中存在的诸多问题&#xff0c;包括信息不对称、资源分散、推荐不精准等。通过系统性的需求分析和技术调研&#xff0c;设计了一套基于Spring Boot和Vue的前后…

Jmeter中的监听器(一)

监听器 1--查看结果树 用途 调试测试计划&#xff1a;查看每个请求的详细信息&#xff0c;帮助调试和修正测试计划。分析响应数据&#xff1a;查看服务器返回的响应数据&#xff0c;验证请求是否成功。检查错误&#xff1a;识别和分析请求失败的原因。 配置步骤 添加查看结果…

机器学习—多个输出的分类(Optional)

有一种不同类型的分类问题&#xff0c;称为多标签分类问题&#xff0c;与每个图像相关联的地方可能有多个标签。 如果你正在制造一辆自动驾驶汽车或者驾驶辅助系统&#xff0c;然后给你一张车前的照片&#xff0c;你可能想问&#xff0c;比如有没有一辆车或者至少有一辆车还是…

上海市计算机学会竞赛平台2020年4月月赛丙组永恒的生命游戏

题目背景 2020年4月11日&#xff0c;英国数学家 约翰霍顿康威&#xff08;John Horton Conway&#xff09;因为新型冠状病毒肺炎不幸逝世。他在群论、数论、代数、几何拓扑、理论物理、组合博弈论和几何等领域&#xff0c;都做出了重大贡献。他的离去是人类文明的损失。他最著…

SQLI LABS | Less-43 POST-Error Based-String-Stacked With Twist

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-43/ 本关是堆…

UEFI Shell命令(二)

一、Shell 命令行选项 ​-b, -break 每页输出后暂停一会&#xff0c;即分页输出 -q, -quiet 抑制所有的输出 -sfo 标准格式输出 -t, -terse 简洁的输出 -v, -verbose 详细的输出 -&#xff1f; 帮助 二、特殊Shell命令 1、attrib 显示或更改文件或目录的属性 [a | -a] 设置…

【QT常用技术讲解】优化网络链接不上导致qt、qml界面卡顿的问题

前言 qt、qml项目经常会涉及访问MySQL数据库、网络服务器&#xff0c;并且界面打开时的初始化过程就会涉及到链接Mysql、网络服务器获取数据&#xff0c;如果网络不通&#xff0c;卡个几十秒&#xff0c;会让用户觉得非常的不爽&#xff0c;本文从技术调研的角度讲解解决此类问…

【C语言】程序性能优化——除法运算符

【C语言】程序性能优化——除法运算符 文章目录 [TOC](文章目录) 前言一、牛顿迭代法1、数学基础2、C代码3、实验 二、二分法1、数学基础2、C代码3、实验 三、参考资料总结 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、牛顿迭代法 1、数学…

每日计划-1109

1. 完成 104. 二叉树的最大深度 class Solution { public:// 计算二叉树的最大深度的函数int maxDepth(TreeNode* root) {// 如果根节点为空&#xff0c;说明已经到达叶子节点的下一层&#xff0c;返回0&#xff08;这里代码中 return false 应该是错误的&#xff0c;应该是 r…

基于YOLOv5的人群密度检测系统设计与实现

大家好&#xff0c;本文将介绍基于改进后的YOLOv5目标检测模型&#xff0c;设计并实现人群密度检测系统。 使用YOLOv5的源代码&#xff0c;在此基础上修改和训练模型&#xff0c; 数据集选用crowdhuman数据集。对yolov5源码中的文件进行修改&#xff0c;更换主干网络、改进损失…

鸿蒙入门——ArkUI 自定义组件间的父子双向同步状态装饰器@Link语法(四)

文章大纲 引言一、组件间状态装饰器Link 父子双向同步1、使用规则2、支持的观察变化的场景和ArkUI 刷新UI3、Link变量值初始化和更新机制3.1、初始渲染&#xff1a;执行父组件的build()函数后将创建子组件的新实例。3.2、Link的数据源的更新&#xff1a;即父组件中状态变量更新…

【Android、IOS、Flutter、鸿蒙、ReactNative 】启动页

Android 设置启动页 自定义 splash.xml 通过themes.xml配置启动页背景图 IOS 设置启动页 LaunchScreen.storyboard 设置为启动页 storyboard页面绘制 Assets.xcassets 目录下导入图片 AppLogo Flutter 设置启动页 Flutter Android 设置启动页 自定义 launch_background.xm…

[SaaS] 数禾科技 AIGC生成营销素材

https://zhuanlan.zhihu.com/p/923637935https://zhuanlan.zhihu.com/p/923637935