动态sql语句 ----最初的经典 where 1=1
添加where
<select id="findUserById" resultType="String">
select user from UserTable where 1=1
<if test="Id!='' and Id!=null and Id!=0"> 如果这个条件满足,不至于丢失where
and id=#{id}
</if>
</select>
org.apache.ibatis.annotations.Param注解 数据匹配 解释
在mybatis的Map类中,方法参数为多个时,前面一般需要加上@Param注解,例如
User getUser(@Param(“userId”)String userId,@Param(“password”)String password);
@Param注解分为spring的和mybatis的:
org.springframework.data.repository.query.Param与org.apache.ibatis.annotations.Param
两者的区别在于
在使用org.springframework.data.repository.query.Param时,参数要按照先后顺序传入
select * from user where user_id= #{0,jdbcType=VARCHAR} and password=#{1,jdbcType=VARCHAR}
而在使用org.apache.ibatis.annotations.Param时,只需要使用参数名即可
select * from user where user_id= #{userId,jdbcType=VARCHAR} and password=#{password,jdbcType=VARCHAR}
所以在使用上,我们一般都使用mybatis的@Param注解,如果没有使用@Param注解,则参数将会以它们的顺序位置来和SQL语句中的表达式进行映射。
————————————————
原文链接:https://blog.csdn.net/zk052300/article/details/100672072
数据匹配
一:mybatis 接口类map 与mapper.xml 中参数匹配
二:从数据库表中查询的字段与返回类的属性值匹配
动态if 判断的参数来自mapper.java类----接口层
- if中参数来自于@Param(‘这里参数’) ---------@Param(‘A’) String B -----将B的参数值传递给A
- 注意mapper 接口层方法中@Param注解 , 选择org.apache.ibatis.annotations.Param
——————》》》这是mapper.java
List<User> findUserById( @Param("name") String name,@Param("id") String id);
——xml实现上边接口方法————》》》这是mapper.xml
<if test="id!='' and id!=null and id!=0"> if中参数来自于@Param('这里参数')
---注意上边的参数如何判断为空为null,不等于0----
and id=#{id} -----#{id} 也可用${id}
</if>
# {id} 也可用${id}
比较一:
<if test="id!='' and id!=null and id!=0"> if中参数来自于@Param('这里参数')
and id=#{id} -----#{id} 也可用${id}
</if>
比较二:
<if test="id!='' and id!=null and id!=0"> if中参数来自于@Param('这里参数')
and id=${id} -----#{id} 也可用${id}
</if>
判断某个参数是否为空 用 单引号 ’ ’
<if test="val !=' '">
数据分页----使用限制limit
limit子句用于限制查询结果返回的数量。
用法:【select * from tableName limit i,n 】
参数:
tableName : 为数据表;
i : 为查询结果的索引值(默认从0开始);
n : 为查询结果返回的数量
当用户点击某一页数据
limit ${bNum},${rows} //bNum 用户当前选择起始索引,rows 是查询返回记录数
从哪一页开始,通过js发送请求命令,得到多少页的记录
查询某个时间段或某个时间范围的记录
BETWEEN 操作符
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期
方法一:
<select id="findUserById" resultType="User">
SELECT * FROM tableName WHERE createtime BETWEEN #{bt} and #{et}
</select>
方法二:
<if test="definedata==1"> <!--动态sql判断-->
AND m.CREATE_TIME <![CDATA[>=]]> #{bt} //xml不能直接写 =< 或者>=
AND m.CREATE_TIME <![CDATA[<=]]> #{et}
</if>
字段为null ≠ 字段为空 记录查询
查询数据表中某个字段为空的记录或者不为空的记录 区分为空的记录
不是空的字符串 ’ ’ 字段 , 简而言之 null ≠ 字段为空
字段为null ≠ 字段为空
<if test="currentState == 0 ">
and cs.currentStateName is not null
</if>
<if test="currentState == 1 ">
and cs.currentStateName is null
</if>
比较二
<if test="fields!='' and fields!=null and fields!=0">
and fieldsId=#{fieldsId}
</if>
查询语句返回类问题 resultType=?
1.如果选择的类不正确,会导致从数据表中查询返回的字段不能匹配对应返回类的属性,导致类属性赋值失败
2.如果类中属性虽然包含了数据库表字段,但是多余表中字段,类中其他不能匹配的属性值为默认初始值,如String 为空字符串
3.返回类中属性可能与数据表中字段不一定完全相同,但是sql语句查询结束会进行模糊匹配,如表字段meterid 而类中属性是meter_id ,那么也会将meterid值赋给meter_id;
4.表中字段与返回类的属性字段模糊匹配 如,字段createtime ,类属性中createTime, 会进行查询出的字段值赋给类属性值
<select id="findshenshuiDuiJie" resultType="UserAndMeter">
SELECT * FROM tableName where meterid=#{meterId} AND imei=#{imei}
</select>
<!-- 如果选择的类不正确,会导致返回的字段不能匹配类的属性-->
排除:选择不再某个时间范围或者不再某个时段的文本 ----not 应用
对应填写字段规范
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
实操:
SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'
参考 https://blog.csdn.net/yihanzhi/article/details/82784770
查询返回数据的总记录数
<select id="selectTotalDataRecords" resultType="int">
select num from tableName where condition=#{condition}
</select>
表的左右连接
分为左外连接,右外连接,
左外连接:根据左表的记录,在被连接的右表中找出符合条件的记录与之匹配,找不到匹配的,用null填充
右连接:根据右表的记录,在被连接的左表中找出符合条件的记录与之匹配,找不到匹配的,用null填充
==================================================
--就是向 左边还是右边的表看齐,查找对应右边或者左边的表是否查询出对应的数据,
如果无,
当是左连接,在被连接的右表中找出符合条件的记录与之匹配,找不到匹配的,用null填充
当是右连接,在被连接的左表中找出符合条件的记录与之匹配,找不到匹配的,用null填充
参考连接: https://blog.csdn.net/csdn_life18/article/details/108099935?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-0-108099935-blog-106226111.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_index=2
嵌套查询 ——》》 in 语句 和 = 语句 区别
SELECT SName
FROM Student
WHERE Sex='女' AND Sno NOT IN
(
SELECT Sno
FROM Stduy
WHERE Grade<90
)
注意:这里子查询返回的Sno可能有多个,
所以要用到谓词 IN,如果用 =,则报错,因为 = 表示子查询的返回值是唯一的
嵌套对比
方法一:嵌套
SELECT Sno,SName
FROM Student
WHERE Sno IN
(
SELECT Sno
FROM Study
WHERE Cno IN //用 in 存储筛选的嵌套记录
(
SELECT Cno
FROM Course
WHERE CName='高等数学'
)
)
方法一和方法二比较:相当于连接查询
SELECT
Student.Sno, SName
FROM
Student, Course, Study
WHERE
Student.Sno = Study.Sno
AND Course.Cno = Study.Cno
AND Course.CName = '高等数学'
参考链接:同左右连接的链接
模糊查询
<if test="screenkey !='' and screenkey is not null ">
and r.field like '%${screenvalue}%'
</if>
字段拼接
执行语句 SELECT CONCAT('M','y','S','Q','L') 可以达到如下效果
将三张表的地址数据进行拼接,然后显示记录
<select id="querytData" resultType="User">
select m.*,f.*,c.*,concat( m.area, f.address, c.address ) AS addr_yonghu
from tablename1 m ,tablename2 f,tablename3 c
</select>
拼接举例子
mysql> SELECT CONCAT('my', 's', 'ql');
-> 'mysql'
mysql> SELECT CONCAT('my', NULL, 'ql');
-> NULL
mysql> SELECT CONCAT(14.3);
-> '14.3'
SQL之CASE WHEN用法详解 --应用场景
SELECT `currentName`, case HIERARCHY (拿表中字段数值进行判断)
when 1 then '管理员'
when 2 then '普通用户'
end as currentAuthory FROM `AuthorityTable`
注意:如果你想判断score是否null的情况,WHEN score = null THEN ‘缺席考试’,这是一种错误的写法,正确的写法应为:
CASE WHEN score IS NULL THEN '缺席考试' ELSE '正常' END
删除表的重复行和having 和where 区别
删除表的重复行: https://www.yiibai.com/mysql/delete-duplicate-rows.html
having与where的区别: https://segmentfault.com/a/1190000008284099
B表某些字段导入到A表某些数据字段–数据恢复
INSERT INTO A表( 列名1,列名2 ) SELECT 对应前边列名1,对应前边列名2 FROM B表 WHERE [筛选的字段名] in ( 筛选的字段值--这里注意字段类型是int 还是varchar 等类型 );
INSERT INTO A表( 列名1,列名2 ) SELECT 对应前边列名1,对应前边列名2 FROM B表 WHERE [筛选的字段名] in ( );
order by desc group by 问题
等待更新详解....