MyBatis速成

news2025/1/16 5:46:21

一、MyBatis简介

1、基本概念

MyBatis是一个持久层框架,用于简化JDBC开发。

表现层:页面展示;     业务层(service):逻辑处理;   持久层(dao):将数据保存到数据库。

2、JDBC编码与MyBatis优化示例

 JDBC硬编码,将所有信息直接写在编码内,耦合度高,代码繁琐;MyBatis将连接信息和SQL语句分别写在配置文件中来简化。 最后的手动设置参数也都直接简化。

二、MyBatis快速入门

                                                                        《查询user表中所有数据》

总结三小步:cv一下MyBatis-config核心配置文件、sql映射文件、创建SqlSessionFactory工厂对象,执行sql并返回查询结果

1、MyBatis核心配置文件(mybatis-config.xml):注册驱动(driver)、数据库连接(url username password)、加载sql映射文件mappper(路径查找 || 包扫描);

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
<!--                数据库连接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="wbj731290"/>
            </dataSource>
        </environment>
    </environments>

<!--    加载SQL映射文件有俩种方法:1、resource路径查找;2、包扫描-->
    <mappers>

<!--        1、由于Usermapper在同一目录下采用相对路径-->
        <mapper resource="UserMapper.xml"/>

<!--        2、包扫描方法-->
        <package name="com/itheima/mapper"/>

    </mappers>
</configuration>

2、sql映射文件(XXXMapper.xml):书写sql语句、绑定对应的实体类

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namesoace:名称空间(改为自定义名称))
-->
<mapper namespace="test">
<!--    定义查询语句-->
    <select id="selectAll" resultType="com.itheima.User">
        select * from tb_user;
    </select>
</mapper>

3、创建sqlsessionFactory工厂对象、执行sql

public class MyBatisDemo {
    public static void main(String[] args) throws IOException {
        //1、加载MyBatis核心配置文件 ,获取sqlsessionfactory
        String resource = "mybatis-config.xml";
        //将获取的资源转化为字节输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //将字节输入流作为参数建立sqlsession工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2、获取sqlsession对象 用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3、执行sql
        List<User> users = sqlSession.selectList("test.selectAll");
        System.out.println(users);

        //4、释放资源
        sqlSession.close();
    }
}

 4、在右栏Database设置

三、mapper代理开发

目的:解决原生开发中的硬编码;简化后期执行sql。

分析:在MyBatisDemo执行类中执行sql语句

List<User> users = sqlSession.selectList("test.selectAll");

需要参数sql映射文件内的namespace和id 这就造成了执行类和sql映射文件的耦合

此案例中只有一个查询语句,实际开发中需要无数的查询语句,不可能一个个写,所以就创建获取UserMapper接口,来作为管理sql查询与sqlSession对象的“桥梁”。

1、创建sql映射文件同名的Mapper接口并使两者在同一目录下。

不是直接将sql映射文件拖拽到Mapper接口目录下!

在resources配置文件目录下新创建与接口同目录名的Directory (创建时用/作为分隔符),将sql映射文件拖拽到新创建的Directory下即可。

注意:同时要改变mybatis-config.xml核心配置文件mapper的路径!!!

copy path -》path from source root

更加方便的就是在mybatis-config.xml核心配置文件中使用包扫描:

同时可以处理大量的包

        <package name="com/itheima/mapper"/>

2、设置sql映射文件namespace属性为Mapper接口全限定名(接口的绝对路径)。

<mapper namespace="com.itheima.mapper.UserMapper">
<!--    定义查询语句-->
    <select id="selectAll" resultType="com.itheima.pojo.User">
        select * from tb_user;
    </select>
</mapper>

3、Mapper接口中定义方法,方法名为sql映射文件的id

    List<User>selectAll();
//返回多个集合,用List,resultType是User

四、MyBatis核心配置文件

1、environments:配置数据库连接环境信息,可配置多个environment,通过属性default切换不同的environment。(可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境)

2、transactionManager(事务管理方式)可以选择JDBC、spring等

3、dataSource type 数据源类型

4、mappers 加载sql映射文件

很不同!!!配置各个标签时需要遵守先后顺序

五、配置文件完成增删改查

 1、安装mybatisx插件

 处理sql映射文件内的查询语句的id和返回值类型 与 对应的接口内的方法一一对应

析:实现增删改查功能,最基本的就是编写接口方法(Mapper接口)、编写SQL语句(SQL映射文件)、执行类使用sqlSession对象执行。注意一个Mapper接口与一个SQL映射文件唯一对应

2、SQL映射文件中使用resultMap映射实体类解决数据库属性名与项目的实体类内部的实体属性名称不一致

步骤:  1、定义<resultMap>标签

                2、在<result>标签中使用resultMap属性替换resultType属性

type作用:找到Mapper配置文件对应的实体类。要么写resources path 比如com.itheima.Brand

要么在mybatis核心配置文件配置别名。

 id:唯一标识 -->
<!--    type:映射的类型,支持别名-->

    <resultMap id="brandResultMap" type="brand">
<!--        id:完成主键字段的映射-->
<!--        result:完成一般字段的映射-->
<!--            column表的列名-->
<!--            property实体类的属性名-->

        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>

    </resultMap>

    <select id="selectAll" resultMap="brandResultMap">
        select *
        from tb_brand;
    </select>

3、对于SQL映射文件中SQL语句采用了模糊匹配like 那么在使用参数时也要编程中模糊处理。

前后都要加上%

        int status = 1;
        String companyName = "华为";
        String brandName = "华为";

        companyName ="%" + companyName + "%";
        brandName ="%" + brandName + "%";

4、

散装参数: 使用注解@Param

List<Brand> selectByCondition(@Param("status")int status, @Param("companyName")String companyName, @Param("brandName")String brandName);

实体封装参数

执行类创建实体对象

        int status = 1;
        String companyName = "华为";
        String brandName = "华为";

        companyName ="%" + companyName + "%";
        brandName ="%" + brandName + "%";

        Brand brand = new Brand();
        brand.setStatus(status);
        brand.setCompanyName(companyName);
        brand.setBrandName(brandName);

接口中方法的参数改为对象

    List<Brand> selectByCondition(Brand brand);

map集合创建的是map对象而已。

5、添加add数据

insert into tb_brand(brand_name, company_name,ordered,description,status)
values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
openSession():默认开启事务,进行增删改查后需要使用sqlSession.commit();手动提交事务
openSession(true):设置为自动提交事务
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2、获取sqlsession对象 用它来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //3、获取UserMapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
brandMapper.add(brand);

        

<获取添加数据的主键>

 <insert id="add" useGeneratedKeys="true" keyProperty="id">
        insert into tb_brand(brand_name, company_name,ordered,description,status)
        values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
 

在添加时就有了id,需要使用useGeneratedKeys 和 keyProperty属性即可。然后再通过对象get就可以。

6、更新数据

sql映射文件--全字段更新

<update id="update">
        update tb_brand
        set
            status = #{status},
            company_name = #{companyName},
            brand_name = #{brandName},
            ordered = #{ordered},
            description = #{description}
        where id = #{id};
    </update>

7、删除

删除一个

<delete id="deleteById">
        delete from tb_brand where id = #{id};
    </delete>

以实体对象作为删除操作的对象,对象传参id,即删除指定id的对象。

批量删除

<delete id="deleteByIds">
        delete from tb_brand
        where id in(
        <foreach collection="ids" item="id" separator="," >
            #{id}
        </foreach>)
    </delete>

对应的方法:    void deleteByIds(@Param("ids")int[]ids);
mybatis会将数组参数封装为一个map集合
默认 array = 数组(即collection应该写array)
使用@Param()注解改变map集合的默认key名称

六、注解完成增删改查

注解开发 也就是不再需要sql映射文件 ,在定义接口时直接写上注解对应的sql语句

注解开发只适用于简单功能。基本不用。

七、动态SQL

动态SQL:SQL语句随着用户的输入或外部条件的变化而变化。

常用标签四个 :if、choose (when, otherwise)、trim (where, set)、foreach

案例1:多条件随机查询

<!--    if:条件判断-->
<!--        test标签内写逻辑表达式-->
<!--    解决未输入某些参数导致SQL语句格式错误-->
<!--    使用<where>标签代替where-->
    <select id="selectByCondition" resultMap="brandResultMap">
        select *
        from tb_brand
        <where>
        <if test="status != null">
            status = #{status}
        </if>
        <if test="companyName != null and brandName != null ">
            and company_name like #{companyName}
        </if>
        <if test="companyName != null and brandName != null ">
            and brand_name like #{brandName}
        </if>
        </where>
     </select>

案例2:单条件查询

 案例3:动态更新字段

如果没有动态更新,就直接只改变某些字段的数据,那么其他数据就会被置为null。

只需要在sql映射文件的标签上设置就好了。

 <update id="update">
        update tb_brand
        <set>
            <if test="brandName != null and brandName !='' ">
                brand_name = #{brandName},
            </if>
            <if test="companyName != null and companyName !=''">
                company_name = #{companyName},
            </if>
            <if test="ordered != null">
                ordered = #{ordered},
            </if>

            <if test="description != null and description !=''">
                description = #{description},
            </if>
            <if test="status != null ">
                status = #{status}
            </if>
        </set>
        where id = #{id};

    </update>

总结

通过目录关系分析执行过程:

mybatis干啥的?就是通过sql语句在本地远程操作数据库。

首先就是实体类和sql映射文件负责处理数据库部分;mybatis核心配置文件负责连接数据库和加载sql映射文件;然后执行类必须有,就是建立sqlSession执行方法,也就是接口类中的方法,方法就是SQL映射文件里面的sql语句,那么接口又是怎么连接到sql映射文件从而读取方法?

就是将sql映射文件和接口放在同一个路径下,具体实现看上文。

在执行类执行方法,就会找接口,接口就会找到sql映射文件中对应的sql语句,然后就会远程执行数据库。

得会啥呢??

mybatis核心配置文件要晓得写吧。

得晓得要写Mapper接口、Mapper配置文件(SQL映射文件)吧。

你连接数据库,实体类得晓得要写吧。

再写一个执行类要的吧。

开发文档链接:mybatis – MyBatis 3 | 简介

对比:参数占位符${} 和#{}

#{}会将其替换为?。为了防止SQL注入。经常使用。

${}拼SQL,存在SQL注入问题。

特殊字符处理:<![CDATA[ 此处填写需要写的特殊字符 ]]>

起别名:

 要写在mybatis核心配置文件中

1、给实体类起别名

<typeAliases>
    <typeAlias type="com.pjx.pojo.User" alias="UserDao"/>
</typeAliases>

2、指定的一个包名,则包下的类名首字母小写作为别名

  <typeAliases>
       <package name="com.pjx.pojo"/>
    </typeAliases>

3、使用注解更改别名:

@Alias()

在这里插入图片描述

 mybatis参数传递

使用Param注解定义参数的名称,此名称要和sql语句占位符内的参数名称保持一致

 

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

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

相关文章

Access开发ERP简单主框架搭建

哈喽,哈喽,大家好! 今天我们接着来讲ERP,我们已经把理论知识与表结构讲完了,接下去我们开始讲最关键的业务部分的开发,这里也是大家最期待的。这里我们将会把系统分成几个部分来讲解,包括整个系统基本模块、基础信息、销售管理、采购管理、生产管理、仓库管理。今天的话…

微信小游戏投放量增长五倍,下半年买量能怎么玩?

App中运行小游戏的技术价值和业务价值都是显著的&#xff1a;通过小程序容器技术&#xff0c;承载多样化的小游戏运行在自有App内&#xff0c;实现跨平台的游戏资源共享&#xff0c;降低买量成本&#xff0c;此为「降本」。进一步的&#xff0c;在App内快速引入多小游戏应用&am…

载入内存,让程序运行起来

如果你的电脑上安装了QQ&#xff0c;你希望和好友聊天&#xff0c;会双击QQ图标&#xff0c;打开QQ软件&#xff0c;输入账号和密码&#xff0c;然后登录就可以了。 那么&#xff0c;QQ是怎么运行起来的呢&#xff1f; 首先&#xff0c;有一点你要明确&#xff0c;你安装的QQ软…

智能数据建模软件DTEmpower 2023R2新版本功能介绍

DTEmpower是由天洑软件自主研发的一款通用的智能数据建模软件&#xff0c;致力于帮助工程师及工科专业学生&#xff0c;利用工业领域中的仿真、试验、测量等各类数据进行挖掘分析&#xff0c;建立高质量的数据模型&#xff0c;实现快速设计评估、实时仿真预测、系统参数预警、设…

哪个品牌的触控笔质量好?学生党电容笔选购推荐

相信不少学生党都开始为开学而作准备了&#xff0c;然而电容笔一直都受学生党的广泛喜爱。苹果的Pencil&#xff0c;在性能上确实非常的优秀&#xff0c;但价格却非常的昂贵&#xff0c;一般人根本用不起。现在市面上出现了许多价格便宜、易用的平替电容笔&#xff0c;所以受到…

图文详解Vue slot和slot-scope的用法和区别

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

APSIM模型参数优化 批量模拟丨气象数据准备、物候发育和光合生产、物质分配与产量模拟、土壤水分平衡算法、土壤碳氮平衡模块、农田管理模块等

随着数字农业和智慧农业的发展&#xff0c;基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…

陈可之油画|艺术|夔门,好一个天然门户!

《吉祥夔门》 尺寸&#xff1a;56x86cm 陈可之2009年绘 “赤甲白盐俱刺天&#xff0c;闾阎缭绕接山巅。”“夔子巴峡冲&#xff0c;风物异蜀境。”古老的夔门由于其独特的地貌&#xff0c;留下了好多万古流芳的诗句。而陈可之先生&#xff0c;踏足三峡二十余载&#xff0c;用画…

轻松合并视频并添文案,一键让你的作品更出彩

在这个视觉时代&#xff0c;视频已成为展现个性、传递信息的重要方式。你是否经常为了合并多段视频而烦恼&#xff1f;是否苦于缺乏文案添加工具&#xff1f;别担心&#xff01;我们带来了一款强大的视频剪辑工具&#xff0c;让你的创意无处不展现&#xff01; 首先第一步&…

Nginx代理功能与负载均衡详解

序言 Nginx的代理功能与负载均衡功能是最常被用到的&#xff0c;关于nginx的基本语法常识与配置已在上篇文章中有说明&#xff0c;这篇就开门见山&#xff0c;先描述一些关于代理功能的配置&#xff0c;再说明负载均衡详细。 Nginx代理服务的配置说明 1、上一篇中我们在http…

SpringBoot第37讲:SpringBoot数据库管理 - 用Liquibase对数据库管理和迁移

SpringBoot第37讲&#xff1a;SpringBoot数据库管理 - 用Liquibase对数据库管理和迁移 Liquibase是一个用于跟踪、管理和应用数据库变化的开源工具&#xff0c;通过日志文件(changelog)的形式记录数据库的变更(changeset)&#xff0c;然后执行日志文件中的修改&#xff0c;将数…

JavaScript进阶 第三天

编程思想构造函数原型 一.编程思想 面向过程&#xff1a;分析出解决问题所需要的步骤&#xff0c;然后利用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个依次调用就可以了&#xff08;按照步骤划分&#xff09;面向对象&#xff1a;把事务分解成一个个对象&…

网络通信原理IP头部格式(第四十二课)

字段作用解析:1)版本: 指的IP地址的版本 (IPv4 或 IPV6)2)首部长度: 次数据包的首部长度一共是多少,没有加可选项3)优先级与服务类型:表示****数据包是否需要优选传递4)总长度: 表示的是整个数据包的大小,也就****是首部+数据5)标识符、标志、段偏移量:的作用将拆开的…

Java基础篇--重写(Override)与重载(Overload)

目录 重写&#xff08;Override&#xff09; 重写&#xff08;override&#xff09;的规则&#xff1a; 重载&#xff08;Overload&#xff09; 重载&#xff08;overload&#xff09;的规则&#xff1a; 示例代码 重写与重载之间的区别 总结 在Java中&#xff0c;重写…

Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理

Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理 目录 Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理 一、简单介绍 二、实现原理 三、注意事项 四、实现步骤 五、关键代码 一、简…

港科夜闻|香港科大(广州)与南沙科金控股签订战略合作协议,为南沙创新生态与高质量发展提供持续强劲动力...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大(广州)与南沙科金控股签订战略合作协议&#xff0c;为南沙创新生态与高质量发展提供持续强劲动力。双方将以此为契机&#xff0c;立足自身资源优势&#xff0c;完善合作机制&#xff0c;深化合作领域&#xff0c…

MOM or MES:如何选择适合工厂的制造管理系统?

在现代制造业中&#xff0c;有效的制造管理系统对于工厂的生产效率和竞争力至关重要。这衍生出来了两个常见的解决方案&#xff1a;MOM&#xff08;Manufacturing Operations Management&#xff09;制造管理系统和MES&#xff08;Manufacturing Execution System&#xff09;制…

无涯教程-Perl - socketpair函数

描述 此函数使用PROTOCOL在指定的DOMAIN(指定的TYPE)中创建一对未命名的连接Socket。如果未实现系统socketpair()函数,则将导致致命错误。 语法 以下是此函数的简单语法- socketpair SOCKET1, SOCKET2, DOMAIN, TYPE, PROTOCOL返回值 如果失败,此函数返回0,如果成功,则返回…

基于STM32CUBEMX驱动TMOS模块STHS34PF80(5)----配置嵌入式函数

基于STM32CUBEMX驱动TMOS模块STHS34PF80----4.中断获取信号 概述样品申请视频教程参考Demo参考Demo内嵌函数地址串口配置IIC配置IO口设置串口重定向参考程序初始化IIC写函数IIC读函数获取ID设备的自动引导过程和关机模式配置省电模式温度数据的灵敏度值设置低通滤波器温度测量滤…

Java算法_ 反转二叉树(LeetCode_Hot100)

题目描述&#xff1a;给你一棵二叉树的根节点 &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。root。 获得更多&#xff1f;算法思路:代码文档&#xff0c;算法解析的私得。 运行效果 完整代码 /*** 2 * Author: LJJ* 3 * Date: 2023/8/16 13:18* 4*/public class In…