MyBatis小技巧
大约 3 分钟
MyBatis小技巧
#{} 和 ${} 占位符
SQL 映射文件中可以使用 #{} ${} 两个占位符。
#{}:先编译sql语句,再给占位符传值,底层是PreparedStatement实现。可以防⽌sql注⼊,⽐较常⽤。
- 占位符两侧会包上一层
'',防止sql注入。
${}:先进⾏sql语句拼接,然后再编译sql语句,底层是Statement实现。存在sql注⼊现象。
只有在需要进⾏sql语句关键字拼接的情况下才会⽤到。
实际参数会直接拼接至 sql 中,替代原来的
${},两侧不会包上''。
和 JDBC 一样,能使用预编译就使用预编译,即 #{} 优于 ${}。
占位符中可以访问下级属性,如:#{student.name}。
使用 ${} 的情况
当需要进⾏sql语句关键字拼接的时候。必须使⽤
${},如order by ${}。需要拼接表名时,也需要使用
${},如form t_log_${time}。需要或匹配时,也需要使用
${}。where id = ${k1}; k1 = 'AAA' or id = 'BBB' => where id = 'AAA' or id = 'BBB'; where id in(${ids}); ids = 1,2,3 => where id in(1, 2, 3);模糊查询时,也需要使用
${}。brand like '%${brand}%'; brand like concat('%','${brand}','%'); # 鸡肋 brand like concat('%',#{brand},'%'); brand like "%"#{brand}"%"; # 常用,注意两侧是双引号其他情况
给封装类起别名
在 SQL映射文件中,select语句封装类型需要指定全限定类名。MyBatis提供了别名机制,通过配置全限定类名的别名,以简化select返回类型的配置,同时也方便修改。
在 mybatis-config.xml ⽂件中使⽤ <typeAliases> 标签来起别名,包括两种⽅式:
<!--使用 <typeAlias> 标签-->
<typeAliases>
<typeAlias type="com.powernode.mybatis.pojo.Car" alias="Car"/> <!--alias 即为类的别名-->
</typeAliases>- alias属性不是必须的,如果缺省的话,type属性指定的类型名的简类名作为别名。
- alias 不区分大小写,使用时随便大小写都可以。
<!--使用 <package> 标签-->
<typeAliases>
<package name="com.powernode.mybatis.pojo"/>
</typeAliases>- 指定包名,该包下的所有类都自动起别名,且别名为类的简名(默认值)。
- 也可以配置多个package。实际开发使用。
使用别名
在 SQL映射文件 中可以使用核心配置文件中起的别名。
<!--sql Mapper-->
<!--namespace 不支持别名-->
<mapper namespace="com.powernode.mybatis.mapper.CarMapper" />
<select id="..." resultType="alias">
...
</select>- namespace不能使用别名机制。
- 别名使用时不区分大小写。
IDEA 中配置文件模板

核心配置文件 mybatis-config.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"/>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="" />
</mappers>
</configuration>jdbc.properties:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/bjpowernode
jdbc.username=root
jdbc.password=123456SQL 映射文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">
</mapper>插入数据时获取自动生成的主键
<!--
useGeneratedKeys="true" 使用自动生成的主键值
keyProperty:将主键值通过 setter 设置在传参的pojo中
-->
<insert id="insertUseGeneratedKeys" useGeneratedKeys="true" keyProperty="id">
insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>