#{}与${}的区别
@Delete("delete from emp where id = #{id}")
//生成预编译SQL语句,效率更高,将#{id}替换为“?”,也更安全,防止SQL注入,#不能出现在''中,因此不能用于模糊查询
@Delete("delete from emp where id = ${id}")
//将id拼接在sql语句中,每次都要生成新语句,效率慢,而且有SQL注入的安全风险,$可以出现在''中,可以用于模糊查询
他俩的区别与Java JDBC中PreparedStatement和Statement的区别一样
返回并拿到操作的数据的主键
@Options(keyProperty = “id”,useGeneratedKeys = true)
useGeneratedKeys = true表示我们要获取返回的主键
keyProperty = “id”,将返回来的主键封装进往实体类的哪个属性,此处为id
#配置mybatis的日志,指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#开启mybatis的驼峰命名自动映射开关 ab_cd -> abCd
当数据表的字段名与实体类的属性名不一致时,mybatis不能完成自动封装。比如dept_id 与deptId
在application.properties文件中配置,或者为字段取别名,再或者使用@result和@results注解
mybatis.configuration.map-underscore-to-camel-case=true
在进行模糊查询时,由于#不能放进""或 ’ '内,所以无法完成预编译SQL语句,$可以放进 ’ ’ 内,但有SQL注入的风险,所以可以采用concat函数来解决
@Select("select * from emp where name like concat('%',#{name},'%') and gender=#{gender}
动态SQL语句重要标签
<if test="条件">语句</if>
<where></where> <!--可以去掉多余的and,or等关键字,若if都不满足,则where本身也去掉!-->
<set></set><!--可以去掉多余的逗号--><foreach collection="数组/集合名" item="遍历的元素" separator="分隔符" open="遍历开始前拼接的SQL片段" close="遍历结束后拼接的SQL片段">#{}</foreach>
<!--主要用于批量操作 -->
如:
接口方法:void deleteById(Integer[] ids);
SQL语句:delete from emp where id in (18,30,24);
<delete id="deleteById">delete from emp where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach>
</delete>定义:
<sql id="唯一标识">需要重复使用的SQL语句片段</sql>
引用:
<include refid="需要使用的sql的id" />