mybatis中的一些使用

#{}与${}的区别

@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> 
<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" />

mybatis缓存:(了解即可,都是使用redis了)
一级缓存:默认开启,关不掉,数据缓存在SqlSession中,以类似map集合的形式存放,执行查询语句就会添加缓存,执行增删改语句就会清除缓存,以保证缓存与数据库数据的一致性

二级缓存:保存在SqlSessionFactory中,与SqlSession共用缓存,优先访问一级缓存,再访问二级缓存
一、默认关闭,需要在配置文件开启缓存
二、实体类需要实现序列化接口
三、mapper.xml中需要配置开启使用缓存{开启缓存,设置缓存大小,设置清除缓存策略(多用LRU,最近最少用原则)}

你可能感兴趣的:(Java,mybatis,mybatis,java,sql)