自动映射,用于属性名和表中字段名一致的情况。
<select id="getUserList" resultType="com.atguigu.mybatis.bean.User">
select * from t_user
</select>
也可以使用别名的方式实现
<select id="getUserList" resultType="com.atguigu.mybatis.bean.User">
select user_name AS username
user_id AS id
from t_user
</select>
一对多
或多对一
或字段名和属性名
不一致的情况。<!--
resultMap:设置自定义映射
属性:
id:表示自定义映射的唯一标识
type:查询的数据要映射的实体类的类型
子标签:
id:设置主键的映射关系
result:设置普通字段的映射关系
association:设置多对一的映射关系
collection:设置一对多的映射关系
属性:
property:设置映射关系中实体类中的属性名
column:设置映射关系中表中的字段名
-->
<resultMap id="userMap" type="User">
<id property="id" column="id"></id>
<result property="userName" column="user_name"></result>
<result property="password" column="password"></result>
<result property="age" column="age"></result>
<result property="sex" column="sex"></result>
</resultMap>
<select id="testMohu" resultMap="userMap">
select id,user_name,password,age,sex from t_user
</select>
MyBatis获取参数值的两种方式:${}
和#{}
字符串拼接
;#{}的本质就是占位符赋值
,是指 MyBatis 在处理 #{} 时,就是把 #{} 替换成了 “?”,使用 PreparedStatement 的 set 方法来赋值例如现在有一个登陆程序,需要输入正确的账户和密码才能登录,当使用了 SQL 注入就可以在不知道密码的情况下进行登录。
1.SQL查询语句如下:
<select id="login" resultType="com.example.demo.entity.Userinfo">
select * from userinfo where username = '${username}' and password = '${password}'
</select>
2.接口如下:
/**
* 登录逻辑
* @param username
* @param password
* @return
*/
Userinfo login(@Param("username") String username,
@Param("password") String password);
3.测试方法为:
@Test
void login() {
String username = "admin";
String password = "' or 1 = '1";
Userinfo userinfo = userMapper.login(username, password);
System.out.println("登录状态:" + (userinfo == null ? "失败" : "成功"));
}
4.结果为:
5.原因为:
通过运行日志,可以看到此时的SQL语句为
select * from userinfo where username = 'admin' and password = '' or 1 = '1';
可以看出username = 'admin' and password = ''
的结果为false,'or 1 = '1
为true,所以将表中所有内容都查出来了。本来想要的是password='传进来的值'
,但是 ${} 直接拼接,导致 ’ or 1 = 1’ 左边的 ’ 和 ’ ${password} ’ 左边的 ’ 结合, 右边也结合,直接多出了一个or。
<select id="getEmpList" resultType="Emp">
select * from t_emp
<where>
<if test="name != '' and name != null">
name = #{name}
</if>
<if test="age != '' and age != null">
and age = #{age}
</if>
</where>
</select>
test
属性(即传递过来的数据)的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中的内容不会执行。<select id="getEmpByCondition" resultType="Emp">
select * from t_emp
<trim prefix="where" suffixOverrides="and|or">
<if test="empName != null and empName !=''">
emp_name = #{empName} and
</if>
<if test="age != null and age !=''">
age = #{age} and
</if>
<if test="sex != null and sex !=''">
sex = #{sex} or
</if>
<if test="email != null and email !=''">
email = #{email}
</if>
</trim>
</select>
前面添加某些内容
后面添加某些内容
前面去掉某些内容
后面去掉某些内容
choose...when...otherwise
相当于if...else if..else
<select id="getEmpByChoose" resultType="Emp">
select * from t_emp
<where>
<choose>
<when test="empName != null and empName != ''">
emp_name = #{empName}
</when>
<when test="age != null and age != ''">
age = #{age}
</when>
<otherwise>
did = 1
</otherwise>
</choose>
</where>
</select>
<delete id="deleteMoreByArray">
delete from t_emp where eid in
<foreach collection="eids" item="eid" separator="," open="(" close=")">
#{eid}
</foreach>
</delete>
sql片段,可以记录一段公共sql片段,在使用的地方通过include
标签进行引入
<sql id="empColumns">
eid,ename,age,sex,did
</sql>
select <include refid="empColumns"></include> from t_emp
1.新人一看就懂 #{} 和 $ {} 的区别
2.# 和 $ 的区别