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

被折叠的 条评论
为什么被折叠?



