【JavaEE】MyBatis

news2024/11/26 16:41:49

文章目录

    • 1.MyBatis介绍
    • 2.MyBatis快速入门
    • 3.Mapper代理开发
    • 4.MyBatis核心配置文件
    • 5.配置文件完成增删改查
      • 5.1 查询
      • 5.2 添加/修改
      • 5.3 删除
    • 6.MyBatis参数传递
    • 7.注解完成增删改查

1.MyBatis介绍

1.什么是MyBatis?

  • MyBatis是一款优秀的 持久层框架用于简化JDBC开发
  • MyBatis本是 Apache 的一个开源项目 iBatis,2010年这个项目由 apache software foundation 迁移到了 google code,并且改名为 MyBatis。2013年11月迁移到 Github
    官网:https://mybatis.org/mybatis-3/zh/index.html
     

2.持久层

  • 负责将数据到保存到 数据库 的那一层代码
  • JavaEE三层架构:表现层、业务层、持久层
     

3.框架

  • 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
  • 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展

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

 

2.MyBatis快速入门

查询 user 表中所有数据

在这里插入图片描述

1、添加依赖:
在这里插入图片描述
2、编写mybatis-config.xml配置文件
在这里插入图片描述
3.编写sql语句映射文件(UserMapper.xml)
在这里插入图片描述
4.获取工厂构造的对象,执行sql语句
在这里插入图片描述

 

3.Mapper代理开发

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

1.定义接口,返回值类型、方法名对应映射文件
在这里插入图片描述
2.maper映射文件放置相同目录下,名称空间为接口全限定名
在这里插入图片描述
3.mapper代理方式mybatis-config.xml可以使用包扫描的方式加载映射文件
在这里插入图片描述
4.获取 Mapper 接口对象,调用相应方法执行sql语句
在这里插入图片描述

 

4.MyBatis核心配置文件

配置的属性应符合以下顺序(官网),否则报错
在这里插入图片描述

<?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>

    <!-- 给该包下的类起别名,为类名,不区分大小写 -->
    <typeAliases>
        <package name="com.eve.pojo"/>
    </typeAliases>

    <!--
        environments: 配置数据库连接环境信息, 通过default设置:development、test
    -->
    <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="abc123"/>
            </dataSource>
        </environment>
        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 连接信息 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///testdb?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="abc123"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!-- 加载sql映射文件 -->
        <!--<mapper resource="com/eve/mapper/UserMapper.xml"/>-->
        <!-- mapper代理方式(包扫描的方式) -->
        <package name="com.eve.mapper"/> <!-- 扫描些目录下的所有映射文件 -->
    </mappers>
</configuration>

 

5.配置文件完成增删改查

MyBatis动态Sql:
在这里插入图片描述

MyBatisX插件:
在这里插入图片描述

在这里插入图片描述

 

5.1 查询

1、表列和与属性名不一样(resultMap标签)、特殊字符处理(转义字符、CDATA区)

<?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">
<mapper namespace="com.eve.mapper.BrandMapper">

    <!--
        数据库表中属性的名称和实体类属性名不一样:
            * 起别名:对不一样的别名起和pojo实体类相同的名称(每次查询都要起别名)
            * sql片断: 定义一个sql片断,然后导入(不灵活)
            * resultMap: id唯一标识,type映射的类型,column列名,property实体类属性类

        参数占位符:
            1. #{}: 会替换为 ? 占位符, 为防止 SQL 注入
            2. ${}: 拼SQL, 存在 SQL 注入问题
            3. 参数传递时使用 #{}
            4. 表名或列名不固定的情况下可以使用 ${}
            5. 参数类型: parameterType, 可以不写
            6. 特殊字符: 如 < 在这里是标签的起始符,
                * 转义字符: <  &gt;
                * CDATA区: <![CDATA[ ______ ]]> (纯文本处理)
    -->

    <resultMap id="brandResultMap" type="com.eve.pojo.Brand">
        <!-- id: 主键字段的映射,result: 一般字段的映射 -->
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>

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

    <select id="selectById" resultMap="brandResultMap">
        select *
        from tb_brand where id = #{id};
    </select>

    <select id="selectById1" resultMap="brandResultMap">
        select *
        from tb_brand where id
        <![CDATA[

        ]]>
        #{id};
    </select>

</mapper>

 
2、多参数传递(多个参数、对象、集合)

在这里插入图片描述

public class BrandMapperTest {

    @Test
    public void selectByCondition() throws IOException {
        // 接收参数
        int status = 1;
        String companyName = "华为";
        String brandName = "华为";

        // 处理参数
        companyName = "%" + companyName + "%";
        brandName = "%" + brandName + "%";

        // 封装对象
//        Brand brand = new Brand();
//        brand.setStatus(status);
//        brand.setCompanyName(companyName);
//        brand.setBrandName(brandName);

        Map map = new HashMap();
        map.put("status",status);
        map.put("companyName",companyName);
        map.put("brandName",brandName);

        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

        List<Brand> brands = mapper.selectByCondition(map);
        System.out.println(brands);

    }
}

 
2、动态条件查询

在这里插入图片描述
 
多条件动态查询:
在这里插入图片描述
 
单条件查询:
在这里插入图片描述
在这里插入图片描述

 

5.2 添加/修改

添加:在这里插入图片描述
 
返回主键(两个属性)

在这里插入图片描述
 
修改:
在这里插入图片描述
 
动态修改(set标签)
在这里插入图片描述

 

5.3 删除

在这里插入图片描述
 
批量删除(foreach标签)
在这里插入图片描述

 

6.MyBatis参数传递

在这里插入图片描述
 
封装:

在这里插入图片描述

 
MyBatis封装参数方法源码:

public Object getNamedParams(Object[] args) {
      int paramCount = this.names.size();
       if (args != null && paramCount != 0) {
           if (!this.hasParamAnnotation && paramCount == 1) {
               Object value = args[(Integer)this.names.firstKey()];
               return wrapToMapIfCollection(value, this.useActualParamName ? (String)this.names.get(0) : null);
           } else {
               Map<String, Object> param = new MapperMethod.ParamMap();
               int i = 0;

               for(Iterator var5 = this.names.entrySet().iterator(); var5.hasNext(); ++i) {
                   Map.Entry<Integer, String> entry = (Map.Entry)var5.next();
                   param.put(entry.getValue(), args[(Integer)entry.getKey()]);
                   String genericParamName = "param" + (i + 1);
                   if (!this.names.containsValue(genericParamName)) {
                       param.put(genericParamName, args[(Integer)entry.getKey()]);
                   }
               }

               return param;
           }
       } else {
           return null;
       }
}

 
&、map传递时,如何取出里面的User对象里的username、password值
在这里插入图片描述

<select id="selectBrandByName" resultMap="brandResultMap">
      select *
      from tb_brand
      where brand_name = #{brand.brandName}
      and company_name = #{brand.companyName};
</select>

 

7.注解完成增删改查

在这里插入图片描述

使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java注解不仅力不从心,还会让你本就复杂的SQL语句更加混乱不堪。因此,如果你需要做一些很复杂的操作,最好用XML来映射语句。
 
选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和ML的语句映射方式间自由移植和切换。

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

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

相关文章

STC 51单片机46——看门狗测试

#include <reg52.h> sfr WDT_CONTR 0xE1; //声明WDT_CONTR void delay(void){ //改变延时长度&#xff0c;可以观测是否触发看门狗 unsigned char i,j,k; for(i0;i<255;i) for(j0;j<255;j) for(k0;k<255;k); } void…

图神经网络

前言 图与图的表示 图是由一些点和一些线构成的&#xff0c;能表示一些实体之间的关系&#xff0c;图中的点就是实体&#xff0c;线就是实体间的关系。如下图&#xff0c;v就是顶点&#xff0c;e是边&#xff0c;u是整张图。attrinbutes是信息的意思&#xff0c;每个点、每条…

MFC界面控件BCGControlBar v33.3 - 升级Ribbon Bar自定义功能

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 该版本包含了增强的Ribbon自定义、新的日期/时间数字指示器、带有文本对齐的组控件、多行支持以及其他一些新功…

第二证券|12月A股投资方向来了!这些板块已先涨为敬

日前&#xff0c;我国银河、信达证券、中泰证券、安全证券等多家券商连续发布12月A股月度出资组合。全体上券商对后市持活跃情绪&#xff0c;以为当时商场处于震动磨底装备区间&#xff0c;商场动摇并不影响“暖冬行情”的延续&#xff0c;一些活跃的券商以为后市有望走出季度级…

R语言rcurl抓取问财财经搜索网页股票数据

问财财经搜索是同花顺旗下的服务之一,主要针对上市公司的公告、研报、即时新闻等提供搜索及参考资料。相对于其他股票软件来说&#xff0c;一个强大之处在于用自然语言就可以按你指定的条件进行筛选。而大部分现有的行情软件支持的都不是很好&#xff0c;写起来就费尽心思&…

Nginx加载Lua脚本链接mysql

1、nginx加载lua脚本方法可参我的这篇文章 Nginx安装Openresty加载Lua代码_IT东东歌的博客-CSDN博客 2、测试代码 官网 https://github.com/openresty/lua-resty-mysql local mysql require "resty.mysql" local db, err mysql:new() if not db then ngx.sa…

Django 第四章 模版系统详解(ORM数据模型-使用mysql数据库增删改查)

djiango模版系统&#xff1a; 用于自动渲染一个文本文件&#xff0c;一般用于HTML页面&#xff0c;模版引擎渲染的最终HTML内容返回给客户端浏览器 模版系统分成两部分 静态部分&#xff1a; 例如html css .js 动态部分 djiango 模版语言&#xff0c;类似于jinja语法变量定义&…

SpringCloud 组件Gateway服务网关【全局过滤器】

目录 1&#xff0c;全局过滤器 1.1&#xff1a;全局过滤器作用 1.2&#xff1a;自定义全局过滤器 1.3&#xff1a;过滤器执行顺序、 2&#xff1a;跨域问题 2.1&#xff1a;什么是跨域问题 2.2&#xff1a;示例跨域问题 2.3&#xff1a;解决跨域问题 1&#xff0c;全局…

python将CSV文件(excel文件)按固定行数拆分成小文件

最近接到一个需求&#xff0c;就是把非常大的CSV文件&#xff0c;电脑根本打不开&#xff08;或者打开也不能完全展现所有的数据&#xff09;&#xff0c;以每 80万(不够80万行的也独自成为一个单独的文件) 行进行拆分成一个小文件&#xff0c;各位小伙伴在日常工作中有没有遇到…

seata分布式事务1.4版本TM注册全局事务之源码分析(五)

今天我们分析seata分布式事务1.4版本TM注册到全流程的源码&#xff0c;这也是事务执行的核心开始&#xff1a; 首先分为客户端TM和服务端TC&#xff0c;业务发起肯定在TM端&#xff0c;接受在TC端。 整体类图&#xff1a; 一、业务入口TM端&#xff1a; 1、GlobalTransactio…

将本地文件上传到gitee和GitHub,以及Github加速访问

&#xff08;1&#xff09;我全程使用网络上合法加速软件&#xff0c;网易UU加速器是网易自主研发极速引擎&#xff0c;属于合法软件。我们进行加速行为也只是针对于Github这一个网站。 &#xff08;2&#xff09;GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;纯技…

Win,M1Mac上安装jupyter的MATLAB支持插件的方法

tags: MATLAB Win Mac Tips 写在前面 11月的最后一天了, 总结一下支持MATLAB的一个jupyter的插件, 有了这个你就可以在jupyter notebook或者jupyter lab上面使用MATLAB语句了, 还是很不错的, 虽然我安装了好久… 下面来说一下我在我的电脑以及朋友的电脑(Win11)上面安装这个…

安科瑞安全用电监测,智慧用电装置,导轨式安装带无线通讯功能

安科瑞 王晶淼/司红霞 前言 随着电气化的迅猛发展和用电普及程度的日益提高,电已经成为人类生存和发展必不可少的能源之一。然而,由于种种原因,由电气引发的火灾和爆炸事故也直呈现上升趋势。电气设备的绝缘大量使用塑料、橡胶、绝缘漆、稀释剂等易燃物品,在电气设备运行中,由…

【Redis】数据结构---String

文章目录String(字符串)1.Redis 键(key)2.String(字符串)2.1常用命令2.2.String底层结构3.空间分配策略3.1空间预分配3.2惰性空间释放3.3为什么SDS的最大长度是512M?4.SDS面试题String(字符串) 1.Redis 键(key) keys *查看当前库所有key (匹配&#xff1a;keys *1)exists ke…

使用并行流的注意事项

遇到的问题&#xff1a;当时用并行流的时候期望结果7&#xff0c;但是偶尔会有结果不对的情况。。。 如下代码&#xff1a; public static void main(String[] args) {long startSystem.currentTimeMillis();List<String> alist new ArrayList<String>(Arrays.a…

【读书笔记】打开心智

打开心智 0&#xff0c;写在前面 什么是打开心智&#xff1f;我认为是通过更好的认识人类&#xff0c;认识自己&#xff0c;了解自己的本性&#xff0c;然后顺应本性指导和改变自己对事物的看法&#xff0c;约束自己的行为的过程。这也是一个认识心智到打开心智的过程。其实我…

代码随想录刷题|LeetCode 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

目录 121. 买卖股票的最佳时机 思路 暴力解法 贪心算法 动态规划 买卖股票的最佳时机 贪心算法 动态规划 122.买卖股票的最佳时机II 思路 分析递推公式 买卖股票的最佳时机II 贪心算法 动态规划 121. 买卖股票的最佳时机 题目链接&#xff1a;力扣 思路 暴力解法 暴力解答会超…

矩池云|GPU 分布式使用教程之 TensorFlow

GPU 分布式使用教程之 TensorFlow TensorFlow 提供了6种策略实现分布式计算&#xff0c;各个策略详情请参考官方文档。本文档使用 MirroredStrategy 实现单机多卡分布式&#xff0c;MultiWorkerMirroredStrategy 实现多机多卡分布式计算。 选择机器 单机多卡分布式&#xff1…

【MySQL进阶】多表连接的原理

【MySQL进阶】多表连接的原理 文章目录【MySQL进阶】多表连接的原理前言一&#xff1a;连接简介1&#xff1a;连接的本质2&#xff1a;连接过程简介二&#xff1a;连接的原理1&#xff1a;嵌套循环连接&#xff08;Nested-Loop Join&#xff09;2&#xff1a;使用索引加快连接速…

MySQL 8.*版本 修改root密码报错

1、mysql.sock报错 解决办法&#xff1a; 1、根据报错提示&#xff0c;是无法找到/tmp下面的mysql.sock。 2、全局搜索该文件&#xff1a;mysql.sock。 使用命令&#xff1a;find / -iname "mysql.sock" 为mysql.sock该文件创建软连接&#xff0c;命令如下&#x…