MyBatis:mybatis基础操作

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=""/>
  • 17
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值