mybatis的使用

基础介绍

mybatis是通过对JDBC的封装实现的,他是针对ORM的。‘datasource也是对于JDBC的封装,但是它是针对连接管理的。
半ORM框架Object Relationship Mapping 对象关系映射
半ORM:需要在mapper文件中配置映射关系
作用:用来操作数据库,解决原始jdbc代码冗余
mybatis-config.xml
(1)environment设置数据源
(2)类型别名
(3)mapper文件的注册
mapper文件
(1)dao方法的实现—sql语句
开发步骤:
1.entity
2.类型别名
3.表
4.dao接口
5.mapper文件
6.mapper文件的注册
7.API编程

mybatis开发流程

mybatis流程:
(1)引入pom
(2)编写mybatis-config.xml文件在resources目录,配置数据源和mybatis的设置
(3)编写mapper文件在resources/mapper目录,和dao类配合
(4)创建SessionFactory
(5)建立Session,断开Session

配置mybatis

public StudentDao(String configPath) throws IOException {InputStream inputStream = Resources.getResourceAsStream(configPath);    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}

但是使用

<dependency> <groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.1.1</version>
</dependency>

就可以直接使用SqlSessionFactory直接注入就行了,springboot给配置好了

mybatis-config.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"><configuration><!-- Global settings --><settings><setting name="logImpl" value="STDOUT_LOGGING"/><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!-- Type aliases --><typeAliases><typeAlias alias="User" type="com.example.model.User"/><!-- Other type aliases... --></typeAliases><!-- Plugins (if any) --><plugins><plugin interceptor="com.example.plugins.MyPlugin"><!-- Plugin-specific configuration --></plugin></plugins><!-- Environments --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/><property name="username" value="your_username"/><property name="password" value="your_password"/><!-- Druid specific properties --><property name="initialSize" value="5"/><property name="maxActive" value="20"/><!-- Other properties... --></dataSource></environment></environments><mappers><mapper resource="classpath:mapper/student_mapper.xml"/></mappers>
</configuration>mapper.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.demo1.dao.StudentDao"><select id="findAll" resultType="com.yogurt.po.Student">SELECT * FROM schedule_system.student;</select><insert id="insert" parameterType="com.yogurt.po.Student">INSERT INTO schedule_system.student (name) VALUES (#{name});</insert><delete id="delete" parameterType="int">DELETE FROM schedule_system.student WHERE id = #{id};</delete>
</mapper>
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();

代理对象

UserDao userDao=sqlSession.getMapper(UserDao.class);
List users=userDaol.queryAll();

dao接口

代理对象
如何在resourece目录下和接口目录相同?编译以后文件在一个目录就行了 resource/top/haidong/mapper
在这里插入图片描述

包扫描加载mapper接口(代替mapper的配置)

表中字段名和java类的属性不同,无法映射的解决方法:
(1)给select语句中的字段名起别名。as
(2)使用resultmap映射
在这里插入图片描述

<resultMap id="brandResultMap" type="brand">
id是主键的映射,result是一般字段的映射
<id colum="key_permiay" property="keyPermiay">
<result colum="brand_name"property="brandName">
<result colum="company_name" property="companyName">
</resultMap>
<select id="selectAll" resultMap="brandResultMap">
select * from tb
</select>

sql参数

参数占位符,${}有sql注入的风险
#{}:在sql中使用?代替
${}:sql直接注入
parameterType:传入参数类型,可以省略。
sql中的特殊字符(比如<,和xml特殊字符冲突)的处理:
(1)转义字符
(2)<![CDATA [内容]>:写一个CD就能跳出来了

多条件查询

dao接口传入sql 的多个占位符参数,如何一一对应?
(1)散装参数注入sql占位符,在dao接口参数使用@Param:@Param(“参数占位符名称”)
在这里插入图片描述

(2)将参数封装成对象,要求对象属性要和占位符名称一一对应。
将对象传入。
(3)传入map
单条件动态查询

where
<choose >
<when test="a!=null and a!=""" ">state= #{state}
</when>
<when test="">
</when>
<otherwise>
</otherwise>

多条件动态查询

select * from t
<where>
<if test="state!=null">state=#{state}
</if>
<if test="title!=null">title=#{title}
</if>
</where>

where元素只会在子元素返回内容的情况下才插入where语句,若开头为“AND”或者“OR”,会去掉。

mybatis默认开启事务,进行增删改操作后需要sqlSession.commit();手动提交。

更新

<update id="updateAuthorIfNecessary">update Author<set><if test="username != null">username=#{username},</if><if test="password != null">password=#{password},</if><if test="email != null">email=#{email},</if><if test="bio != null">bio=#{bio}</if></set>where id=#{id}
</update>

set会自动删掉if字段内的逗号,以及自动添加”set“

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

MyBatis 会通过 Mapper XML 文件来实现 DAO 接口

生命周期

SqlSessionFactoryBuilder:这个就是一个建造者类,随时可以被创建使用和丢弃,没什么问题,SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域
SqlSessionFactory:一个应用程序创建一个就行了,可以使用单例模式来实现。
SqlSession:最佳实践是方法作用域和请求作用域,不能将它和任何一个类绑定。
映射器实例:和sqlsession一样,方法作用域或请求。
sqlsession和connection的关系
在sqlsessionfacotory创建sqlsession时候,给sqlsession分配一个connection,当sqlsession关闭时候关闭connection。

sqlsessionfactory管理数据库连接,它是通过configuration来创建连接的,而不是driverManager。

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

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

相关文章

uniapp h5 生成 ubuntu桌面程序 并运行方法

uniapp h5 生成 ubuntu桌面程序 并运行方法,在window环境下开发&#xff0c;发布到ubuntu桌面&#xff0c;并运行 1、安装Nodejs 安装包官方下载地址&#xff1a;https://www.nodejs.com.cn/ 安装完后cmd&#xff0c;如图&#xff0c;即安装成功 2、通过Nodejs安装 electron…

【数据结构与算法】之字符串系列-20240118

这里写目录标题 一、13. 罗马数字转整数二、14. 最长公共前缀三、20. 有效的括号四、28. 找出字符串中第一个匹配项的下标五、58. 最后一个单词的长度 一、13. 罗马数字转整数 简单 示例 1: 输入: s “III” 输出: 3 示例 2: 输入: s “IV” 输出: 4 示例 3: 输入: s “…

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题三 模块一

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…

百度云网盘下载速度如何提升到正常速度

引入问题 我们在下载代码学习资料的时候大多数都是百度云网盘&#xff0c;但是限速&#xff01;下载的十分的慢&#xff0c;有什么办法能让我们不开通会员就能享受正常速度呢&#xff1f; 当然有&#xff01; 解决百度云网盘下载速度过慢&#xff0c;提高到正常速度 点击右…

(2)(2.1) Andruav Android Cellular(一)

文章目录 前言 1 Andruav 是什么&#xff1f; 2 Andruav入门 3 Andruav FPV 4 Andruav GCS App​​​​​​​ 前言 Andruav 是一个基于安卓的互联系统&#xff0c;它将安卓手机作为公司计算机&#xff0c;为你的无人机和遥控车增添先进功能。 1 Andruav 是什么&#xff…

VUE--组件的生命周期及其基本应用

VUE的生命周期 上图是实例生命周期的图表&#xff0c;需要注意以下几个重要时期&#xff1a; 创建期&#xff1a;beforeCreated、created 挂载期&#xff1a;beforeMount、mounted 更新期&#xff1a;beforeUpdate、updated 销毁期&#xff1a;beforeUnmount、unmounted 生命周…

基于Java+SpringBoot+Vue狗粮销售商城系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作✌ 主要内容&#xff1a;SpringBoot、Vue、SSM、HLM…

如何发挥 Sketch在UI和UX设计中的作用

Sketch是一款专业的矢量图形设计软件&#xff0c;主要应用于UI设计、移动应用设计、Web设计等领域。假如你是一个交互设计师或UI设计师&#xff0c;那么你一定知道Sketch这一强大的矢量设计软件&#xff1b;如果你使用了Photoshop&#xff0c;那么在你接触到Sketch之后&#xf…

Linux环境搭建FastDFS文件服务器(附带Nginx安装)

本文主要介绍在linux服务器如何搭建FastDFS文件服务器。大概分为9个步骤&#xff0c;由于内容较为繁琐。下面带你入坑&#xff01; 首先简单介绍一下FastDFS是淘宝资深架构师余庆老师主导开源的一个分布式文件系统&#xff0c;用C语言编写。适应与中小企业&#xff0c;对文件不…

快速排序【hoare版本】【挖坑法】【双指针法】(数据结构)

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中 的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右子序列中所有元素均…

android 和 opencv 开发环境搭建

本文详细说明给android项目添加opencv库的详细步骤&#xff0c;并通过实现图片灰度化来查看配置是否成功。 下载OPENCV ANDROID SDK 到官网下载 打开 https://opencv.org/releases/ 选择android&#xff0c;下载完成后解压出下面的文件&#xff1a; 安装android sdk 和 ndk …

Dubbo使用详解

简介 Dubbo是一个高性能、轻量级的开源Java RPC框架&#xff0c;由阿里巴巴公司开发并开源。它提供了三大核心能力&#xff1a;面向接口的远程方法调用&#xff0c;智能容错和负载均衡&#xff0c;以及服务自动注册和发现。Dubbo使得应用可通过高性能的 RPC 实现服务的输出和输…