Mybatis对数据的增删改查

2023-11-18

创建sql的映射文件

<?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.demo.mybatispro.mapper.AdminMapper">

namespace某一个接口的名称,就是对应的地址就是我们创建好的接口的位置的地址

增加(插入数据)

id = 接口那边唯一的标识

parameterType = 给数据库传入的参数类型

useGeneratedKeys=“true” 可以返回刚插入数据的主键

keyProperty=“id” 告知与主键列对应的属性

keyColumn=“id” 告知的是数据库这边的主键列

    <insert id="saveAdmin" parameterType="Admin" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
        insert into admin (account,password,sex) values (#{account},#{password},#{sex})
    </insert>

#{} 占位符,是经过预编译的,编译好 SQL 语句再取值,#方式能够防止 sql 注入

$ {} 拼接符,会传入参数字符串,取值以后再去编译 SQL 语句,$方式无法防止 Sql 注入

注意:MyBatis 排序时使用 order by 动态参数时需要注意,用$而不是#

修改

id = 接口那边唯一的标识

parameterType = 给数据库传入的参数类型

<update id="updateAdmin" parameterType="Admin">
        update admin set account = #{account},
                         password = #{password},
                         sex = #{sex}
                         where id = #{id}
</update>

删除

id = 接口那边唯一的标识

parameterType = 给数据库传入的参数类型

<delete id="deleteAdmin">
        delete from admin where id = #{id}
</delete>

查找

id = 接口那边唯一的标识

parameterType = 给数据库传入的参数类型

resultType 返回的数据类型,将数据库数据自动的映射到java对象中

    <select id="getAdminById" resultType="Admin">
        select * from admin where id = #{id}
    </select>

resultType 返回的数据类型 通过反射根据返回值的类型创建一个对象

将数据库数据自动的映射到java对象中,但是有一个前提,前提是表中的列名与类中的属性名相同

但是因为再java和数据库中命名都有着各自的规定,所以mybatis在它的核心配置文件中的。

setting中有一个name="mapUnderscoreToCamelCase"的设置选项可以开启从经典的数据库名到java驼峰命名之间的转换user_name==>userName,它默认情况下为false,将属性值改为true就可以了

	<settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

向数据库参数传递

简单参数

简单的参数形式不需要使用 parameterType 参数定义

Admin getAdminById(int id);
<delete id="deleteAdmin">

多个参数

多个参数使用@Param(“id”)进行绑定,也不需要使用 parameterType 参数定义

@Param后面括号内才的是向数据库那边传输的参数名,在数据端这里也是拿param注解标签里的字符进行数据接收

Admin getAdmin(@Param("account")String account,@Param("sex")String sex);;

传入对象

如果传入一个复杂的对象,就需要使用 parameterType 参数进行类型定义

void updateAdmin(Admin admin);
<update id="updateAdmin" parameterType="Admin">

使用map传递

也可以使用 Map 对象传递

String类型的键,Object类型的值,以map的接口

void insertUser(Map<String,Object> map);

在 sql 中使用表达式获取 map 的键即可

java中已有的类作为类型使用的时候,可以直接使用mybatis定义好的别名来使用

在这里插入图片描述
sql映射过来的实现代码

    <select id="getAdmin1" resultType="Admin" parameterType="map">
        select * from admin where account = #{account} and sex = #{sex}
    </select>

测试代码

    @Test
    public void find2() {

        SqlSession sqlSession = MybatisUtil.getSqlSession();
        AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);

        Map<String,Object> map = new HashMap<>();
        map.put("account","was");
        map.put("sex","女");
        Admin admin = mapper.getAdmin1(map);
        System.out.println(admin);
        sqlSession.commit();
        sqlSession.close();
    }

Mybatis的基本增删改查总的代码演示

定义的接口中,对所要求的方法进行命名

package com.demo.mybatispro.mapper;

import com.demo.mybatispro.model.Admin;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface AdminMapper {
    /*这个就相当于之前写的dao文件,只写是在dao文件中,写好mysql所需要的方法,并且实现它
    * 现在的这里只写方法名,定义功能 , 具体的实现是在sql的映射文件当中*/

    /*sql是写在xml的文件中,我们不能直接访问,
    mybatis让我们在业务代码可以定义接口,在接口中定义的是要操作的方法名
    方法的定义是有要求的:
    方法名 与 xml中某一个标签id相同。参数类型也是一致的,包括返回值类型也是要一致的*/

    void saveAdmin(Admin admin);//增

    void updateAdmin(Admin admin);//改

    void deleteAdmin(int id);//删

    Admin getAdminById(int id);//查,根据一个id查找这个id对应的所有信息

    Admin getAdmin(@Param("account")String account,@Param("sex")String sex);
    //@Param后面括号内才的是向数据库那边传输的参数名,使用注解标签参数绑定

    Admin getAdmin1(Map<String,Object> map);//以map形式传递参数

    int getAdminCount();//返回数据港总共还几条数据
}

具体实现数据库功能的代码

<?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.demo.mybatispro.mapper.AdminMapper">
    <!--namespace某一个接口的名称,就是对应的地址就是我们创建好的接口的位置的地址-->

    <!--insert中的id名就要和我们创建好的接口中的方法名一致-->
    <!--parameterType中写参数类型-->

    <!--增加-->
    <!--useGeneratedKeys="true" 可以返回刚插入数据的主键
    keyProperty="id"  告知与主键列对应的属性
    keyColumn="id" 告知的是数据库这边的主键列-->
    <insert id="saveAdmin" parameterType="Admin" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
        insert into admin (account,password,sex) values (#{account},#{password},#{sex})
    </insert>

    <!--修改-->
    <!--#{}里面写内容的属性名-->
    <update id="updateAdmin" parameterType="Admin">
        update admin set account = #{account},
                         password = #{password},
                         sex = #{sex}
                         where id = #{id}
    </update>

    <!--删除-->
    <delete id="deleteAdmin">
        delete from admin where id = #{id}
    </delete>

    <!--查询-->
    <!--resultType 返回的数据类型 通过反射根据返回值的类型创建一个对象-->
    <!--将数据库数据自动的映射到java对象中,但是有一个前提,前提是表中的列名与类中的属性名相同-->
    <select id="getAdminById" resultType="Admin">
        select * from admin where id = #{id}
    </select>
    <select id="getAdmin" resultType="Admin">
        select * from admin where account = #{account} and sex = #{sex}
    </select>

    <!--java中已有的类型作为类型使用时,可以直接使用mybatis定义好的别名-->
    <select id="getAdmin1" resultType="Admin" parameterType="map">
        select * from admin where account = #{account} and sex = #{sex}
    </select>

    <!--返回数据港总共还几条数据-->
    <select id="getAdminCount" resultType="int">
        select count(*) from admin
    </select>
</mapper>

这里我用的是测设代码 添加了用来测试的junit的jar包

package com.demo.mybatispro.test;

import com.demo.mybatispro.mapper.AdminMapper;
import com.demo.mybatispro.model.Admin;
import com.demo.mybatispro.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test3 {

    /*单元测设*/
    @Test
    public void save() {
        Admin admin = new Admin();
        admin.setAccount("wasd");
        admin.setPassword("1234");
        admin.setSex("男");

        SqlSession sqlSession = MybatisUtil.getSqlSession();
        AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);

        mapper.saveAdmin(admin);
        //当我们把这个admin对象中的数据存入到数据库中后,想要立即拿出刚刚保存进去的id
        // 就是去insert的标签里加上useGeneratedKeys
        System.out.println(admin.getId());//加入useGeneratedKeys这边就可以直接获得主键号

        sqlSession.commit();
        sqlSession.close();
    }

    //改
    @Test
    public void update() {
        Admin admin = new Admin();
        admin.setId(1);
        admin.setAccount("张三");
        admin.setPassword("qwer");
        admin.setSex("女");

        SqlSession sqlSession = MybatisUtil.getSqlSession();
        AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);

        mapper.updateAdmin(admin);

        sqlSession.commit();
        sqlSession.close();
    }

    //删
    @Test
    public void delete() {
        int id = 10;

        SqlSession sqlSession = MybatisUtil.getSqlSession();
        AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);

        mapper.deleteAdmin(id);

        sqlSession.commit();
        sqlSession.close();
    }
    //查
    @Test//以对象参数传递
    public void find() {
        int id = 1;

        SqlSession sqlSession = MybatisUtil.getSqlSession();
        AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);

        Admin admin = mapper.getAdminById(id);
        System.out.println(admin);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test//多个参数的参数传递
    public void find1() {
        String account = "was";
        String sex = "女";

        SqlSession sqlSession = MybatisUtil.getSqlSession();
        AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);

        Admin admin = mapper.getAdmin(account,sex);
        System.out.println(admin);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test//使用map进行参数传递
    public void find2() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);

        Map<String,Object> map = new HashMap<>();
        map.put("account","was");
        map.put("sex","女");
        Admin admin = mapper.getAdmin1(map);
        System.out.println(admin);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test//返回数据港总共还几条数据
    public void find3() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);

        int count = mapper.getAdminCount();

        System.out.println(count);
        sqlSession.commit();
        sqlSession.close();
    }
}

测试的jar包坐标配在pom.xml管理当中,我使用的是maven的jar包管理

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>provided</scope><!--test 也是不会被打包 到war包-->
        </dependency>

Mybits的核心配置

    <typeAliases>
        <typeAlias type="com.demo.mybatispro.model.Admin" alias="Admin"></typeAlias>
    </typeAliases>

上一篇:>>> Mybatis框架概述和搭建详解以及日志和单元测试

下一篇:>>> Mybatis对数据库数据的查询

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis对数据的增删改查 的相关文章

  • 如何计算 Postgres 上图表中所有连接的节点(行)?

    我的桌子有account id and device id One account id可以有多个device ids 反之亦然 我正在尝试计算每个连接的多对多关系的深度 Ex account id device id 1 10 1 11
  • Extbase - 从查询中获取创建的sql

    我想从我的typo3 扩展中获取一些数据库表 该扩展基于 extbase 查询总是不返回任何内容 但数据存在 我试过这个 query this gt createQuery query gt statement SELECT FROM my
  • MySQL:如何获取每个分组的x个结果数[重复]

    这个问题在这里已经有答案了 可能的重复 mysql 在 GROUP BY 中使用 LIMIT 来获取每组 N 个结果 https stackoverflow com questions 2129693 mysql using limit w
  • 如何连续添加起始行和下一行的值

    我只想创建一个 sql 查询 结果就像图片上的那样 类似于 SQL 中的斐波那契数列 Ex Column 1 10 则 Result 列的值为 Result 10 因为这是第一行 然后假设column1第二行的值为50 那么Result第二
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • 没有为 1 个或多个必需参数给出值。更新SQL

    我正在编写一个程序 当用户在列表视图上选择记录时 该程序会更新密码或积分 我收到错误 没有为 1 个或多个必需参数给出值 我不知道如何纠正 我是否遗漏了一些明显的东西 Dim sql As String UPDATE Users SET P
  • 一个表可以有多个主键吗?

    我现在很困惑 也许你可以帮助我更好地理解这个问题 即一个表可以有两个主键 如果是 那么如何 如果没有 那为什么 您询问是否可以有多个主键field你当然可以 您只能有一个主键 但它可以包含唯一标识行所需的任意数量的列 创建表时使用类似这样的
  • 何时在 mysql 中使用 Union [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 对于 Union 您会在什么现实情况下使用它 因为对我来说 对具有不同列用途 含义的两个表中的两个选择查询使用联合是没有意义的 例如
  • 选择多列 按一列分组 按计数排序

    我在Oracle中有以下数据集 c1 c2 c3 1A2 cat black 1G2 dog red B11 frog green 1G2 girl red 试图得到以下结果 基本上我首先尝试获取具有重复 c1 的行 c1 c2 c3 1G
  • 如何将SQL数据加载到Hortonworks中?

    我已在我的电脑中安装了 Hortonworks SandBox 还尝试使用 CSV 文件 并以表结构的方式获取它 这是可以的 Hive Hadoop nw 我想将当前的 SQL 数据库迁移到沙箱 MS SQL 2008 r2 中 我将如何做
  • 使用来自另一个数据库的选择查询更新 mysql 表

    我有两个数据库 我想用另一个数据库表中的值更新一个表 我正在使用以下查询 但它不起作用 UPDATE database1 table1 SET field2 database2 table1 field2 WHERE database1 t
  • WHERE NOT EXIST 附近的语法错误

    我在堆栈中搜索 但没有一个达到最终答案 我的查询是这样的 INSERT INTO user username frequence autoSend VALUES feri2 3 1 WHERE NOT EXISTS SELECT FROM
  • 更改mysql数据库表中的日期格式

    大家早上好 只是一个简单的问题 在我现有的 MySql 数据库中 我几乎没有包含日期 的列 目前这些是年 月 日格式 但现在我需要将其全部更改为年 月 日格式 我试过了select date format curdate d m Y 但它不
  • Oracle:按月分区表

    我的解决方案 德语几个月 PARTITION BY LIST to char GEBURTSDATUM Month PARTITION p1 VALUES JANUAR PARTITION p2 VALUES Februar PARTITI
  • 在Oracle中使用IW和MM

    我使用 IW 表示每周结果 使用 MM 表示每月结果 但我总是收到错误 ORA 00979 not a GROUP BY expression 00979 00000 not a GROUP BY expression 我的疑问是这些 We
  • postgresql 不同的不工作

    我使用以下代码从数据库获取值 但是当我编写这段代码时 测试看看问题出在哪里 我注意到查询没有从数据库中获取不同的值 这是查询 select distinct ca id as id acc name as accName pIsu name
  • 通过 C# SqlCommand 执行合并语句不起作用

    我正在第一次尝试使用临时表和MERGE语句通过更新 SQL 表SqlCommandC 中的对象 我正在开发的程序旨在首先将大量记录 最多 20k 导出到 Excel 电子表格中 然后 用户可以搜索并替换特定值 并根据需要更新任意多记录中的任
  • 如何创建没有循环关系的树形表?

    CREATE TABLE TREE node1 id UUID REFERENCES nodes object id NOT NULL node2 id UUID REFERENCES nodes object id NOT NULL CO
  • SQL Server 中的 FIFO 查询

    我正在构建一个库存管理应用程序c with SQL server 我想做一个FIFO从我的表查询 我以可变价格购买了相同的产品 之后我卖掉了其中一些 我想根据 先进先出 进行查询BatchDate柱子 所以我想通过PurchasePrice
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl

随机推荐

  • Ubuntu18环境下 python 多进程与多线程测试

    Ubuntu18环境下 python 多进程与多线程测试 测试说明 单一线程单一进程测试函数 多线程下测试函数 多进程下测试函数 主函数与测试结果 测试说明 测试的对象为多次求平方的程序 def task powers limit int
  • 鸿蒙内核阅读笔记-时间管理(los_sys)

    简介 近期在阅读鸿蒙liteOS a 由于是初次探索内核的奥秘 将一些阅读的心得进行分享 希望能在作为笔记的同时 也能帮助更多人学习 感谢图灵大佬的注释项目 使我能够更加快速的理解 https weharmony github io 核心模
  • C语言用循环编写简单菜单程序

    C语言用循环编写简单菜单程序 源码如下 include
  • MyBatis架构与原理深入解析

    点击上方 芋道源码 选择 设为星标 管她前浪 还是后浪 能浪的浪 才是好浪 每天 8 55 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2020 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络
  • 汽车信息安全标准ISO/SAE21434与UN/WP.29阅读总结

    1 序言 伴随着汽车与外界的交互手段不断丰富 车联网相关设备 系统间的数据交互更加频繁 万物互联下的网络攻击也逐渐渗透延伸到车联网的领域 这给汽车行业带来了新的 专属挑战 我这几天简要阅读了汽车信息安全领域的几个重要的国际规范 本文就简要讨
  • 光分配网(ODN)一级分光和二级分光的区别及应用场景

    光分配网 ODN 的分光方式主要有两种 一级分光和二级分光 如图1所示 受PON设备光功率预算及带宽的限制 当前 ODN的总分路比一般为1 64 图1 ODN的一级分光和二级分光 采用一级分光时 分路器一般设置在配线光交处 采用二级分光时
  • 什么是新生代的复制算法

    https blog csdn net ooppookid article details 51523701 1 什么是新生代的复制算法 了解堆内存看这里 java堆内存是什么样的 了解java垃圾回收看这里 java垃圾回收机制是什么 所
  • 图像拼接算法及实现_浅谈图像处理算法的实现途径(CPU/FPGA/ASIC)

    人们对图像质量要求的不断提升 直接推动着图像算法的不断向前发展 那么到今天为止 常用的图像处理算法是怎么实现的呢 今天我们来谈一谈 图像处理算法的实现一般有两种途径 软件或者硬件 软件 VS 硬件 软件实现方式 成本低 迭代快 且随着现在各
  • c++调用sqlite3(带加解密)

    StringConvert见https blog csdn net wxd090108 article details 84190762 第三方文件 下载地址 https sourceforge net projects wxcode fi
  • 第六题 整除排序

    题目描述 有一个序列 序列的第一个数是n 后面的每个数是前一个数整除2 请输出这个序列中的值为正数 的项 输入格式 输入一行包括一个整数n 输出格式 输出一行 包括多个整数 相邻的整数之间用一个空格分开 表示答案 测评用例规模和标准 对于8
  • 原理图库元件符号之二极管模型的创建

    今天我们来绘制一个二极管的模型 效果图如下 Step 01 首先画两个引脚 并把Name属性隐藏 Step 02 使用多边形命令 绘制二极管的本体 Step 03 修改多边形属性 多边形线宽改为smallest 然后填充为蓝色 效果图如下
  • Vue中export const 和 export default的区别

    export const 一个文件中可以有好多个 名字叫命名导出 export default 一个文件中只能有一个 名字叫默认导出 代码举例 详见资料链接
  • kong配置好跨域组件后,仍不能跨域,

    路由配置加上OPTIONS
  • python写入txt不覆盖_python不能覆盖文件内容如何解决

    python不能覆盖文件内容的解决方法 使用 with open f w as file 命令即可覆盖文件内容 w 代表每次运行都覆盖文件内容 python不能覆盖文件内容有可能是因为文件的打开方式为追加写方式 更改文件打开方式即可实现再次
  • Linux内存分析free与cache清理

    1 free命令 Linux中查看内存的命令为free 命令如下 free h total used free shared buff cache available Mem 62G 4 9G 627M 520K 57G 57G Swap
  • 面试顺序问题:用数学建模优化生产与服务运作中的管理问题

    例题 有 4 名同学到一家公司参加三个阶段的面试 公司要求每个同学都必须首先 找公司秘书初试 然后到部门主管处复试 最后到经理处参加面试 并且不允许插队 即 在任何一个阶段 4 名同学的顺序是一样的 由于 4 名同学的专业背景不同 所以每人
  • Spring知识体系

    Spring知识体系 一 基本介绍 1 Spring全家桶 Spring SpringMVC Spring Boot Spring Cloud 其中Spring是其他的基础 2 Spring 出现的目的是为了解决企业级开发的难度 减轻对项目
  • ARouter在kotlin中使用,传递Int Long Double类型的参数空指针异常

    ARouter在kotlin中使用 传递Int Long Double类型的参数由A activity传递到 B activity 在B Activity接收时出现空指针异常 java lang NullPointerException A
  • clickhouse insert的数据结构

    clickhouse insert大致分为两部分 1 sql语句部分 insert into table f1 f2 2 数据部分 数据部分又分为3部分 头 数据 尾 数据头 数据块1 数据块2 数据块N 数据尾 从中可以看出 每个inse
  • Mybatis对数据的增删改查

    文章目录 创建sql的映射文件 增加 插入数据 修改 删除 查找 向数据库参数传递 简单参数 多个参数 传入对象 使用map传递 Mybatis的基本增删改查总的代码演示 创建sql的映射文件