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.rhkb.cn/news/221196.html

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

相关文章

数据结构:图解手撕B-树以及B树的优化和索引

文章目录 为什么需要引入B-树&#xff1f;B树是什么&#xff1f;B树的插入分析B树和B*树B树B*树分裂原理 B树的应用 本篇总结的内容是B-树 为什么需要引入B-树&#xff1f; 回忆一下前面的搜索结构&#xff0c;有哈希&#xff0c;红黑树&#xff0c;二分…等很多的搜索结构&a…

轻量级购物小程序H5产品设计经典样例

主要是看到这个产品设计的不错值得借鉴特记录如下&#xff1a; 不过大多数购物app都大致相同&#xff0c;这个算是经典样例&#xff0c;几乎都可以复制&#xff0c;我第一次使用&#xff0c;感觉和顺畅。看上去产品是经过打磨的&#xff0c;布局非常好。内容也很丰富。支持异业…

官方指定Jmeter配置JVM堆内存方式

1.概述 在使用Jmeter做性能测试过程中&#xff0c;可能会应为默认设置的堆内存值较小出现堆内存溢出问题&#xff0c;此时解决的方式有两种&#xff0c;分布式测试和调大堆内存。下面介绍官方推荐调整堆内存方法。 2.调整Jmeter堆内存 2.1.介绍官方推荐堆内存调整方法(jmete…

C语言:指向数组的指针和指向数组元素的指针

相关阅读 C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 指向数组的指针和指向数组元素的指针常常被混淆&#xff0c;或者笼统地被称为数组指针&#xff0c;但它们之间是有差别的&#xff0c;本文就将对此进行讨论。 下面的代码…

家里就一台电脑还抢着用,限定电脑投屏解决了问题。

很多人都遇到过家里电子设备争抢的情况吧。上周我就因为临时任务&#xff0c;需要用电脑处理一些文件&#xff0c;搜索、浏览资料&#xff0c;制作对应PPT&#xff0c;无论哪项都需要用电脑。恰巧&#xff0c;家里小孩有个观看《大国崛起》纪录片的学习任务&#xff0c;带完整字…

Explain工具-SQL性能优化

文章目录 SQL性能优化的目标Explain中type效率级别&#xff08;重要&#xff09;注意 Explain覆盖索引ExplainindexExplainfilesortExplainfilesort创建 idx_bd(b,d) SQL性能优化的目标 达到 range 级别 Explain中type效率级别&#xff08;重要&#xff09; 显示的是单位查询…

【JAVA】仓库、货架、货物

当前只有添加、查询&#xff0c;没有删除和修改部分&#xff1a; import java.util.LinkedList;class Goods {String id;String name;int price;public Goods(String id, String name, int price) {this.id id;this.name name;this.price price;}Overridepublic String toS…

SpringBlade export-user SQL 注入漏洞复现

0x01 产品简介 SpringBlade 是一个由商业级项目升级优化而来的 SpringCloud 分布式微服务架构、SpringBoot 单体式微服务架构并存的综合型项目。 0x02 漏洞概述 SpringBlade v3.2.0 及之前版本框架后台 export-user 路径存在安全漏洞,攻击者利用该漏洞可通过组件customSqlS…

C#调用阿里云接口实现动态域名解析,支持IPv6(Windows系统下载可用)

电信宽带一般能申请到公网IP,但是是动态的,基本上每天都要变,所以想到做一个定时任务,随系统启动,网上看了不少博文很多都支持IPv4,自己动手写了一个。 (私信可全程指导) 部署步骤: 1、下载软件包,修改配置文件 下载地址:私信获取 下载压缩包,解压后修改配置文…

域架构下的功能安全思考

来源&#xff1a;联合电子 随着整车电子电气架构的发展&#xff0c;功能域控架构向整车集中式区域控制演进。新的区域控制架构下&#xff0c;车身控制模块(BCM)&#xff0c;整车控制单元&#xff08;VCU&#xff09;&#xff0c;热管理系统&#xff08;TMS&#xff09;和动力底…

AcWing算法进阶课-1.9.1Dinic/ISAP求最小割

算法进阶课整理 CSDN个人主页&#xff1a;更好的阅读体验 原题链接 题目描述 给定一个包含 n n n 个点 m m m 条边的有向图&#xff0c;并给定每条边的容量&#xff0c;边的容量非负。 图中可能存在重边和自环。求从点 S S S 到点 T T T 的最小割。 输入格式 第一行包…

【08】GeoScene产品发布海图服务——以s57数据标准为例

在GeoScene产品中发布海图服务——以s57数据标准为例&#xff0c;发布的服务方便不同的客户终端调用&#xff0c;例如&#xff1a;web端通过JS api进行调用&#xff0c;移动端通过GeoScene Runtime SDK进行调用。1、海图服务部署 GeoScene_Maritime_for_Server海图模块安装完之…

JDK各个版本特性讲解-JDK14特性

JDK各个版本特性讲解-JDK14特性 一、Java14概述二、语法层面的变化1. instanceof2. switch表达式3. 文本块的改进4. Records记录类型 二、关于GC1.G1的NUMA内存分配优化2. 弃用SerialCMS,ParNewSerial Old3.删除CMS4.ZGC on macOS and Windows 三、其他变化1.友好的空指针异常提…

融了超24亿元舍不得花,放银行吃利息,这家存储创企厉害了

引言&#xff1a;AI与大模型风起云涌&#xff0c;为什么催生了这匹存储“黑马”&#xff1f; 【阿明观察 &#xff5c; 科技热点关注】 这家总部设在美国的存储初创公司&#xff0c;真的赶上AI与大模型时代的风口了。Vast Data公司最新再次获得E轮融资1.18亿美元&#xff0c;…

Navicat16的下载与安装

Navicat16的下载与安装 1、官网下载地址&#xff1a;https://www.navicat.com.cn/download/navicat-premium 当然有的朋友在官网下载比较慢&#xff0c;我也为大家准备好了百度网盘链接 链接&#xff1a;https://pan.baidu.com/s/1dUcTSHr3761Oayh0-WfolA?pwdwfpl 提取码&am…

HTML有哪些列表以及具体的使用!!!

文章目录 一、HTML列表二、列表的应用1、无序列表2、有序列表3、自定义列表 三、总结 一、HTML列表 html的列表有三种&#xff0c;一种是无序列表&#xff0c;一种是有序列表&#xff0c;还有一种为自定义列表。 二、列表的应用 1、无序列表 <ul> <li>无序列表…

实验4.2 默认路由和浮动静态路由的配置

实验4.2 默认路由和浮动静态路由的配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.路由器的基本配置。2.配置默认路由&#xff0c;实现全网互通。3.配置浮动静态路由&#xff0c;实现链路备份。 六、任务验收七、任务小结八、知识链接1&#xff0e;默认路…

css实现边框彩虹跑马灯效果

效果展示 代码实战 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-…

如何在公网环境下使用Potplayer访问本地群晖webdav中的影视资源

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是&#xff1a;1 使用环境要求&#xff1a;2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透&#xff0c;映射至公网4 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内…

API资源对象StorageClass;Ceph存储;搭建Ceph集群;k8s使用ceph

API资源对象StorageClass;Ceph存储;搭建Ceph集群;k8s使用ceph API资源对象StorageClass SC的主要作用在于&#xff0c;自动创建PV&#xff0c;从而实现PVC按需自动绑定PV。 下面我们通过创建一个基于NFS的SC来演示SC的作用。 要想使用NFS的SC&#xff0c;还需要安装一个NFS…