sql判断是否存在新思路
参考网址:
https://mp.weixin.qq.com/s?__biz=MzUxOTc4NjEyMw==&mid=2247498609&idx=2&sn=6cf9167490171278bfa2ddab8285f232&chksm=f9f6e095ce816983da219836d9c637be330f84dfd300e06ad5b5e5f45e72f7943bb8cbdb90d2&mpshare=1&scene=23&srcid=1224G1UwGWcxpfF7nbmPnrsH&sharer_sharetime=1608823361666&sharer_shareid=9d1e76e919cc0b2f3ca23ed1f5ef67a8%23rd
1.之前的写法
- sql写法
SELECT count(*) FROM table WHERE a = 1 AND b = 2
- java代码
int nums = xxDao.countXxxxByXxx(params);
if ( nums > 0 ) {
//当存在时,执行这里的代码
} else {
//当不存在时,执行这里的代码
}
2.第一种写法(select 常量)
- sql写法
SELECT 1 FROM table WHERE a = 1 AND b = 2 LIMIT 1
- java代码
Integer exist = xxDao.existXxxxByXxx(params);
if ( exist != NULL ) {
//当存在时,执行这里的代码
} else {
//当不存在时,执行这里的代码
}
说明:
SQL不再使用
count
,而是改用LIMIT 1
,让数据库查询时遇到一条就返回,不要再继续查找还有多少条了业务代码中直接判断是否非空即可
3.第二种写法(使用exists)
这个是参考帖子自己补充的一种方法
建表的语句
CREATE TABLE `demo` (
`id` int(11) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- 表中的测试数据
MariaDB [test]> select * from demo;
+------+------+
| id | name |
+------+------+
| 1 | root |
| 1 | NULL |
| NULL | root |
+------+------+
3 rows in set (0.000 sec)
- sql写法
select exists (select name from demo where name = 'roo1111');
MariaDB [test]> select exists (select name from demo where name = 'roo1111');
+-------------------------------------------------------+
| exists (select name from demo where name = 'roo1111') |
+-------------------------------------------------------+
| 0 |
+-------------------------------------------------------+
1 row in set (0.001 sec)
select exists (select name from demo where name = 'root');
MariaDB [test]> select exists (select name from demo where name = 'root');
+----------------------------------------------------+
| exists (select name from demo where name = 'root') |
+----------------------------------------------------+
| 1 |
+----------------------------------------------------+
1 row in set (0.000 sec)
- java代码
mapper的方法
/**
* 测试exists
* @return
*/
@Select("select exists (select name from demo where name = #{name1}) as existsuser")
Integer existsUser(@Param("name1") String name);
说明:
exists的结果只有0和1
假设没有的name的值
@Test
public void test(){
System.out.println(demoMapper.existsUser("root111").getClass());
System.out.println(demoMapper.existsUser("root111"));
Integer exist = demoMapper.existsUser("root111");
if ( exist ==1 ) {
//当存在时,执行这里的代码
System.out.println("当前用户已存在,不能再或者添加");
} else if(exist==0){
//当不存在时,执行这里的代码
System.out.println("该用户不存在可以添加");
}else{
System.out.println("这种情况不会发生");
}
}
/**
控制台打印:
class java.lang.Integer
0
该用户不存在可以添加
*/
假设有name的值
@Test
public void test(){
System.out.println(demoMapper.existsUser("root").getClass());
System.out.println(demoMapper.existsUser("root"));
Integer exist = demoMapper.existsUser("root");
if ( exist ==1 ) {
//当存在时,执行这里的代码
System.out.println("当前用户已存在,不能再或者添加");
} else if(exist==0){
//当不存在时,执行这里的代码
System.out.println("该用户不存在可以添加");
}else{
System.out.println("这种情况不会发生");
}
}
/**
控制台打印:
class java.lang.Integer
1
当前用户已存在,不能再或者添加
*/
4.总结
1.以上两种方法都可以判断条件判断是否存在某条记录
2.自我第二种方法比较好,因为不会存在空指针异常
3.第一种如果直接数据方法返回值结果,如果为null,会报空指针异常
4.这两种方法都不能按条件判断出表中有几条记录,如果查记录数,还是需要count()函数