MyBatis 环境搭建+基本使用

目录

  • MyBatis
    • 创建MyBatis环境搭建
    • MyBatis模式开发
    • MyBatis 获取动态参数(查询操作)
      • ${} 直接替换
      • #{} 占位符模式替换
      • like查询(模糊查询)
      • 多表查询
        • 一对一的表映射
        • 一对多的表映射
    • 增、删、改操作
      • 改操作
      • 删除操作
      • 增加操作
        • 添加用户
        • 添加用户并获取用户id
    • 返回类型与返回字典映射
      • 返回类型 resultType
      • 返回字典映射 resultMap
    • 动态SQL
      • \<if\>标签
      • \<trim\>标签
      • \<where\>标签
      • \<set\>标签
      • \<foreach\>标签

MyBatis是优秀的持久层框架,支持自定义SQL,存储过程以及高级映射。
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
使用MyBatis是更简单完成程序和数据库交互的工具,可以更简单的操作和读取数据库工具。

MyBatis官网

MyBatis

MyBatis是基于JDBC的,在JDBC上又封装了一层

创建MyBatis环境搭建

和maven项目不同的两步:

  1. 添加MyBatis框架支持 (老项目 / 新项目)
  2. 设置MyBatis的配置信息
    • 设置数据库链接的相关信息
    • 配置 MyBatis xml 的保存路径和 xml 命名模式
# 数据库的连接字符串设置
spring.datasource.url=jdbc:mysql://localhost:3306/mycnblog?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=111
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# 设置MyBatis
mybatis.mapper-locations=classpath:/mybatis/*Mapper.xml

在这里插入图片描述
在这里插入图片描述

添加MyBatis框架支持
在这里插入图片描述
注意:第一次创建好了MyBatis项目之后,启动会报错。
在这里插入图片描述
需要在application.properties下设置数据库的连接字符串设置和 MyBatis 的 XML ⽂件配置。
在这里插入图片描述

# 数据库的连接字符串设置
spring.datasource.url=jdbc:mysql://localhost:3306/mycnblog?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=111
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# 设置MyBatis
mybatis.mapper-locations=classpath:/mybatis/*Mapper.xml

MyBatis模式开发

MyBatis模式开发由两部分组成

  1. interface :让其他层可以注入使用的接口
  2. MyBatis xml:具体实现sql【他是上面interface的实现】
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

MyBatis 获取动态参数(查询操作)

${} 直接替换

MyBatis 获取动态参数有两种实现:

  1. ${paramName} 直接替换
    <select id="getUserById" resultType="com.example.demo.entity.UserEntity">select * from userinfo where id=${uid}
<!--    如果param和形参中的值不一样,需要使用@Param中的参数    --></select>

在这里插入图片描述

#{} 占位符模式替换

  1. #{paramName} 占位符模式
    是一种预执行,可以有效的排除SQL的安全问题
    <select id="getUserById" resultType="com.example.demo.entity.UserEntity">select * from userinfo where id=#{uid}</select>

在这里插入图片描述

    @Testvoid login() {String username = "admin";String password = "' or 1='1";UserEntity inputUser = new UserEntity();inputUser.setUsername(username);inputUser.setPassword(password);UserEntity user = userMapper.login(inputUser);System.out.println(user);}
    <select id="login" resultType="com.example.demo.entity.UserEntity">select * from userinfo where username='${username}' and password='${password}'</select>

没有输入密码,但是可以构造,得到用户数据
在这里插入图片描述
$:直接替换
只要or前后有一个条件满足即可

select * from userinfo where username='${username}' and password='' or 1='1'

#是预执行处理,填充的东西只看做一个字符串,不会查到用户数据

    <select id="login" resultType="com.example.demo.entity.UserEntity">select * from userinfo where username=#{username} and password=#{password}</select>

在这里插入图片描述

$:直接替换,当需要传递一个SQL关键字的时候比较适合使用
比如需要对数据进行倒序或者正序排序时

//UserMapper.javaList<UserEntity> getAllByIdOrder(@Param("ord") String ord);
//UserMapper.xml<select id="getAllByIdOrder" resultType="com.example.demo.entity.UserEntity">select * from userinfo order by id ${ord}</select>
//UserMapperTest@Testvoid getAllByIdOrder() {List<UserEntity> list = userMapper.getAllByIdOrder("desc");System.out.println(list.size());}

like查询(模糊查询)

    //根据用户名模糊查询List<UserEntity> getListByName(@Param("username") String username);
    <select id="getListByName" resultType="com.example.demo.entity.UserEntity">select * from userinfo where username like concat('%', #{username},'%')</select>
    @Testvoid getListByName() {String username = "oo";List<UserEntity> list = userMapper.getListByName(username);list.stream().forEach(System.out::println);}

多表查询

一对一的表映射

(企业中几乎不用)

一对多的表映射

增、删、改操作

改操作

修改密码

//UserMapper.java//修改密码int updatePassword(@Param("id")Integer id,@Param("password") String password,@Param("newPassword") String newPassword);
<!--  UserMapper.xml  -->
<!--  select 要求必须设置两个属性,update设置一个参数就行,update默认会返回一个受影响的行数,返回类型默认是int  --><update id="updatePassword">update userinfo set password=#{newPassword}where id=#{id} and password=#{password}</update>

在UserMapper.java下右键生成updatePassword的Test

//UserMapperTest.java@Transactional  //事务(执行前新建事务,执行完进行回滚) 该注解让操作不污染数据库,可以加在类上,也可以加在方法上。@Testvoid updatePassword() {int result = userMapper.updatePassword(1, "123456", "aaaaa");System.out.println("修改:" + result);}

删除操作

//UserMapper.java//删除用户int delById(@Param("id") Integer id);
<!--  UserMapper.xml  -->
<!--  删除  --><delete id="delById">delete from userinfo where id=#{id}</delete>
//UserMapperTest.java@Transactional@Testvoid delById() {int id = 1;int result = userMapper.delById(id);System.out.println("删除结果:" + result);}

增加操作

添加用户

//UserMapper.java//添加操作int addUser(UserEntity user);
<!--  UserMapper.xml  -->
<!--  添加  返回影响行数--><insert id="addUser">insert into userinfo(username, password) values(#{username}, #{password})</insert>
//UserMapperTest.java@Testvoid addUser() {UserEntity user = new UserEntity();user.setUsername("root");user.setPassword("123456");int result = userMapper.addUser(user);System.out.println("添加用户" + result);}

添加用户并获取用户id

//UserMapper.javaint addUserGetId(UserEntity user);
<!--  UserMapper.xml  -->
<!--  数据库中要给id设置自增主键,不然这些会报错  -->
<!--  useGeneratedKeys="true"  表示是否自动生成id(主键) 默认为false  -->
<!--  开启自动生成主键后,keyProperty表示将生成的主键赋值给哪个属性字段上,放在id字段  -->
<!--    添加 返回影响行数 和 id--><insert id="addUserGetId" useGeneratedKeys="true" keyProperty="id">insert into userinfo(username, password) values(#{username}, #{password})</insert>
//UserMapperTest.java@Testvoid addUserGetId() {UserEntity user = new UserEntity();user.setUsername("root");user.setPassword("123456");int result = userMapper.addUserGetId(user);System.out.println("添加结果:" + result);System.out.println("ID:" + user.getId());}

返回类型与返回字典映射

返回类型 resultType

大多数的场景都可以使用resultType进行返回。使用方便,直接定义实体类即可

返回字典映射 resultMap

resultMap的使用场景

  • 字段名称和程序中的属性名不同,使用resultMap配置映射
  • 一对一和一对多关系可以使用resultMap映射并查询数据

动态SQL

动态SQL是MyBatis的强大特性之一,能够描述不同条件下不同SQL的拼接。允许在XML中写逻辑判断
保证了数据的一致性

<if>标签

有时候有必填字段和⾮必填字段,如果在添加的时候有不确定的字段传⼊,需要使用动态标签 <if> 判断

    int addUser2(UserEntity user);
    <insert id="addUser2">insert into userinfo(username, password<if test="photo != null and photo !=''">      <!--   这里test里面判断的key是属性,不是数据库字段  -->,photo       <!--  数据库字段  --></if>) values(#{username}, #{pwd}<if test="photo != null and photo !=''">,#{photo}     <!--  这里是属性,不是数据库字段 (特殊字符 #{} 等,里面的都属于程序里面的)  --></if>)</insert>
    @Transactional@Testvoid addUser2() {String username = "ss";String password = "1008611";String photo = "this is a photo";UserEntity user = new UserEntity();user.setUsername(username);user.setPwd(password);user.setPhoto(photo);int result = userMapper.addUser2(user);System.out.println("添加:" + result);}

<trim>标签

如果所有的字段都是非必填的情况下,只使用if标签就无法解决问题了。
就要使用<trim>标签结合<if>标签,对多个字段都采取动态生成的方式。

<trim>标签属性:

  • prefix:整个语句块,以prefix的值为前缀
  • suffix:整个语句块,以suffix的值作为后缀
  • prefixOverrides:表示整个语句块要去除的前缀,有则去除,没有也不会报错
  • suffixOverrides:表示整个语句块要去除的后缀

<trim>标签的处理方法:

  • 基于prefix配置,在开始部分加上 (
  • 基于suffix配置,在结束部分加 )
  • 在多个 <if> 组织的语句后都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于suffixOverrides配置去掉最后一个 ,
  • <if test="createTime!=null">中的 createTime 是传入对象的属性

使用 trim 什么都不传的话会报错

select * from articleinfo
where
<trim suffixOverrides="and"><if test="id != null and id > 0">id=#{id} and</if><if test="title != null and title != ''">title like concat('%', #{title},'%')</if>
</trim>

当MyBatis中多个都是非必传参数的解决方案
① 1=1


<!--除非在最前面加上 1=1 -->
<!--   这样是可行的    -->
select * from articleinfo
where 1=1
<trim prefixOverrides="and"><if test="id != null and id > 0">and id=#{id}</if><if test="title != null and title != ''">and title like concat('%', #{title},'%')</if>
</trim>

② 在trim中使用where作为前缀和and作为整个语句块要去除的后缀
当trim中生成了代码,才会添加<trim>中的前缀和后缀,如果trim中没有生成代码,前缀和后缀都会省略

<select id="getListByIdOrTitle" resultType="com.example.demo.entity.VO.ArticleInfoVO">select * from articleinfo<trim prefix="where" suffixOverrides="and"><if test="id != null and id > 0">id=#{id} and</if><if test="title != null and title != ''">title like concat('%', #{title},'%')</if></trim>
</select>

③ where标签

<where>标签

where标签是专门用来解决多个都是非必传参数的。

<where>会自动帮你取出最前面的 and 关键字,但要注意,使用where标签不会自动帮你去除最后的and标签。
where 会自动检测 <where>内是否有数据传入,如果没有就不会生成where语句

select * from articleinfo
<where><if test="id != null and id > 0">id=#{id}</if><if test="title != null and title != ''">and title like concat('%', #{title},'%')</if>
</where>

<set>标签

<set>会自动取出最后面的关键字。

<update id="updateById" parameterType="org.example.model.User">update user<set><if test="username != null">username=#{username},</if><if test="password != null">password=#{password},</if><if test="sex != null">sex=#{sex},</if></set>where id=#{id}
</update>

<foreach>标签

对集合进行遍历
常用属性:

  • collection:传递过来的集合的名称,List,set,map或数组
  • item:集合中遍历的每一个对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历之间间隔的分隔符

使用foreach 标签最常见的使用:批量删除

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

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

相关文章

Spring事务与事务传播

文章目录 一、什么是事务?二、Spring事务实现编程式事务声明式事务 三、Transactional的使用参数作用Spring事务的隔离级别事务失效的场景Transactional工作原理 四、Spring事务传播机制Spring有哪些事务传播机制&#xff1f; 一、什么是事务? 事务&#xff1a;事务是一组操…

mybatis分页中的报错

1 Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.NoSuchMethodException: com.github.pagehelper.BoundSqlInterceptor.<init>() 出错的原因就是上面的那句话 Error parsing SQL Mapper Configuration…

Mybatis分页方式及实现原理

一、mybatis的4种分页方式(物理分页、逻辑分页) 1、借助Sql语句Q进行分页(物理分页) 2、拦截器分页(物理分页)通过拦截器给sq语句末尾加Eimt语句来查询 3、借助 数组Q进行分页(逻辑分页) 4、RowBounds分页插件实现分页(逻辑分页) 二、mybatis分页的原理 mybatis分页原理是&…

Ora提示词版ChatGPT机器人

Ora可以自己创建一个ChatGPT机器人&#xff0c;可以设置自己的提示词例如我创建的AI佛祖https://ora.ai/aesthetic-red-nfa4/ai%E4%BD%9B%E7%A5%96 提示词 创建机器人的时候&#xff0c;需要设定自己的提示词&#xff0c;例如&#xff1a; 假设你是佛祖&#xff0c;名字叫做释迦…

mybatis分页查询插件

1.引入jar包 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.0</version></dependency> 2.在mybatis的核心配置文件mybatis.xml中配置分页插件 3.使用pageHec publi…

Mybatis分页查询——四种传参方式

目录 相关导读 一、顺序传参 1. 持久层接口方法 2. UserMapper.xml映射文件新增标签 3. 新增测试方法 4. 运行结果 二、param传参 1. 持久层接口方法 2. UserMapper.xml映射文件新增标签 3. 新增测试方法 4. 运行结果 三、自定义POJO类传参 1. 自定义POJO类 2. 持…

MyBatis分页插件

目录 分页插件 Mybatis插件典型适用场景 实现思考 第一个问题 第二个问题 自定义分页插件 分页插件使用 添加pom依赖 插件注册 调用 代理和拦截是怎么实现的 PageHelper 原理 分页插件 MyBatis 通过提供插件机制&#xff0c;让我们可以根据自己的需要去增强MyBati…

Mybatis——分页

1.为什么要分页&#xff1f; 减少数据的处理量使用Limit分页 select * from user limit startIndex,pageSize;使用Mybatis实现分页&#xff0c;核心SQL 1.数据库文件-db.properties drivercom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/mybatis?useSSLfalse&…

Mybatis实现分页的三种方式

文章目录 1、Limit实现分页2、RowBounds分页&#xff08;不建议使用&#xff09;3、MyBatis分页插件PageHelper&#xff08;了解即可&#xff09; 1、Limit实现分页 sql语句 SELECT * from user limit startIndex,pageSize简单示例&#xff1a; user表 查询一&#xff1a;从第…

Mybatis的四种分页方式详解

LIMIT关键字 mapper代码 select * from tb_user limit #{pageNo}, #{pageSize} 业务层直接调用 public List findByPageInfo(PageInfo info) { return userMapper.selectByPageInfo(info); } 3&#xff0c;优点 灵活性高&#xff0c;可优化空间大 mysql分页语句优化 4&…

mybatis实现分页的几种方式

本文目录 借助数组进行分页借助Sql语句进行分页拦截器分页RowBounds实现分页 借助数组进行分页 原理&#xff1a;进行数据库查询操作时&#xff0c;获取到数据库中所有满足条件的记录&#xff0c;保存在应用的临时数组中&#xff0c;再通过List的subList方法&#xff0c;获取到…

【分布式应用】ELK企业级日志分析系统

一、ELK 简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 1.1 ELK各组件介绍 ElasticSearch&#xff1a; 是基于Lucene&#xff08;一个…

Rust每日一练(Leetday0016) 全排列I\II、旋转图像

目录 46. 全排列 Permutations &#x1f31f;&#x1f31f; 47. 全排列 II Permutations II &#x1f31f;&#x1f31f; 48. 旋转图像 Rotate Image &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专…

win10操作系统官网如何下载ios境像文件安装操作系统

1.打开官网 2.立即下载工具 3.正在准备进行工作 4.接收条款 5.根据需求选择安装合适的位置 6.等待创建成功 7.右键选择装载 8.双击安装setup.exe文件 8 使用微Pe安装过程中发现需要联网更新解决 winR 然后cmd 输入 OOBE\BYPASSNRO 9 或者关闭此进程 电脑不要插网线&#xff…

虚拟机系统iso镜像下载_如何下载正版系统镜像

许多网友想装系统&#xff0c;可是不会装(后期会推装系统的文章)&#xff0c;而且网上的系统有的装有全家桶&#xff0c;有的又有捆绑软件&#xff0c;严重的还有病毒。那么&#xff0c;在哪里去下载正版&#xff0c;安全的系统镜像呢 "MSDN&#xff0c;我告诉你"这个…

自定义IOS系统弹框

写在之前 系统的弹框虽然很好看&#xff0c;但是有时候无法完全满足UI设计的需求&#xff0c;比如说中间要显示一个输入框&#xff0c;或者要放置一张图片&#xff0c;这里介绍一个很早之前的自定义弹框库&#xff0c;这个自定义弹框sdk写的很细致&#xff0c;定制性很强&…

华为vivo小米魅族oppo荣耀安卓手机刷IOS苹果系统

现在的刷机教程层出不穷&#xff0c;但是没有哪个大神可以开发出一款安卓刷IOS的工具&#xff0c;使得安卓手机或者安卓平板变成IOS苹果系统&#xff0c;这个工具除了可以刷安卓手机也可以刷安卓平板&#xff0c;网友实测&#xff0c;如果设备不支持的话软件会提醒不支持&#…

android高仿ios11系统,安卓仿ios11桌面全套文件

安卓手机想要苹果11的桌面的话&#xff0c;安卓仿ios11桌面全套文件app就可以帮您实现哦。安卓仿ios11桌面全套文件app是一款超级优质的手机桌面工具软件&#xff0c;平台上面拥有海量的壁纸资源&#xff0c;大家可以任意选取哦。 应用说明 修改负一屏效果 修改dock栏模糊度 修…

软件配置 | ios系统Clion下载、安装、配置环境

软件配置 软件配置 | ios系统Clion下载、安装、配置环境 软件配置下载、安装gClion 调试参考链接下载、安装调试 本文总结ios系统下Clion下载、安装、配置环境过程和可能碰到的问题。 因为是在私人电脑&#xff08;ios&#xff09;上配置的Clion&#xff0c;我还不太熟悉自己的…

iOS 13.0 至 13.7 平刷系统教程

来自 : 某QQ群分享文件&#xff0c;整理后发布 如侵权告知删除 关于 Succession 平刷插件信息&#xff1a; 插件&#xff1a;Succession 版本&#xff1a;1.4.15 开发者&#xff1a;Samg_is_a_Ninja 系统支持&#xff1a;iOS 10 至 13.7 用途&#xff1a;平刷当前系统 补充&am…