MyBatis——MyBatis的CRUD(增删改查)

1.MyBatis的CRUD

创建工程:

在这里插入图片描述

1.1.查询

1.1.1.单个参数绑定

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

1.1.2.序号参数绑定

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

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

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

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

    //使用对象属性进行参数绑定public User findUserByUserInfo(User user);
    <select id="findUserByUserInfo" parameterType="com.wt.pojo.User" resultType="com.wt.pojo.User">SELECT * FROM userWHERE id = #{id} AND username = #{username}<!--参数为对象时,#{属性名}--></select>
    @Testpublic 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);}

1.1.5.Map参数绑定

	//使用Map进行参数绑定public User findUserByMap(Map<String, Object> map);
    <select id="findUserByMap" parameterMap="java.util.Map" resultType="com.wt.pojo.User">SELECT * FROM userWHERE id = #{id} AND username = #{username}</select>
    @Testpublic 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);}

1.1.6.模糊查询(推荐使用${})

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

1.1.7.sql注入

    //sql注入public User login(User user);
    <select id="login" parameterType="com.wt.pojo.User" resultType="com.wt.pojo.User">select * from user where username = '${username}' and password = '${password}'</select>
    @Testpublic void testLogin(){UserDao userDao = sqlSession.getMapper(UserDao.class);User userInfo = new User();//' #会使sql语句后面的内容被注释掉,此时无论密码输入什么都会成功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. 表示拼接 s q l 串通过 {}表示拼接 sql 串 通过 表示拼接sql串通过{}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换
    2. 可以接收简单类型值或 p o j o 属性值,如果 p a r a m e t e r T y p e 传输单个简单类型值, {}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值, 可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,{}括号中只能是 value

1.1.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);
}

1.2.删除

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

1.3.修改

    //修改public void updateUserById(User user);
    <update id="updateUserById" parameterType="com.wt.pojo.User">update user set username=#{username},password=#{password},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}</update>
    @Testpublic 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();}

1.4.添加

    //添加public void insertUser(User user);
<insert id="insertUser" parameterType="com.wt.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.wt.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>
    @Testpublic 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();}

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

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

相关文章

大数据讲课笔记5.1 初探MapReduce

文章目录 零、学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;MapReduce核心思想&#xff08;二&#xff09;MapReduce编程模型&#xff08;三&#xff09;MapReduce编程实例——词频统计思路1、Map阶段&#xff08;映射阶段&#xff09;2、Reduce阶段&#xff08…

【Java异常】idea 报错:无效的目标发行版:17 的解决办法

【Java异常】idea 报错&#xff1a;无效的目标发行版&#xff1a;17 的解决办法 一&#xff0c;问题来源 springcloud的第一个demo项目就给我干趴了 二、原因分析 java: 无效的目标发行版: 17 原因就是 JDK 版本不对。从 IDEA 编辑器中可以找到问题的原因所在&#xff0c;…

ImportError: cannot import name ‘calcsize‘ from ‘struct‘解决方案

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

英文表示数字_分支结构 C语言xdoj146

题目描述&#xff1a;输入一个0~9的一位整数&#xff0c;输出其对应的英文单词。要求用switch结构完成。 示例&#xff1a; 输入&#xff1a;0 输出&#xff1a;zero 输入&#xff1a;8 输出&#xff1a;eight #include <stdio.h>//英文表示数字_分支结构 int main() {in…

爬虫中scrapy模块的概念作用和工作流程

scrapy的概念和流程 学习目标&#xff1a; 了解 scrapy的概念了解 scrapy框架的作用掌握 scrapy框架的运行流程掌握 scrapy中每个模块的作用 1. scrapy的概念 Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。 Scrapy 使…

状态管理之复杂对象

前面我们学习的State、Prop、Link、Provide、Consume这些装饰器都只能更新对象的直接赋值、对象属性赋值&#xff1b;如果对象的属性又是一个对象&#xff0c;也就是嵌套对象&#xff0c;那么对嵌套对象的属性的更新是不会被观察到的&#xff0c;所以复杂状态管理用于解决该问题…

前后端分离跨域问题的OPTIONS请求

本篇文章用于个人的问题记录 问题描述: 使用了springbootvue3做前后端分离,使用sa-token做登录认证 由于sa-token的前后端分离的登录认证需要在请求发起时自定义添加头部satoken 好那么问题来了,我请求的时候看我的请求头是存在satoken这个头部信息的 但我在springboot的拦截…

【sprintboot+vue3】解决前后端分离项目遇到的问题

目录 一、Access to XMLHttpRequest at http://127.0.0.1:8088/api/hello from origin http://localhost:5173 has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requested resource. 二、报错[vue/compiler-sfc] 一、Access to …

uniapp笔记

/pages/component/swiper/swiper /pages/component/button/button navigator image 设置界面标题 页面跳转 设置TabBar 发起一个请求 网络请求

明理信息科技打造专属个人或企业知识付费平台,核心功能设计

在当今信息爆炸的时代&#xff0c;知识管理已经成为了每个人必须面对的问题。然而&#xff0c;市面上的知识付费平台大多数都是通用的&#xff0c;无法满足个性化需求。 因此&#xff0c;明理信息科技提供了一款专属定制的适合个人的知识付费平台。核心产品能力如下&#xff1…

画图之C4架构图idea和vscode环境搭建篇

VS Code 下C4-PlantUML安装 安装VS Code 直接官网下载安装即可,过程略去。 安装PlantUML插件 在VS Code的Extensions窗口中搜索PlantUML,安装PlantUML插件。 配置VS Code代码片段 安装完PlantUML之后,为了提高效率,我们最好安装PlantUML相关的代码片段。 打开VS Cod…

Java精品项目源码新基于协同过滤算法的旅游推荐系统(编号V69)

Java精品项目源码新基于协同过滤算法的旅游推荐系统(编号V69) 大家好&#xff0c;小辰今天给大家介绍一个基于协同过滤算法的旅游推荐系统

WPF Halcon机器视觉和运动控制软件通用框架,插件式开发,开箱即用 仅供学习!

点我下载&#xff0c;仅供个人学习使用 参考easyvision开发&#xff0c;集成几十个软件算子此版本以添加ui设计器。具体功能如上所示&#xff0c;可以自定义变量&#xff0c;写c#脚本&#xff0c;自定义流程&#xff0c;包含了halcon脚本和封装的算子&#xff0c;可自定义ui&a…

MySQL的增删改查(进阶)--上

1. 数据库约束 1.1 约束类型 NOT NULL - 指示某列不能存储 NULL 值。 UNIQUE - 保证某列的每行必须有唯一的值。 DEFAULT - 规定没有给列赋值时的默认值。 PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列&#xff08;或两个列多个列的结合&#xff09;有唯一标识&#xf…

需要token的原因----

需要token的原因主要有以下几点&#xff1a; 安全性&#xff1a;Token的使用可以增强用户信息的安全性。在用户向服务端请求数据时&#xff0c;服务端需要通过数据库来判断用户名和密码是否正确&#xff0c;以确定是否提供所需内容。Token作为一层额外的验证&#xff0c;可以验…

2023中国品牌节金谱奖荣誉发布 酷开科技获颁OTT行业科技创新奖

11月17日—19日&#xff0c;以“复苏与腾飞”为主题的2023第十七届中国品牌节&#xff0c;在杭州市云栖小镇国际会展中心成功举行。在18日晚间的荣耀盛典上&#xff0c;“TopBrand 2023中国品牌节金谱奖”荣誉发布&#xff0c;酷开科技斩获OTT行业科技创新奖。 酷开科技作为OTT…

2023/12/19 work

1. 基于UDP的TFTP文件传输 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <myhead.h>//实现下载功能 int do_download(int cfd, struct sockaddr_in sin) {//定义变量存储下载请求包char buf[516] "";//定义变量存…

工作服穿戴监测识别摄像机

工作服穿戴监测识别摄像机是一种通过图像识别技术&#xff0c;实时监测和识别工作场所穿戴的工作服是否符合要求的设备。它可以有效地监测员工是否穿戴了正确的工作服&#xff0c;提高工作场所的安全性和管理效率。 这种摄像机利用先进的计算机视觉技术&#xff0c;能够快速准确…

九牧:科技卫浴,长期主义

“没有做错什么&#xff0c;但却输给了时代”&#xff0c;这是人们给当年手机巨头诺基亚的注解。 谁也没有想到&#xff0c;曾在手机行业称雄的诺基亚&#xff0c;最终败给了时代。当年&#xff0c;在2G向3G、4G跨越的时候&#xff0c;苹果、微软的iOS和安卓系统将手机从简单的…

【QT】C++/Qt使用Qt自带工具windeployqt打包

基本操作 运行项目debug或者release 将运行后的可执行文件单独放到一个文件夹中 根据项目使用的kits来选择Qt的打包工具 打开工具后移动到exe文件夹下执行windeployqt xxx.exe 预览图 问题 打包后再其他电脑上运行出现下图错误 将自己电脑的这个文件拷到可执行文件夹中既…