动态SQL
if
最常见的的一种动态SQL标签,和代码里面的if一样用来判断,如果为true则进入,为false则不进入。
<select id="getTblUserId" parameterType="int" resultMap="userMapx">
select * from tbl_user where
<if test="id == 1">
u_id = #{id}
</if>
</select>
上面这代码表示如果id不等于1那么就不会进入,会导致SQL错误。
(建议正式写代码的时候不要向我这么写)
choose、when、otherwise
类似于Java中的switch一样
<select id="getTblUserSex" parameterType="String" resultMap="userMapx">
select * from tbl_user where u_id = u_id
<choose>
<when test="sex != null">
and u_sex = #{sex}
</when>
<when test="name != null">
and u_name = #{name}
</when>
<otherwise>
and u_id = 1
</otherwise>
</choose>
</select>
看上面代码,如果sex不为空那么就是以sex里面的为条件,而name也是一样的,但是是从上到下来判断只会拿一个when,如果when都为false,那么就会拿otherwise里面的条件
trim、where、set
<select id="getTblUserName" parameterType="String" resultMap="userMapx">
select * from tbl_user
<where>
u_name = #{name}
</where>
</select>
where标签就是用来当做Sql里面的where,在里面写条件。
再来看看自定义trim
<select id="getTblUserName" parameterType="String" resultMap="userMapx">
select * from tbl_user
<trim prefix="where">
u_name = #{name}
</trim>
</select>
trim自定义:
- prefix:在前缀加上
- prefixOverrides:在每一条Sql语句前面加上
- suffix:在后缀加上
- suffixOverrides:在每一条Sql语句后面加上
<update id="setTblUserNameAndId">
update tbl_user
<set>
u_name = #{name}
</set>
where u_id = #{id}
</update>
set标签用在updata(修改) 中把要修改的字段都写在set标签里面。
也可以用trim
<update id="setTblUserNameAndId">
update tbl_user
<trim prefix="set" suffixOverrides="," >
u_name = #{name}
</trim>
where u_id = #{id}
</update>
foreach
大家都用过代码里面的foreach吧,这个也很类似,用来进行遍历非常方便
Dao层方法
List<TblUser> getTblUserListId(List<Integer> list);
<select id="getTblUserListId" resultMap="userMapx">
select * from tbl_user
where u_id in
<foreach collection="list" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</select>
foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符,看它多智能!
- collection:获取方法里面参数名
- item:集合项,值都在这里面
- index:索引
- open:开头添加
- close:结尾添加
- separator:分隔符
你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。
#{}和${}
-
#{}:为参数的占位符?,预编译,变量替换是在DBMS中,变量替换后为对应的参数加上单引号,能防止SQL注入
-
${}:拼接符,为字符串拼接,sql拼接,变量替换是在DBMS外,变量替换后,不会加上单引号,不能防止SQL注入
#{}在mybatis中的底层是运用了PreparedStatement 预编译,传入的参数会以 ? 形式显示,因为sql的输入只有在sql编译的时候起作用,当sql预编译完后,传入的参数就仅仅是参数,不会参与sql语句的生成,而${}则没有使用预编译,传入的参数直接和sql进行拼接,由此会产生sql注入的漏洞。
日志配置
准备log4j包
<!-- 日志 包-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.28</version>
</dependency>
然后配置log4j.properties
# 全局日志配置
log4j.rootLogger=ERROR,STDOUT
# MyBatis 日志配置
log4j.logger.com.dao.TblUserDao=TRACE
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
日志输出有这几种级别:DEBUG<INFO<WARN<ERROR<FATAL
- 通知:DEBUG,INFO
- 警告:WARN
- 错误:ERROR
- 严重错误:FATAL
在mybatis-config,xml中配置
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
然后就ok了 我们测试一下
可以看到下面又输出了结果也输出了日志