MyBatis 框架

MyBatis特性

1.MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
2.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果
3.
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和JavaPOJO映射成数据库中的记录
4.
MyBatis 是一个 半自动的ORM  (Object Relation Mapping)框

MyBatis优点

1.不需要编写繁琐的实现过程 减少代码量
2.基于接口编程
3.解耦SQL语句
4.与Spring系列框架高度集成(Spring /Spring Boot)
5.支持预编译 杜绝出现SQL注入问题
6.SQL代码片段可以复用
7.支持自定义ORM映射 自动封装结果(什么是ORM映射?)
8.支持动态SQL语句 <if> <foreach>

MyBatis缺点

1.需要编写大量SQL语句 JPA可以根据规范自动生成SQL语句
2.数据库移植性较差 如果更换数据库 需要调整SQL

MyBatis在pom.xml依赖项

<dependencies>
<!-- Mybatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>

<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

<!--Mybatis整合Spring的依赖项:mybatis-spring-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>

<!--Spring的依赖项:spring-context-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.14</version>
</dependency>

<!--Spring JDBC的依赖项:spring-jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.14</version>
</dependency>

<!--MySQL连接的依赖项:mysql--connector-java-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>

<!--数据库连接池的依赖项:commons-dbcp2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>

在src/main/resources下创建datasource.propertiesi配置文件用于配置连接数据库的参数,例如:

datasource.url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&ch aracterEncoding=UTF-8&serverTimezone=Asia/Shanghai 
datasource.driver=com.mysql.cj.jdbc.Driver 
datasource.username=root //数据库账号
datasource.password=root //数据库密码
mybatis.mapper-locations=classpath:mapper/*.xml

Mybatis的基本使用

当使用Mybatis实现数据访问时,主要:
编写数据访问的抽象方法
关于抽象方法:
-必须定义在某个接口中,这样的接口通常使用Mapper作为名称的后缀,例如AdminMapper
    -Mybatis框架底层将通过接口代理模式来实现
-方法的返回值类型:
-如果要执行的数据操作是增、删、改类型的,统一使用int作为返回值类型,表示“受影
 响的行数”,也可以使用Void,但是不推荐
-如果要执行的是查询操作,返回值类型只需要能够装载所需的数据即可(POJO)
配置抽象方法对应的SQL语句
关于抽象方法:
-方法的名称:自定义,不要重载,建议风格如下:
-插入数据使用`insert`作为方法名称中的前缀或关键字
-删除数据使用`delete`作为方法名称中的前缀或关键字
-更新数据使用`update`作为方法名称中的前缀或关键字
查询数据时:
如果是统计,使用`count`作为方法名称中的前缀或关键字
如果是单个数据,使用`get`或`find`作为方法名称中的前缀或关键字
·如果是列表,使用'list'作为方法名称中的前缀或关键字
如果操作数据时有条件,可在以上前缀或关键字右侧添加`by字段名`,例如deleteByld

所有用于Mybatis处理数据的接口都必须被Mybatis识别,有2种做法:
- 在每个接口上添加@Mapper注解
-【推荐】在配置类上添加@MapperScan注解,指定接口所在的根包

例如,在SpringConfig.上添加配置@MapperScan:
@Configuration
@PropertySource("classpath:datasource.properties")
@Mapperscan("cn.tedu.mybatis.mapper")
public class SpringConfig{
 //.....
}
注意:因为Mybatis会扫描以上配置的包,
并自动生成包中各接口中的代理对象,所以,千万不要放其它接口文件

关于XML文件节点配置

新增数据节点

在<insert>:节点配置2个属性,分别是useGeneratedKeys和keyProperty:

<insert id="insert" useGeneratedKeys="true" keyProperty="id"> 
原有代码 
</insert>
以上
useGeneratedKeys 设置为"true"表明要 MyBatis 获取由数据库自动生成的主键
keyProperty指的就是将自动编号的值放回到参数对象的哪个属性中!

删除数据节点

修改数据节点

在AdminMapper接口中添加抽象方法:
int updatePasswordById(@Param("id")Long id,
                       @Param("password")String password);

在AdminMapper.Xml中配置以上抽象方法映射的SQL语句:
<update id="updatePasswordById">
update ams_admin set password=#{password} where id=#{id}
</update>




提示:以上占位符中的名称是通过@Param注解指定的名称,而不是抽象方法的参数名称


提示:在默认情况下,当Java程序源代码(.java文件)经过编译后,所有局部的量的名称都会丢失,为使得配置SQL语句时可根据指定的名称使用方法中的参数值,需要在方法的各参数前添加@Param以指定名称如果方法的参数只有1个,则可以不使用@Param指定名称,因为Mybatis可以直接找到此参数的值

 查询数据节点

需要注意,如果查询结果集中的列名与类的属性名不匹配时,默认将放弃处理这些结果数据,则返回的对象中对应的属性值为null
为了解决此问题,可以在查询时使用自定义的别名,使得名称保持一致,不过,更推荐配置<resultMap>以指导Mybatis封装查询结果

动态 SQL--foreach

在AdminMapper接口中添加抽象方法:
int deleteByIds(Long...ids);


在AdminMapper.Xml中配置以上抽象方法映射的SQL语句:
<!--int deleteByIds(List<Long>ids);-->
<delete id="deleteByIds">
delete from 表名 where id in(
<foreach collection="list"item="id"separator=",">
    #{id}
</foreach>
)
</delete>

以上代码中:
-<foreach>标签:用于遍历集合或数组类型的参数对象
-collection属性:被遍历的参数对象,当抽象方法的参数只有1个且没有添加
 @Param注解时,如果参数是List类型则此属性值为list,如果参数是数组类型(包
 括可变参数)则此属性值为array;当抽象方法的参数有多个或添加了@Param注解
 时,则此属性值为@Param注解中配置的值
-item属性:自定义的名称,表示遍历过程中每个元素的变量名,可在<foreach>子级
 使用#{变量名}表示数据
-separator属性:分隔符号,会自动添加在遍历到的各元素之间

在Mybatis中动态SQL还有其它节点,例如:
- <if>
- <choose>/<when>/<otherwise>
- 其它

Mybatis中#{}和${}区别

相同点:::都是写在SQL语句中 都是表示参数值的

什么是SQL注入:在实际运行时,传入的参数值可能会改变语义,导致SQL语句与预期的不同

预编译概念

编译: 在执行前都需要进行编译 利于:语法分析 语义分析等 可能会通过特殊字符串改变语义

预编译: 在尚未缺点某些值的情况下进行执行编译

eg: where id=? 一但预编译就不会出现SQL注入的风险 因为以及确定了语义

#{} 占位符

使用的是PreparedStatement 进行处理的
是预编译的 只可以代表某个值 不可以代表SQL语句中的某个片段
不需要考虑参数值的数据类型 语义已经确定 不存在SQL注入

${} 占位符

是单纯吧占位符的参数替换掉 可以表示SQL语句中的任意片段 只需要保证语句合法即可 需要考虑数据类型 也需要考虑SQL注入的风险

Mybatis 总结

1.
- 了解如何创建一个整合了Spring框架的Mybatis工程
- 了解整合了Spring框架的Mybatis.工程的配置
- 掌握声明抽象方法的原则:
- 返回值类型:增删改类型的操作均返回int,表示“受影响的行数”,查询类型操作,根据操作得到
  的结果集来决定,只要能够放入所有所需的数据即可,通常,统计查询返回int,查询最多1个结果
  时返回自定义的某个数据类型,查询多个结果时返回List集合类型
- 方法名称:自定义,不要使用重载
- 参数列表:根据需要执行的SOL语句中的参数来设计,并且,当需要执行的是插入数据操作时必
须将这些参数进行封装,并在封装的类中添加主键属性,以便于Mybatis能获取自动编号的值回填
到此主键属性中,当需要执行的是其它类型的操作时,如果参数数量较多,可以封装,如果只有1
个,则直接声明为方法参数,如果超过1个且数量不多,则每个参数之前添加@Param注解

2.
- 了解使用注解配置SQL语句
- 掌握使用XML配置SQL语句
- 这类XML文件需要顶部特殊的声明,所以,通常是从网上下载或通过复制粘贴得到此类文件
- 根节点必须是<mapper>,且必须配置namespace,取值为对应的Java接口的全限定名
- 应该根据要执行的SQL语句不同来选择<insert>、<delete>、<update>、<select>节点,这些节
点都必须配置ⅰd属性,取值为对应的抽象方法的名称
- 其实,<delete>节点和<update>节点可以随意替换使用,但不推荐
- 在不考虑“获取自动生成的主键值”的情况下,<insert>和<delete>、<update>也可以混为一谈,
  但不推荐
- 当插入数据时,当需要获取自动生成的主键值时,需要在<insert>节点上配置useGeneratedKeys
  和keyProperty)属性
- 在<select>节点上,必须配置resultMap或resultType.属性中的其中1个

3.
- 掌握使用<sql>封装SQL语句片段,并使用<include>进行引用,以实现SQL语句的复用
- 掌握<resultMap>的配置方式
- 主键列与属性的映射必须使用<id>节点配置
- 在1对多、多对多的查询中,集合类型的属性的映射必须使用<collection>子节点配置
- 其它列与属性的映射使用<result>节点配置
- 在单表查询中,列与属性名一致时,可以不必显式的配置,但是,在关联查询中,即使
  列与属性名称一致,也必须显式的配置出来

4.
- 理解resultType与resultMap使用原则
- 尽可能的全部使用resultMap,如果查询结果是单一某个数据类型(例如基本数据类型或
   字符串或某个时间等),则使用resultType
- 掌握动态SOL中的`<foreach>`的使用
- 大概了解动态SQL中的其它标签
 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙慧德

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值