MyBatis(二:增强)

这篇文章主要写的是:Mapper.xml=OGNL表达式(#{})+动态SQL(标签)

=========================================================
OGNL:Object-Graph Navigation Language,表达式中有三种符号,分别是#(使用最多)、$(一般不用)和%(目前还没用过);作用就是取值

先上代码

	<select id="findOne" parameterType="long" resultType="Product">
		select * from product where id = #{id}
	</select>

在mapper文件中,#和$都是可以用的,但是!!!,一般都选#,原因如下:
1、二者都可以获取传过来的对象的属性/map(就是通过实体类的Bean属性中的可读属性,即get方法;去获取对象属性,即成员变量的值),但是#还可以直接获取值
例如上面的代码,对应接口中的抽象方法

Product findOne(Long id)

在调用的时候,传入一个Long型的参数,比如:1L;用#,是不会有任何问题的,但是如果用$,因为它只能通过get方法去获取参数的值,所以就会报这样的错:There is no getter for property named for “id” in “class java.lang.Long”
在这里插入图片描述
2、#底层是调用的PreparedStatement,所以是预处理的方式;而后者(这里我为什么要用后者,原因在文章最后)是调用的Statement,所以是拼接的方式。不同的执行方式就会产生主要两点的差别
2.1、安全问题:#更安全,不存在SQL注入(点进去,第7点)
2.2、因为在sql语句中,如果遇到值是中文,是需要"或者’包围起来的,所以用后者的时候,只写{}是不行的,会报错:com.mysql.jdbc.exception.jdbc4.MySQLSyntaxErrorException:Unkown column “xx” in “where clause”,所以还要在sql中加上"或者’
在这里插入图片描述
综上所述:后者只能用在传入的参数是对象,且值为非中文的情况下,但在xml文件中,我干嘛要一些地方用#,一些地方用后者呢?所以xml文件中全用#

==============================================================
动态SQL
什么叫动态SQL?就是SQL语句不写死,通过判断来决定SQL结构,一般用到的标签:sql、where、if、include、foreach等

高级查询:

	<select id="findAll" resultType="cn.itsource.domain.Article">
		select * from t_article 
		<include refid="query"></include><!-- 通过id,引用sql片段-->
		limit #{loPage},#{pageSize}
	</select>
	
	<sql id="query"><!--sql标签,就是抽取重复使用的部分,跟java中抽取方法是一个道理-->
		<where><!--用标签,而不是直接用where,是因为标签可以对sql语句进行检查,比如下面第一句-->
		
			<if test="typeId != null"><!--值为数字,判断是不是null即可-->
				and typeId=#{typeId}<!--where标签会检查,自动去掉and-->
			</if>
			<if test="age &gt;= 18"><!--大于、小于这类的符合会闭合掉标签,所以用对应的转义字符,小于是&lt;-->
				and age>=#{age}
			</if>
			<if test="enable != null">
				and enable=#{enable}
			</if>
			
			<if test="title != null and '' != title.trim()"><!--值为字符串,还要去空后判断是否为空字符串,防用户,当然只能去字符串两边的空格-->
				and title like concat('%',trim(#{title}),'%')<!--这是经过测试后的模糊查询的较好写法-->
			</if>
		</where>
	</sql>

批量插入:

	<!--
		在mybatis中,可以传集合与数组过来,mybatis会把它变成Map
           如果传的是集合,对应的key就是list
           如果传的是数组,对应的key就是array
        执行批量添加功能
        1.parameterType中接收的是集合类型(也可以写全限定名:java.util.List)
        2.collection="list" 使用集合的话,默认就是使用list与collection来接收
        3.separator=","  每遍历一次后的分隔符,因为sql语句里需要
        4.item="p"  每次遍历的这个对象别名,通过.,就可以获取对象中的属性值了
    -->
    <insert id="batchInsert">
        insert into product (name,price) values
        <foreach collection="list" separator="," item="p">
            (#{p.name},#{p.price})
        </foreach>
    </insert>

批量删除:

	<!--
        1.open="(" 以什么开始
        2.close=")"  以什么结束
    -->
    <delete id="batchDelete" parameterType="list">
        delete from product where id in
        <foreach collection="list" separator="," item="id" open="(" close=")">
            #{id}
        </foreach>
    </delete>

resultMap:完成多张表关联查询的结果映射

这里还有一些细节哦!(参数与别名)

==========================================================
这是我写到一半发现的。。。
在这里插入图片描述

おすすめ

転載: blog.csdn.net/ExceptionCoder/article/details/108705337