Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >springboot第14集:MyBatis-CRUD讲解

springboot第14集:MyBatis-CRUD讲解

作者头像
达达前端
发布于 2023-10-08 10:19:52
发布于 2023-10-08 10:19:52
31800
代码可运行
举报
文章被收录于专栏:达达前端达达前端
运行总次数:0
代码可运行

注意点:增、删、改操作需要提交事务!

  • 为了规范操作,在SQL的配置文件中,我们尽量将Parameter参数和resultType都写上!

编写Mapper接口类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.da.pojo.User;
import java.util.List;
public interface UserMapper {
    List<User> selectUser();
}

编写Mapper.xml配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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.da.dao.UserMapper">
  <select id="selectUser" resultType="com.da.pojo.User">
    select * from user
  </select>
</mapper>
select
  • select标签是mybatis中最常用的标签之一
  • select语句有很多属性可以详细配置每一条SQL语句
    • SQL语句返回值类型。
    • 传入SQL语句的参数类型 。
    • 命名空间中唯一的标识符
    • 接口中的方法名与映射文件中的SQL语句ID 一一对应
    • id
    • parameterType
    • resultType

在UserMapper中添加对应方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface UserMapper {
    //查询全部用户
    List<User> selectUser();
    //根据id查询用户
    User selectUserById(int id);
}

在UserMapper.xml中添加Select语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<select id="selectUserById" resultType="com.da.pojo.User">
  select * from user where id = #{id}
</select>

在UserMapper接口中添加对应的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//添加一个用户
int addUser(User user);

在UserMapper.xml中添加insert语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<insert id="addUser" parameterType="com.da.pojo.User">
     insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//修改一个用户
int updateUser(User user);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<update id="updateUser" parameterType="com.da.pojo.User">
    update user set name=#{name},pwd=#{pwd} where id = #{id}
</update>

根据id删除一个用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//根据id删除用户
int deleteUser(int id);

编写对应的配置文件SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<delete id="deleteUser" parameterType="int">
    delete from user where id = #{id}
</delete>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from foo where bar like #{value}

select * from foo where bar like "%"#{value}"%"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
configuration(配置)
    properties(属性)
    settings(设置)
    typeAliases(类型别名)
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)
    environments(环境配置)
        environment(环境变量)
            transactionManager(事务管理器)
            dataSource(数据源)
    databaseIdProvider(数据库厂商标识)
    mappers(映射器)
<!-- 注意元素节点的顺序!顺序不对会报错 -->
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC">
      <property name="..." value="..."/>
    </transactionManager>
    <dataSource type="POOLED">
      <property name="driver" value="${driver}"/>
      <property name="url" value="${url}"/>
      <property name="username" value="${username}"/>
      <property name="password" value="${password}"/>
    </dataSource>
  </environment>
</environments>

子元素节点:environment

  • 具体的一套环境,通过设置id进行区别,id保证唯一!

子元素节点:transactionManager - [ 事务管理器 ]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- 语法 -->
<transactionManager type="[ JDBC | MANAGED ]"/>

子元素节点:数据源(dataSource)

  • dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
  • 数据源是必须配置的。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type="[UNPOOLED|POOLED|JNDI]"
  • unpooled:这个数据源的实现只是每次被请求时打开和关闭连接。
  • pooled:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
  • jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
  • 数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等….
Mapper文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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.da.mapper.UserMapper">
</mapper>
  • namespace中文意思:命名空间,作用如下:
    • namespace的命名必须跟某个接口同名
    • 接口中的方法与映射文件中sql语句id应该一一对应
  1. namespace和子元素的id联合保证唯一 , 区别不同的mapper
  2. 绑定DAO接口
  3. namespace命名规则 : 包名+类名

MyBatis 的真正强大在于它的映射语句,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,会立即发现省掉了将近 95% 的代码。MyBatis 为聚焦于 SQL 而构建,以尽可能地减少麻烦。

db.properties

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
username=root
password=123456
typeAliases优化
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
`<!--配置别名,注意顺序-->`
`<typeAliases>`
`<typeAlias type="com.da.pojo.User" alias="User"/>`
`</typeAliases>`

无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。

可以重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型。

MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过有参构造方法来实例化。如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。

作用域理解

  • SqlSessionFactoryBuilder 的作用在于创建 SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
  • SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象。因为 MyBatis 的本质就是 Java 对数据库的操作,所以 SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中,所以一旦创建了 SqlSessionFactory,就要长期保存它,直至不再使用 MyBatis 应用,所以可以认为 SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。
  • 由于 SqlSessionFactory 是一个对数据库的连接池,所以它占据着数据库的连接资源。如果创建多个 SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免发生这样的情况。
  • 因此在一般的应用中我们往往希望 SqlSessionFactory 作为一个单例,让它在应用中被共享。所以说 SqlSessionFactory 的最佳作用域是应用作用域。
  • 如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally… 语句来保证其正确关闭。
  • 所以 SqlSession 的最佳的作用域是请求或方法作用域。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@PreAuthorize("@ss.hasPermi('system:good:list')")
@GetMapping("/list")
public TableDataInfo list()
{
 startPage();
 List<GoodsGood> list = goodsGoodService.selectGoodsGoodList();
 return getDataTable(list);
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<el-col :span="1.5">
 <el-button
  type="warning"
  plain
  icon="el-icon-download"
  size="mini"
  @click="handleExport"
  v-hasPermi="['goods:good:export']"
 >导出</el-button>
</el-col>

handleExport() {
 this.download('goods/good/export', {
  ...this.queryParams
 }, `good_${new Date().getTime()}.xlsx`)
}

image.png

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class User {
    private int id;  //id
    private String name;   //姓名
    private String password;   //密码和数据库不一样!
    //构造
    //set/get
    //toString()
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//根据id查询用户
User selectUserById(int id);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<select id="selectUserById" resultType="user">
    select * from user where id = #{id}
</select>

<select id="selectUserById" resultType="User">
    select id , name , pwd as password from user where id = #{id}
</select>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void testSelectUserById() {
    SqlSession session = MybatisUtils.getSession();  //获取SqlSession连接
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.selectUserById(1);
    System.out.println(user);
    session.close();
}

使用结果集映射->ResultMap

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<resultMap id="UserMap" type="User">
    <!-- id为主键 -->
    <id column="id" property="id"/>
    <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
    <result column="name" property="name"/>
    <result column="pwd" property="password"/>
</resultMap>
<select id="selectUserById" resultMap="UserMap">
    select id , name , pwd from user where id = #{id}
</select>

自动映射在 MyBatis 中扮演着非常重要且强大的角色,其中 resultMap 元素更是起到了关键作用。使用它可以让繁琐的 JDBC ResultSet 数据提取代码中解放出来,甚至对于连接复杂语句的映射代码,一份 resultMap 也能代替数千行的代码。

ResultMap 的设计思想非常巧妙,简单语句无需配置显式的结果映射,而对于稍微复杂一点的语句,只需要描述它们之间的关系即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<select id="selectUserById" resultType="map">
    select id , name , pwd 
    from user 
    where id = #{id}
</select>

将所有的列映射到 HashMap 的键上,这由 resultType 属性指定。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<select id="selectUserById" resultMap="UserMap">
    select id , name , pwd from user where id = #{id}
</select>

<resultMap id="UserMap" type="User">
    <!-- id为主键 -->
    <id column="id" property="id"/>
    <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
    <result column="name" property="name"/>
    <result column="pwd" property="password"/>
</resultMap>

仓库地址:https://github.com/webVueBlog/JavaGuideInterview

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mybatis | Mybatis学习笔记(上)
Maven没有在build中配置resource,导致资源读取不到,因为正常情况下,xml配置文件应该放在resources目录下,而Maven约定大于配置,所以可能读取不到
啵啵鱼
2022/11/23
8940
Mybatis | Mybatis学习笔记(上)
Mybatis学习笔记
单个参数:不会做特殊处理,不管写什么直接映射进去,可用基本类型,也可传pojo 多个参数时:会特殊处理,将多参数处理成map,#{}就是从map集合中获取指定的key,所以获取的时候会有提示 `Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]` 默认--即参数可写arg1,arg2,arg3.....,或者param1,param2,param3....,现在的版本已经不用索引了,看版本把 map封装--在传参的时候明确写出参数名字,因为mybatis对参数是做map封装处理的 @param注解--key:@param注解来指定的值,#{指定的key},取出参数值,注解放在接口的方法的形参中 使用TO--来封装传输对象 pojo封装--属性是在pojo内部所有的 注意:如果传参是Collection、List或者数组,则不能用arg1,param1,使用的时候需要#{list[0]}、#{array[0]},因为mybatis会自动封装,多此一举? #{}和${}, #只能用于条件参数位置中的位置,而$能用于拼接任何地方的,比如下面只能用${} SELECT * FROM ${} ;
晚上没宵夜
2020/03/10
4580
MyBatis 极速入门
持久化是将程序数据在持久状态和瞬时状态间转换的机制。即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。JDBC就是一种持久化机制。文件IO也是一种持久化机制。
sowhat1412
2020/11/05
3K0
MyBatis 极速入门
初入Mybatis:简介及配置
org.apache.ibatis.binding.BindingException: Type interface com.rui.dao.UserDao is not known to the MapperRegistry.
乐心湖
2020/07/31
4050
MyBatis -- 必知必会
MyBatis的前身是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。2013年11月迁移到GitHub,因此目前MyBatis是由GitHub维护的。
宋先生
2019/07/18
1.1K0
SSM框架(五)Mybatis的配置和CRUD操作
MyBatis 是一个半自动化的ORM框架 (Object Relationship Mapping) →对象关系映射
HcodeBlogger
2020/07/14
4510
MyBatis入门
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
Java团长
2018/08/03
3960
MyBatis--框架学习
mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精 去处理加载驱动、创建连接、创建statement等繁杂的过程。
花猪
2022/02/23
5540
MyBatis--框架学习
SSM之Mybatis的学习
官方中文文档:https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases
Rochester
2020/09/01
6230
SSM之Mybatis的学习
myBatis笔记
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
HUC思梦
2020/09/03
1.5K0
myBatis笔记
MyBatis-ResultMap
上述语句只是简单地将所有的列映射到 HashMap 的键上,这由 resultType 属性指定。虽然在大部分情况下都够用,但是 HashMap 不是一个很好的模型。你的程序更可能会使用 JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 对象)作为模型。
愷龍
2022/12/31
4000
MyBatis-ResultMap
MyBatis实现增删改查
生成器这里选择Maven,然后名称可以自己命名,Archetype这里可以使用默认的也可以自己添加,这里使用自己添加的
愷龍
2022/12/20
5280
MyBatis实现增删改查
MyBatis
新建项目 1. 新建一个普通的maven项目 2. 删除src目录 3. 导入maven依赖
用户11332765
2024/10/28
1760
MyBatis
数据库访问框架 - Mybatis
MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为Mybatis。2013年11月迁移到Github。 iBatis一词源于”internet”和”abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAOS)。 mybatis 内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。 mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。 采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。
兜兜转转
2023/03/29
5.5K0
数据库访问框架 - Mybatis
MyBatis 实战:增删改查入门
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
耕耘实录
2021/12/07
5660
lagou 爪哇 1-1 mybatis 笔记
Mybatis框架是一个半自动的ORM持久层框架,也可以在Java中实现类似 insert(User)的操作最终操作数据库,但是需要我们自己写Sql语句。Mybatis是目前比较流行的Dao层框架。
acc8226
2022/05/17
7960
Spring与hibernate与mybatis
众所周知,hibernate与mybatis都是项目开发中对持久层封装的工具,可以大大的提高开发的速度,但是他们有什么区别呢?
Tim在路上
2020/08/04
8260
Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)
Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。
Kevin_Zhang
2019/02/20
1.3K0
Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)
day61_Mybatis学习笔记_01
  1、执行sql_table.sql脚本,创建数据库表;   2、执行sql_data.sql初始化测试数据。
黑泽君
2018/11/08
1.4K0
MyBatis 从入门到放弃 ( MyBatis基础总结 )
MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
愷龍
2022/11/12
9620
MyBatis 从入门到放弃 ( MyBatis基础总结 )
相关推荐
Mybatis | Mybatis学习笔记(上)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验