SSM框架——Mybatis的select标签不同参数详解

本文详细解析了Mybatis中<select>标签在处理不同参数时的应用,包括单个参数、多个参数、Map封装多参数以及使用<foreach>元素进行循环遍历的情况。强调了${}和#{ }的区别,以及在实际操作中如何安全地处理参数,以避免SQL注入问题。同时,介绍了<foreach>元素在构建IN条件语句时的关键配置,如item、index、collection、open、close和separator属性的使用。

< select>元素的常用属性:

属性说明
id命名空间中唯一的标识符
parameterType传入sql语句的参数类的全限定名或别名(可选)
resultType从SQL语句中返回的类型的类的全限定名或别名。 若是集合类型,则返回的应是集合可包含的类型, 而不是其本身。
resultMap外部resultMap的命名引用。返回时可用resultType或resultMap
flushCache调用SQL语句后,是否需要Mybatis清空之前查询的本地缓存和二级缓存。(默认:false)
useCache控制二级缓存的开启和关闭(默认:true)
timeout设置超时参数,单位:秒
fetchSize获取记录的总条数设定
statementType设置Mybatis使用哪个jdbc的statement工作,其值为STATEMENT、PREPARED(默认)或CALLABLE
resultSetType结果集的类型
一、单个参数
public Book findBookById(String bookId);
<select id="findBookById" parameterType="String" resultMap="bookDetail">
        select *
        from l_book
        where book_id = #{bookId}
</select>
    <resultMap id="bookDetail" type="po.Book" >
        <id property="bookId" column="book_id"/>
        <result property="isbn" column="book_isbn" />
        <result property="bookPlace" column="book_place"/>
        <result property="publishDate" column="book_date"/>
        <result property="bookName" column="book_name" />
        <result property="author" column="book_author" />
        <result property="publisher" column="book_publisher" />
        <result property="bookPage" column="book_page"/>
        <result property="price" column="book_price"/>
    </resultMap>
  • id:命名空间中唯一的标识符
  • select 的 id 要和方法名称一致
  • 参数名称也要一致
  • 这里因为数据库字段名称和bean的字段名称不一样,所以使用了resultMap,注意名称要和< select> 中 的resultMap一致
    不需要映射的直接写 resultMap = "Book"即可
二、多个参数
public List<Book> findBookByfield(String field, String info);
 <select id="findBookByfield" resultMap="bookDetail">
        select *
        from l_book
        where ${arg0} like concat('%', #{arg1}, '%')
    </select>
  • 注意${} 和 #{}的区别:
    ${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中;
    #{}将传入的参数当成一个字符串,会给传入的参数加一个双引号;
    ${}不会添加引号,一般用于传输数据库的表名、字段名等,无法防止sql注入问题
  • 第一个参数用#{arg0}或者$ {arg0}获取,第二个为#{arg1}或$ {arg1}
  • 不能使用parameterType
三、Map封装多参数
public List<Book> findBookByPageNum(Page page);
<select id="findBookByPageNum" parameterType="po.Page" resultMap="bookDetail">
        select *
        from l_book
        limit #{startRecord}, #{endRecord}
</select>
  • startRecord和endRecord是Page中的字段名,有getter方法
四、< foreach>元素(循环遍历可迭代参数)

< foreach>元素常用于构建IN条件语句

public List<Book> findBookByList(List list);
<select id="findBookByList" parameterType="List" resultMap="bookDetail">
    select * from l_book where book_id in 
	<foreach collection="list" item="id" index="index" open="(" separator="," close=")">
		#{id}
	</foreach>
</select>
  • item:循环中的当前元素
  • index:当前元素在集合的下标
  • collection:list传递过来的参数类型(首字母小写),可以是array、list或collection、Map集合的键、POJO包装类中的数组或集合类型的属性名等。
    注意:1、collection为可迭代对象或数组时,index:当前迭代的次数,item:本次迭代获取的元素
        2、collection为字典或Map.Entry对象的集合时,index是键,item是值
  • open和close:将这些集合元素包装起来的符号
  • separator:各个元素之间的间隔符

在控制台输出mysql语句
    <!--在控制台输出sql语句-->
<settings>
	<setting name="mapUnderscoreToCamelCase" value="true" />
	<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值