MyBatis的增删改查(CRUD)

目录

查询

1.单个参数绑定

2.序号参数绑定

3.注解参数绑定(推荐)

4.对象参数绑定(推荐)

5.Map参数绑定

6.模糊查询

7.sql注入

8.聚合函数查询

删除

修改

添加(主键回填)


数据库

程序结构

查询

1.单个参数绑定

dao层
//单个参数传递
    public User findUserById(Integer id);
xml映射文件
  <!--
        parameterType:指定输入参数的类型
        resultType:指定数据结果封装的数据类型
		#{id}:它代表占位符,相当于原来 jdbc 部分所学的?,都是用于替换实际的数据。
    -->
    <select id="findUserById" parameterType="java.lang.Integer" 
            				  resultType="com.by.pojo.User" >
        select * from user where id=#{id}<!--只有一个参数时,#{任意书写}-->
    </select>
 测试类
@Test
    public void testFindUserById(){
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user = userDao.findUserById(41);
        System.out.println(user);
    }

2.序号参数绑定

   //传递多个参数
    public User findUserByIdAndName(Integer id, String username);
 <select id="findUserByIdAndName" resultType="com.by.pojo.User" >
        SELECT * FROM user
        WHERE id = #{arg0} AND username = #{arg1} <!--arg0 arg1 arg2 ...-->
    </select>
	<select id="findUserByIdAndName" resultType="com.by.pojo.User" >
        SELECT * FROM user
        WHERE id = #{param1} AND username = #{param2} <!--param1 param2 param3 ...-->
    </select>
    @Test
    public void testFindUserByIdAndName(){
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user = userDao.findUserByIdAndName(41,"张三丰");
        System.out.println(user);
    }

3.注解参数绑定(推荐)

 //传递多个参数
    public User findUserByIdAndName2(@Param("id")Integer id,
                                     @Param("username")String username);
 <select id="findUserByIdAndName2" resultType="com.by.pojo.User" >
        SELECT * FROM user
        WHERE id = #{id} AND username = #{username}
    </select>
    @Test
    public void testFindUserByIdAndName2(){
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user = userDao.findUserByIdAndName2(41,"张三丰");
        System.out.println(user);
    }

4.对象参数绑定(推荐)

  //使用对象属性进行参数绑定
    public User findUserByUserInfo(User user);
    <select id="findUserByUserInfo" parameterType="com.by.pojo.User" 
            									resultType="com.by.pojo.User">
        SELECT * FROM user
        WHERE id = #{id} AND username = #{username}<!--参数为对象时,#{属性名}-->
    </select>
    @Test
    public void testFindUserByName(){
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User userInfo = new User();
        userInfo.setId(41);
        userInfo.setUsername("张三丰");
        User user = userDao.findUserByUserInfo(userInfo);
        System.out.println(user);
    }

5.Map参数绑定

	//使用Map进行参数绑定
	public User findUserByMap(Map<String, Object> map);
   <select id="findUserByMap" 
            parameterMap="java.util.Map" resultType="com.by.pojo.User">
        SELECT * FROM user
        WHERE id = #{id} AND username = #{username}
    </select>
   @Test
    public void testFindUserByMap(){
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("id",41);
        map.put("username","张三丰");
        User user = userDao.findUserByMap(map);
        System.out.println(user);
    }

6.模糊查询

  //模糊查询
    public  List<User> findUserByName(String username);
  <select id="findUserByName" parameterType="string" resultType="com.by.pojo.User">
        <!-- select * from user where username like concat('%',#{username},'%') -->
        select * from user where username like '%${value}%'<!--${}括号中只能是value-->
    </select>
    @Test
    public void testFindUserByName(){
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> userList = userDao.findUserByName("张");
        for (User user : userList) {
            System.out.println(user);
        }
    }

7.sql注入

  //sql注入
    public User login(User user);
 <select id="login" parameterType="com.by.pojo.User" resultType="com.by.pojo.User">
        select * from user where username = '${username}' and password = '${password}'
    </select>
  @Test
    public void testLogin(){
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User userInfo = new User();
        userInfo.setUsername("张三丰' #");
        userInfo.setPassword("123");
        User user = userDao.login(userInfo);
        System.out.println(user);
    }

#{} 和${}的区别:

  • #{}符

    1. #{}表示一个占位符号 通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换

    2. #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类 型值,#{}括号中可以是 value 或其它名称。

    3. #{}可以有效防止 sql 注入。

  • ${}符

    1. ${}表示拼接 sql 串 通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换

    2. ${}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value

8.聚合函数查询

//聚合函数查询
public Integer getTotal();
<!--聚合函数查询-->
<select id="getTotal" resultType="int">
    SELECT COUNT(id) FROM user
</select>
@Test
public void testGetTotal(){
    Integer total = userDao.getTotal();
    System.out.println(total);
}

删除

   //删除
    public void deleteUserById(Integer id);
<delete id="deleteUserById" parameterType="Integer">
        DELETE FROM user
        WHERE id = #{id}
    </delete>
    @Test
    public void testDeleteUserById(){
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        userDao.deleteUserById(41);
        sqlSession.commit();
    }

修改

 //修改
    public void updateUserById(User user);
    <update id="updateUserById" parameterType="com.by.pojo.User">
        update user set username=#{username},password=#{password},
        birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
    </update>
    @Test
    public void testUpdateUserById(){
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user = new User();
        user.setUsername("马德华");
        user.setPassword("111");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("高老庄");
        user.setId(42);
        userDao.updateUserById(user);
        sqlSession.commit();
    }

添加(主键回填)

 //添加
    public void insertUser(User user);
<insert id="insertUser" parameterType="com.by.pojo.User">
        <!--
            主键回填:新增之后,获取新增记录的id值
            keyProperty="id":主键对应实体类的属性
            order="AFTER":先执行插入语句,之后再执行查询语句
            resultType="java.lang.Integer":主键的数据类型
        -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            /*查询出刚刚插入的记录自增长id*/
            select last_insert_id();
        </selectKey>
        insert into user(username,password,birthday,sex,address)
        values(#{username},#{password},#{birthday},#{sex},#{address});
</insert>

或者

	<!--
        useGeneratedKeys=“true”:获取数据库生成的主键
        keyProperty=“id”:主键对应实体类的属性
    -->
    <insert id="insertUser" useGeneratedKeys="true" 
            keyProperty="id" parameterType="com.by.pojo.User">
        <!--
            主键回填:新增之后,获取新增记录的id值
            keyProperty="id":主键对应实体类的属性
            order="AFTER":先执行插入语句,之后再执行查询语句
            resultType="java.lang.Integer":主键的数据类型

            <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
                /*查询出刚刚插入的记录自增长id*/
                select last_insert_id();
            </selectKey>
         -->
        insert into user(username,password,birthday,sex,address)
        values(#{username},#{password},#{birthday},#{sex},#{address});
    </insert>
  @Test
    public void testInsertUser(){
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user = new User();
        user.setUsername("刘德华");
        user.setPassword("111");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("香港");
        userDao.insertUser(user);
        System.out.println("新增记录的id值:"+user.getId());
        sqlSession.commit();
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GCC:GNU编译器

GCC&#xff08;GNU Compiler Collection&#xff09;是一款广泛使用的开源编译器套件&#xff0c;支持多种编程语言&#xff0c;包括C、C、Objective-C、Fortran、Ada和Go等。在本文中&#xff0c;我们将通过一个简单的C程序来介绍GCC的编译过程&#xff0c;包括预处理、编译、…

ECMAScript基础入门:猫头虎博主的技术分享

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

怎么定义一套完成标准的JAVA枚举类型

一、背景 在java代码中&#xff0c;接口返回有各种各样的状态&#xff0c;比如400 401 200 500 403等常见的http状态码&#xff0c;也有我们自定义的很多业务状态码。如果系统比较复杂&#xff0c;制定一套完整的标准的状态码是非常有必要的&#xff0c;这样比较方面BUG排查。…

六个探索性数据分析(EDA)工具,太实用了!

当进行数据分析时&#xff0c;探索性数据分析(EDA)是一个至关重要的阶段&#xff0c;它能帮助我们从数据中发现模式、趋势和异常现象。而选择合适的EDA工具又能够极大地提高工作效率和分析深度。在本文中&#xff0c;笔者将介绍6个极其实用的探索性数据分析(EDA)工具&#xff0…

【Python小知识 - 6】:QLabel设置图片

文章目录 QLabel设置图片 QLabel设置图片 from PyQt5.QtWidgets import * from PyQt5.QtGui import * import sysapp QApplication(sys.argv)window QWidget()hbox QHBoxLayout(window)# 设置标签图片 lable QLabel() lable.setPixmap(QPixmap(./img/window.png).scaled(1…

Python中实现消息队列:构建高效异步通信系统的完整指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 消息队列的基础概念 在开始之前&#xff0c;先了解一些消息队列的基础概念。 1 什么是消息队列&#xff1f; 消息队列是一种通信方式&#xff0c;它允许将消息从一个应用程序传递到另一个应用程序。消息队列提…

2022xctf-final hole

这个题是做到的第一个利用hole和map来制造oob的题目&#xff0c;挺有意思的记录一下 首先根据题目给出的信息可知涉及到此漏洞 https://crbug.com/1263462 poc如下&#xff1a; let theHole %TheHole(); m new Map(); m.set(1, 1); m.set(theHole, 1); m.delete(theHole);…

【干货】安全规范着装AI检测算法详解/厂商推荐

关于安全着装算法你知道多少&#xff1f;是不是还局限于口罩、安全帽检测&#xff1f;远不如此&#xff0c;随着AI智能算法的迅速发展&#xff0c;在安全生产领域&#xff0c;人工智能对安全监管的力度也大大增加&#xff0c;今天小编就带大家详细了解一下。 较为基础的安全着装…

Guava的TypeToken在泛型编程中的应用

第1章&#xff1a;引言 在Java世界里&#xff0c;泛型是个相当棒的概念&#xff0c;能让代码更加灵活和类型安全。但是&#xff0c;泛型也带来了一些挑战&#xff0c;特别是当涉及到类型擦除时。这就是TypeToken大显身手的时候&#xff01; 作为Java程序员的咱们&#xff0c;…

TCP/IP:从数据包到网络的演变

引言 TCP/IP协议的起源可以追溯到20世纪60年代末和70年代初&#xff0c;美国国防部高级研究计划局&#xff08;ARPA&#xff09;研究开发一种可靠的通信协议&#xff0c;用于连接分散在不同地点的计算机和资源。 在当时&#xff0c;计算机之间的连接并不像现在这样普遍和便捷…

MySQL,练习

表结构参考&#xff1a;MySQL&#xff0c;等值联结、内部联结、多表连接、自联结、自然联结、外部联结、带聚集函数的联结-CSDN博客 1、找出购买了产品id1023005的客户信息 # 联结三表&#xff0c;再过滤 SELECT customers.* FROM orderitems,orders,customers WHERE orderit…

【String、StringBuilder 和 StringBuffer 的 区别】

✅ String、StringBuilder 和 StringBuffer 的 区别 ✅典型解析✅扩展知识仓✅String 的不可变性✅ 为什么JDK 9 中把String 的char[ ] 改成了 byte[ ] ? ✅为什么String设计成不可变的✅缓存✅安全性✅线程安全✅hashcode缓存✅ 性能 ✅String 的 " " 是如何实现的…

IDEA2023+JDK17+SpringBoot3+MySQL8后端接口开发实战课笔记

概述 花了很长的时间&#xff0c;终于把心心念念的SpringBoot3的实战课整理出来了。 今天是开心的一天&#xff0c;因为又多了一门课程可以奉献给大家&#xff0c;也是难过的一天&#xff0c;那就是又要开始重新找工作了。 如果我的粉丝里面有关于Golang或者Python的相关工作推…

算法题系列7·获得数组中多数元素

目录 题目描述 实现 提交结果 题目描述 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;…

深度学习 Day21——J1ResNet-50算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言一、我的环境二、代码实现与执行结果1.引入库2.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;3.导入数据4.查…

linux 串口测试指令和测试程序

一、串口设备查看 查看串口 (/dev) ls /dev/tty*查看串口&#xff08;或串口终端&#xff09;属性 ( /proc) cat /proc/tty/driver/serial 或 cat /proc/tt…

《Python Advanced Programming + Design Patterns + Clean Code》

清洁代码 — 学习如何编写可读、可理解且可维护的代码 高级Python编程知识 Python之常用设计模式 Advanced Programming装饰器 decorators生成器 & 迭代器with 上下文管理器面向对象Mixin 模式反射机制并发编程 Design Patterns设计模式分类简单工厂模式工厂模式 √抽象工厂…

什么是误差,什么是重构误差,误差与重构误差有什么区别?

重构误差 1.误差的概念2.重构误差的概念 1.误差的概念 在机器学习中&#xff0c;误差通常是指模型的输出与实际标签或者真实值之间的差异&#xff0c;通常用于评估模型的预测能力或者训练的优化过程。 2.重构误差的概念 重构误差是指通过学习到的模型来重新构建&#xff08;或…

OpenCV | 告别人工目检:深度学习技术引领工业品缺陷检测新时代

文章目录 机器视觉缺陷检测工业上常见缺陷检测方法内容简介作者简介目录读者对象如何阅读本书获取方式 机器视觉 机器视觉是使用各种工业相机&#xff0c;结合传感器跟电气信号实现替代传统人工&#xff0c;完成对象识别、计数、测量、缺陷检测、引导定位与抓取等任务。其中工…

听GPT 讲Rust源代码--src/tools(21)

File: rust/src/tools/miri/src/shims/x86/mod.rs 在Rust的源代码中&#xff0c;rust/src/tools/miri/src/shims/x86/mod.rs文件的作用是为对x86平台的处理提供支持。它包含一些用于模拟硬件操作的shim函数和相关的类型定义。 具体来说&#xff0c;该文件中的函数是通过使用一组…