精讲Mybatis框架对数据库增删改查操作

这里是一张user表,接下来我们通过java程序对表中内容进行查询操作。user表见名之意,通常用来储存用户的个人信息,可能用于登录或其他统计信息,常见的字段有id,用户名,密码,姓名,年龄,性别等,根据不同项目进行不同划分。

然后我们执行查询语句

mapper中的sql是这样写的

这里还是和jdbc一样,# 表示一个占位符,大家看上面的parameterType属性,表示入参。就是 传入的参数,要求必需指定参数类型,那我在这个方法中传入的是用户的ID是一个数字,这里就得写Integer,或者int,如果写String就是抛出类造型异常。cast...这种异常,那么这里为什么写Integer不写int呢,因为Integer是java中的一个对象,当传入参数为空时,它的默认值允许为null,如果是int类型就会抛出异常。#是固定写法,v是给人看的,所以这里的字母v可以替换成abcde任意子串或数字,大家可以理解为这是一个变量名字。听说Java10推出了一种新的功能,jvm能够自动判断变量类型,有可能Mybatis以后的更新中会取消指定传入参数类型这个规定。

下面是查询结果

接下来我们试试通过模糊查询用户名来找到用户。模糊查询是什么?这是一个非常棒的功能,而且每个人都会用过,当你在百度搜索栏输入自己想要查询的文字时,下拉菜单以后为你列出了可能的选项。这就是模糊查询,原理就是每次用户输入完一个字符,页面向服务器发送ajax请求执行模糊查询然后返回到页面显示出可能结果。

因为这次我们执行的查询结果可能有多个,所以返回的结果集是List,用一个大for循环来遍历所有查询到得结果。那么既然返回的结果是List上图的resultType,为什么是User呢,因为这里只需要写List的泛型即可,如果写List是不可以的,会报错。

大家会发现这次我们用的是${},来表示入参的位置这是为什么呢?实际上#{}与${}的区别就是#{}相当于jdbc中的 where id =?这种占位符,它是预编译的,防sql注入的,${}就是单纯的字符串拼接,是不防sql注入的,所以这两个一定要注意区分,用在合适的场合。另外${}里面的变量必须是value,$是固定格式。

那么如果你觉得用${}这种方法不能防止sql注入,这里也可以使用#{}来完成。

这种写法也是正确的,同时可以防止sql注入,但是要注意 %两边一定得用双引号,这与框架对子串截取机制有关。“”大概是起到转义的作用。

下面我们做一下添加用户功能。

sql语句这样写,我只添加了一个字段,真实情=情况下需要添加很多字段的。

这里是java代码,如果使用过hibernate的同学会很容易理解这段代码。我们这次入参是一个User对象,在执行sql语句的同同时mapper文件会自动帮我们将User里面的属性映射成表中字段增删改操作要记得,执行成功之后需要提交事务,查询不需要。框架在事务控制这方面为我们做了很多事,我们只需要调用commit( )即可。下面看一下结果。

看来黄子韬已经加入进去了,最近他主持一个新的节目叫做创造101,虽然对他基本没什么了解但是感觉要比吴亦凡强太多了,鹿晗可以去死了。

有时候我们在某个网站注册完一个账号时,系统会生成一段ID或者用户名,或账号,这是怎么做到的呢?请看下面的sql语句

原来啊,在insert 内部还要一个selectKey选项。它的意思是查询主键,keyProperty是一种KV数据结构,这里需要写K的值,这里K的值就是我们想要在数据库中查询到得主键的名字,也就是User.id,我们只需要写入id,Mybatis会自动完成关联映射。resultType返回值类型因为主键是自增,那么就是纯数字使用Integer,如果是UUID就是需要使用String等。order表示查找语句和插入语句执行顺序,为什么会有这一个order存在呢?因为啊,在不同数据库主键生成策略是不一样的,mysql默认主键生成策略是在插入语句执行完成生成新的id,所以order要写after在插入之后执行。如果设置主键为uuid或者oracle数据,他们的主键是在插入之前就已经存在了的,所以要使用before选项。

但是插入记录的ID是通过什么形式返回给java程序的呢?请看下面的java代码

打印结果:

为什么是30,不是接着上面的27呢?因为我执行了很多次插入操作,已经用过id为28 29 得了。但是为什么数据库自动生成的ID能够从对象u上取到呢?因为我们设置了selectKey的返回KeyProperty为id,框架会帮我自动完成映射,掌握hibernate的同学会更容易理解其原理为代理对象在一个事务内的游离持久状态时的转换。

补充一点,理论上主键在插入之前生成的效率是要高于在插入后生成主键的策略。因为在数据量大的情况下,数据库引擎只需为新插入的信息要更新已有主键在内存中的16进制物理地址即可,比起新创建新的Int类型或者子串等要节省更多资源。同时因为主键索引存储在内存中这也就说得通为什么oracle的序列在每次重启电脑之后重新创建一个新的序列,即使已有序列主键没有被使用。因为它的引擎只在硬盘中对每个序列的大小,使用次数做记录。

下面我们做一下更新的操作。sql语句如下。

我们将刚刚插入的汪峰名字进行更新操作,将名字改成章子怡,性别改成女。请看java代码,此时我们依然需要传入一个User对象,此对象的状态就是需要将对应记录更新到的状态。

同样修改用户信息需要提交事务,我们来运行一下看看结果。

可以看到,id为30的汪峰已经被改为章子怡了。

接下来我们删除用户,请看sql语句

这里面我们传入的参数是Integer,就是用户的ID,也可以通过username来删除,考虑到id的唯一性所以通常都是通过id来删除记录的。在项目开发中我们会做一种底层方法抽取来实现不同条件的增删改查。下面请看java代码

很简单只有两行代码。下面请看执行结果

刷新navicat,可以看到表中id为30的章子怡已经被删除了。以上就是我们通过MyBatis框架对数据库进行基本的增删改查操作。大家学习中有什么疑问一定要在下方积极留言回复,有问必答。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180425A0PIMY00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券