MyBatis基础操作
新增
接口方法
@Insert()
insert();
删除
接口方法
@Delete()
delete();
@Delete("delete from emp where id = #{id}")
public abstract void delete(Integer id)
//如果只传了一个形参,括号内可以随意写
修改
接口方法
@Update()
update();
查询
接口方法
@Select()
select();
条件查询
接收参数方式一:
直接拼接参数,只能使用${…}(?占位符不能放在单引号内)
使用@Param(“参数名”)标明参数
@Select("select * from emp where name like '%${name}%' and gender
= #{gender} and entrydate between #{begin} and #{end} order by
update_time desc")
public List<Emp> list(@Param("name")String name,
@Param("gender")Short gender , @Param("begin")LocalDate begin
,@Param("end")LocalDate end);
接收参数方式二:
使用concat拼接参数,可以使用预编译sql
@Select("select * from emp wher e name like concat('%',#{name},'%')
and gender = #{gender} and entrydate between #{begin} and #{end}
order by update_time desc")
public List<Emp> list(@Param("name")String name,
@Param("gender")Short gender , @Param("begin")LocalDate begin
,@Param("end")LocalDate end);
mybatis日志输入
在properties配置文件中配置mybatis日志输出位置
#指定mybatis输出日志的位置, 输出控制台
mybatis.configuration.logimpl=org.apache.ibatis.logging.stdout.StdOutImpl
预编译SQL
使用?对sql语句中的参数进行提前占位
优势:
性能更高
预编译SQL,编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条insert语句时,
防止SQL注入
将敏感字进行转义,安全.
SQL注入
通过操作输入来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法.
非预编译sql语句每次加载都需要重新编译
预编译sql语句无需重新编译(在内存中保留)
参数占位符
项目中建议使用#{…},防止SQL注入
${...}
#拼接SQL,直接将参数拼接在SQL语句中,存在SQL注入问题
#使用时机:对列名和表名进行动态设置时使用
`#{...}`
#编译时会将#{...}替换成?,不存在sql注入问题
#生成预编译SQL,自动设置参数
#使用时机:参数传递时,都使用#{...}
自增主键回填
在添加数据完成后,自动获取新数据的主键赋值给对象属性
使用注解@Options(useGeneratedKeys = true, keyColumn = “id”,keyProperty = “id”)
keyColumn 数据库主键名称
keyProperty 实体类主键名称
数据封装
实体类属性名需要与数据库表查询返回的字段名一致,mybatis会自动封装为实体类
1,在SQL语句中起别名与实体类属性名一致也能完成映射
2,使用
@Results({
values={
@Result(column = ""
property = "")
})
}
进行手动映射
3,开启驼峰命名(推荐)
mybatis会自动通过驼峰命名规则映射
aB = a_b
参数名说明
springBoot在1.x版本中,所有接口方法形参的变量如果有多个,就需要通过@Param注解来指定SQL语句中的参数名
在2.x版本之后,springBoot的父工程对compiler编译插件进行了默认的参数parameters配置,使得在编译时会在字节码文件中保留原方法形参的名称,所以#{…}里面可以直接通过形参名获取对应值.
eg:
sql语句中直接写: id = #{id}
MySQL动态SQL
会随着用户的输入或者外部条件的变化而变化的SQL语句,称为动态SQL
XML映射文件
如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,即将SQL语句写在XML配置文件中
SQL映射配置文件需要符合一定规范:
XML映射文件的名称和Mapper接口名称一致,且将XML映射文件和Mapper接口放在相同的包下(在resource下创建相同的包).
XML映射文件中的namespace属性为Mapper接口全限定名一致
XML映射文件中sql语句的id与Mapper接口中的方法名一致,且保持参数类型和返回值类型一致
@Mapper test{
List<Emp> list (String name...)
}
<mapper namespace = "com.itheima.mapper.EmpMapper">
<select id="list" resultType="">
sql语句
</select>
<delete id='delete'>
sql
</delete>
</mapper>
//resultType属性标明了查询返回的单条记录封装的类型(实体类)
resultType:实体类全限定名
resultMap:
resultType的一种升级,当实体类无法直接映射时,需要用到resultMap进行手动映射
如下:
标签解析:属性column为字段名,property为实体类属性名
id:标识主键
result:其他列标识
collection:标识集合
<mapper namespace="mapper.RoleMapper">
<resultMap id="pp" type="role" autoMapping="true">
<id property="rid" column="rid"/>
<!-- property 保存集合的属性名 -->
<!-- column 指定查询需要的参数 会将当前对应数据传入查询语句 -->
<!-- select可以调用对应空间下查询语句进行结构的查询 -->
<!-- fetchType=lazy 开启懒加载 默认为eager 侵入式查询 会直接调用查询语句执行-->
<collection property="ps" column="rid" select="mapper.PermissionMapper.selectByRid"
fetchType="lazy"/>
</resultMap>
<select id="selectAll" resultMap="pp">
select *
from role
</select>
</mapper>
IF
用于判断条件是否成立,使用test属性进行条件判断,如果条件为true,则拼接SQL
条件查询
<if test = 条件>
拼接sql语句
</if>
<where>
只有在存在子元素的情况下才会插入where子句,且自动去除子句开头的AND或OR
</where>
SET
用于实现部分修改,自动去除修改语句后的逗号
<set>
<if>
aaa = bbb,
</if>
</set>
Foreach
<foreach
collection=""
item="id"
separator
open
close>
#{id}
</foreach>
collection:要遍历的集合名称
item:集合遍历出来的元素/项
separator:每次遍历使用的分隔符
open:遍历开始前拼接的片段
close:遍历结束后拼接的片段
sql/include
sql:对sql语句进行封装
<sql id="">
sql语句
</sql>
include:对封装语句进行复用
<include refid=""/>