MyBatis 连接数据库与增删改查

news2024/11/13 15:38:21

❤️作者主页:微凉秋意
✅作者简介:后端领域优质创作者🏆,CSDN内容合伙人🏆,阿里云专家博主🏆
✨精品专栏:数据结构与课程设计
🔥系列专栏:javaweb

文章目录

  • 前言
  • 相关依赖、配置文件、工具类
    • mybatis-config.xml 的详细解释
    • 工具类 MybatisUtil
  • 增删改查操作
    • 根据 id 查询所有
    • 根据书名和价格查书
    • 插入操作
    • #{} 与 ${}的区别
  • 总结


前言

学习了一段时间的 mybatis,写此文章用于查漏补缺,整理该框架的使用流程。mybatis 原名iBatis,是一个持久层(dao)框架,提供了简便的操作数据库的功能(CRUD)。是对原生JDBC操作的封装,用来替换原生JDBC访问数据库。

相关依赖、配置文件、工具类

有关 jar 包我已经上传到 CSDN 的资源里(免费):mybatis 依赖,其中也包含一个log4j的配置文件,直接复制粘贴到src目录即可。

在这里插入图片描述

mybatis-config.xml 的详细解释

这是mybatis 中最重要的一个配置文件,内含很多标签:

<?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>
    <properties resource="db.properties"></properties> 
    
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    <!--typeAliases
        type :指明实体类
        alias :给实体类起的别名
        批量起别名:package name="实体类包" ,别名自动为短类名 com.xx.entity.Xxx = Xxx
    -->
    <typeAliases>
        <package name="com.qj.entity"/>
    </typeAliases>
    <!--
        配置数据库连接参数集
        default:指定当前使用的数据库连接
    -->
    <environments default="e1">
        <!--
            配置一个数据库连接
            id:值 自定义  给当前数据库连接起名字
        -->
        <environment id="e1">
            <!--
                指定事务提交的方式
                type :JDBC 使用默认的数据库事务操作
                       MANGED 使用第三方所编写的事务操作
            -->
            <transactionManager type="JDBC"></transactionManager>

            <!--配置数据库连接具体信息
                type: POOLED 使用数据库连接池
                      UNPOOLED 不使用连接池
            -->
            <dataSource type="POOLED">
                <property name="driver" value="${driverClassName}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>

        </environment>
    </environments>
    <mappers>
        <!--配置XXX_mapper.xml使用-->
        <!--<mapper resource="com/qj/mapper/BookDAOMapper.xml"/>-->

        <!--批量扫描,注册mapper.xml 写到包名即可-->
        <package name="com.qj.mapper"/>
    </mappers>
</configuration>
  1. 所有的标签需要写在 configuration 之内,这是配置文件的范围。
  2. properties 标签里引入的是有关数据库连接的资源文件,其位置在最上面。
    • 资源文件展示:
      在这里插入图片描述
  3. settings 用来开启二级缓存,这个会在缓存的知识中解释,位置在typeAliases与properties之间
  4. typeAliases 用来给实体类起别名,原来的名字默认为长名字,即 com.xx.包名.类名
    • 建议直接使用批量起别名的方法:package name = “实体类包”,别名自动为短类名
  5. environments 标签用来配置数据库连接参数集,default 指定当前的数据库连接
    • 注意:&是关键字,不能在 xml 文件直接使用(用&amp;代替)
    • 其余子标签我都加了注释,作用都很清晰
  6. mappers 用来注册XXXMapper.xml使用,两种配置方式,推荐批量扫描方式

工具类 MybatisUtil

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 java.io.IOException;
import java.io.InputStream;

public class MybatisUtil {
    private static SqlSessionFactory ssf;
    // 静态代码块在类加载的时候只执行一次
    static {
        try {
            // 1.获取配置文件
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            // 2.创建sqlSessionFactory利用build方法加载资源
             ssf = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            throw new RuntimeException("读取配置文件异常:" + e);
        }
    }
    // 获取sqlSession
    public static SqlSession getSqlSession() {
        // 获取sqlSession
        SqlSession sqlSession = ssf.openSession();
        return sqlSession;
    }

    // 释放资源
    public static void closeSqlSession(SqlSession sqlSession) {
        sqlSession.close();
    }
}

SqlSession 为mybatis中的数据库连接,需要通过工厂类SqlSessionFactory获取。需要加载一次,因此将其放入静态代码块中,同时静态成员函数才能访问静态变量,所以 ssf 要被static 修饰。

增删改查操作

dao 包变为 mapper ,接口的实现类也变为相应的 xml 文件,并且在xml文件的作用域中写上对应的mapper接口类。

根据 id 查询所有

mapper 中写接口:
在这里插入图片描述

对应xml文件写 sql:
在这里插入图片描述

这里的t_book_column是自己定义的一个 sql 标签的键,内容如下:
在这里插入图片描述这样写与 select * 效果一样,但是在运行时显然是前者更高效。

查询的返回值是Book 类型,使用resultMap来接收:
在这里插入图片描述

resultMap 常用来映射数据库字段与实体类属性,其妙用在一对一,一对多关系中更能体现。

#{} 用来读取参数,大括号里填写mapper接口中函数的参数。

接下来测试是否能够查询成功,编写 BookMapperTest:

public class BookMapperTest {
    @Test
    public void selectById() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        BookMapper mapper = sqlSession.getMapper(BookMapper.class);
        Book book = mapper.selectById(12);
        System.out.println(book);
    }
}

数据库连接为 sqlSession,通过获取接口的代理类对象来得到mapper 从而调用接口中的方法:
在这里插入图片描述

根据书名和价格查书

接口中的方法:

	Book selectByNameAndPrice(@Param("name") String name, @Param("price") double price);

xml 中的 sql :

	<select id="selectByNameAndPrice" resultMap="bookMap">
        <include refid="t_book_column"/>
        from t_book
        where book_name = #{name}
        and book_price = #{price}
    </select>

参数多的情况下需要使用注解来绑定参数,只有一个参数时可以在{}中随便写,但是习惯上和接口中的参数保持一致。

插入操作

接口中的方法:

	void insert(Book book);

xml 中的 sql :

	<insert id="insert">
        insert into t_book
        values (null, #{bookName}, #{bookPrice}, #{bookDesc})
	</insert>

插入和修改操作类似,传入的是一个类对象,参数直接写属性即可。
一旦给对象参数加上了注解,那就需要用这样的形式:“键.属性”

#{} 与 ${}的区别

#{}本质上是占位符,而${}本质上是字符串拼接,二者区别:

  • ?占位符可以防止 sql注入攻击,但是只能绑定数据,不能绑定关键字
  • 字符串拼接容易被sql注入,但是可以绑定关键字等

总结

  • 使用 sql 标签代替 select * 提高运行效率
  • 查询结果无论是实体类还是实体类集合,都要写配置好的resultMap
  • 除了 查找 操作,增、删、改需要自己提交事务,mybatis 并不会自动提交
  • 函数中的参数多的时候使用注解,类对象加上注解后不能直接写属性

这部分为mybatis的基础部分,掌握简单的增删改查以及配置文件的配置即可。表连接动态sql缓存等内容下篇文章总结,需要的小伙伴可以订阅专栏。

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

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

相关文章

C++设计模式(8)——命令模式

命令模式 亦称&#xff1a;动作、事务、Action、Transaction、Command 意图 命令模式是一种行为设计模式&#xff0c; 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中&#xff0c; 且能…

linux基本功系列之-lsattr命令实战

文章目录一. lsattr命令实战二. 语法格式及常用选项三. 参考案例3.1 查看指定文件上的隐藏属性&#xff1a;3.2 查看目录的隐藏属性3.3 查看目录中全部文件的隐藏属性总结前言&#x1f680;&#x1f680;&#x1f680; 想要学好Linux&#xff0c;命令是基本功&#xff0c;企业中…

英语学习打卡day4

2023.1.24 1.out of curiosity 出于好奇 out of necessity 出于必要 out of interest 出于利益 out of sympathy 出于同情 out of respect 出于尊敬 out of’ fear 出于害怕 out of desperation 出于不得已/绝望 2.ashore adv.向(或在)岸上;上岸 a在… …的 shore岸- >在…

Java 23种设计模式(5.结构型模式-代理模式)

结构型模式 代理模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。 它分为类结构型模式和对象结构型模式&#xff0c;前者采用继承机制来组织接口和类&#xff0c;后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低&#xff0c;满足“合成…

分享127个ASP源码,总有一款适合您

ASP源码 分享127个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 127个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1JpOFmxkovbScxmz0_MhUWg?pwd758t 提取码&#x…

算法:一维与二维最大连续子序列和(子矩阵和,c++实现 动态规划)

文章目录一维最大连续子序列和代码示例二维最大连续子序列和、代码示例一维最大连续子序列和 给你一个序列 【-1&#xff0c;-2&#xff0c;3&#xff0c;6&#xff0c;4&#xff0c;-9】的最大的连续的子序列和的值。 什么是最大连续子序列和&#xff0c;首先要满足两个条件…

Java基础 Stream流方法引用异常

Stream流 引例 需求&#xff1a;按照下面要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 1. 把所有以“曹”开头的元素存储到新集合中 2. 把曹开头&#xff0c;长度为3的元素存储到新集合中 List<String> list List.of("曹操", "…

19.2、Javaweb案例_Servlet代码抽取优化分页数据redis缓存优化分页数据展示

优化Servlet 目的 减少Servlet的数量&#xff0c;现在是一个功能一个Servlet&#xff0c;将其优化为一个模块一个Servlet&#xff0c;相当于在数据库中一张表对应一个Servlet&#xff0c;在Servlet中提供不同的方法&#xff0c;完成用户的请求。 Idea控制台中文乱码解决&…

线性代数复习——行列式

文章目录第一章 行列式1.1 克拉默法则1.2 n阶行列式1.3 特殊行列式1.4 行列式的性质和推论1.5 余子式和代数余子式1.6 范德蒙德行列式第一章 行列式 1.1 克拉默法则 举例&#xff1a; 对于三元线性方程组 {a11x1a12x2a13x3b1a21x1a22x2a23x3b2a31x1a32x2a33x3b3(1)\begin{cas…

Allegro如何自动导弧操作指导

Allegro如何自动导弧操作指导 在做PCB设计的时候,经常会需要给信号线导弧,如果有大量的走线,导弧线是个比较费时间的工作,Allegro可以自动给信号线导弧,如下图 具体操作如下 选择Route选择Unsupported Prototypes

金融帝国实验室(Capitalism Lab)官方正版游戏『优惠活动政策』

「金融帝国实验室」&#xff08;Capitalism Lab&#xff09;Enlight 官方正版游戏「2023春节特卖」 ■时间&#xff1a;2023.01.21&#xff5e;2023.02.28 ■游戏开发商&#xff1a;Enlight Software Ltd. 请您认准以下官方正版游戏购买链接&#xff1a;支持“支付宝&a…

使用ebpf 监控mysqld 内核

一、开发思路分析 我们使用ebpf 监控mysql的话有两个思路去做这件事情 1、kprobe -> hook 掉tcp_sendmsg 和 tcp_recvmsg 一类的内核函数去分析网络协议 2、uprobe -> hook 掉 mysqld 的api函数&#xff0c;然后在此基础上进行统计 我使用的是uprobe 去hook 掉mysql内…

24. 面向对象的思想

1. 面向对象 类似于c/c#/java等高级语言&#xff0c;python从设计之初就已经是一门面向对象的语言&#xff0c;正因为如此&#xff0c;在python中创建一个类和对象是很容易的。关于面向对象的思想及基础&#xff0c;此处不再赘述。 2. 类对象 (1) 类变量&#xff1a;类变量在…

计算机毕业设计选题推荐基于nodejs+Vue360学生宿舍系统

管理员&#xff1b;首页、个人中心、宿舍信息管理、学生管理、宿舍报修管理、访客信息管理、水电费管理、管理员管理、交流论坛、系统管理&#xff0c;学生&#xff1b;首页、个人中心、宿舍报修管理、水电费管理&#xff0c; 前台首页&#xff1b;首页、交流论坛、通知公告、个…

STM32之HAL源码阅读(GPIO章节)

前言 说明 本文只针对于软件层面的阅读&#xff0c;详细操作请查阅对应的手册,使用过标准库的朋友更好的能理解本文针对的是STM32F10x系列&#xff0c;其他的类似 参考资料 STM32F10x中文参考手册 工具 stm32cubemx6.5clion最新版 HAL源码之GPIO的阅读 步骤一&#xff…

Cesium:Indexed 3D Scene Layers (I3S)加载

点击此处,查看完整的OGC标准列表项。Indexed 3D Scene Layers(I3S)标准官网介绍地址为:I3S,相关的GitHub主页地址为:Esri/i3s-spec,其详细介绍文档地址可点击此处查阅。我们的核心点在于介绍如何通过Cesium.js开发框架加载I3S三维场景服务。 目录 Cesium.js:I3S支持情…

JUC面试(九)——Synchronized和Lock的区别

Synchronized和Lock的区别 前言 对象锁&#xff08;synchronized method{}&#xff09;和类锁&#xff08;static sychronized method{}的区别 对象锁也叫实例锁&#xff0c;对应synchronized关键字&#xff0c;当多个线程访问多个实例时&#xff0c;它们互不干扰&#xff0…

基于蜣螂优化的BP神经网络(分类应用) - 附代码

基于蜣螂优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录基于蜣螂优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.蜣螂优化BP神经网络3.1 BP神经网络参数设置3.2 蜣螂算法应用4.测试结果&#xff1a;5.Mat…

Ubuntu16.04安装N卡驱动

最近碰到个实验&#xff0c;需要用pytorch0.4和python2.7的环境&#xff0c;因为环境比较老&#xff0c;所以新显卡可能不能装。紧急联系朋友搞了张1660ti想来跑实验&#xff0c;结果光是驱动就碰了一鼻子灰&#xff0c;这里简单做下总结&#xff0c;引以为戒。首先是系统版本&…

Python for循环及用法详解

Python 中的循环语句有 2 种&#xff0c;分别是 while 循环和 for 循环&#xff0c;前面章节已经对 while 做了详细的讲解&#xff0c;本节给大家介绍 for 循环&#xff0c;它常用于遍历字符串、列表、元组、字典、集合等序列类型&#xff0c;逐个获取序列中的各个元素。for 循…