MyBatis-动态SQL/#{}和${}/日志配置

动态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了 我们测试一下
可以看到下面又输出了结果也输出了日志
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值