跳转至

Mybatis教程

(原创)mybatis教程


1. 定义

 mybatis是一个持久层框架(数据访问层),用于简化JDBC的开发。

2.配置SQL语句

  • 方案一:使用注解。
  • 方案二:配置XML映射文件。

3.JDBC与mybatis对比:

JDBC

  • 1.需要自己写SQL语句,需要手动处理连接和事务管理。

  • 2.频繁的获取连接释放连接导致资源浪费与性能降低。mybatis提供了数据库连接池技术来解决该问题。

  • 3.数据库连接需要手动处理,繁琐。

  • 4.SQL语句写在代码中,造成代码不易维护,实际应用SQL变化的可能较大,sql变动需要改变java代码。

mybatis

  • 1.只需要编写SQL语句和映射关系,不需要手动处理连接和事务管理。

  • 2.mybatis使用ORM思想将数据库记录映射到java对象中,可以省去很多手动设置结果集的操作。

  • 3.使用mybatis可以避免SQL注入问题。

  • 4.mybatis使用xml文件配置SQL语句,可以方便地管理SQL语句。如下是mybatis的数据库连接的解决方案。

    img


    4.数据库连接池:

    定义

    • 一个负责分配、管理数据库连接的容器。

    优点

    • 1.提高数据库连接的效率。

    • 2.避免数据库连接资源浪费。

    • 3.便于数据库连接的管理。

    接口

    • 1.DataSource:数据源接口,用于获取数据库连接。(最关键接口,自主开发连接池必须实现该接口)

    • 2.Connection:数据库连接接口,用于执行SQL语句。

    • 3.Statement:SQL语句执行接口,用于执行SQL语句。

    • 4.PreparedStatement:预编译SQL语句执行接口,用于执行SQL语句。

    • 5.ResultSet:结果集接口,用于获取查询结果。

    实现

    • 1.DBCP:Apache提供的数据库连接池。

    • 2.C3P0:C3P0是hibernate提供的一个数据库连接池。

    • 3.Druid:Druid是阿里巴巴提供的数据库连接池。

    • 4.Hikari:Hikari是Spring Boot 2.0之后默认的数据库连接池。


    5.lombok

    定义

    • 一个Java库,用于简化实体类开发。

    优点

    • 解决了实体类实现的繁琐问题。

    实现

    • 1.@Getter:用于生成getter方法。

    • 2.@Setter:用于生成setter方法。

    • 3.@ToString:用于生成toString方法。

    • 4.@EqualsAndHashCode:用于生成equals和hashCode方法。

    • 5.@NoArgsConstructor:用于生成无参构造方法。

    • 6.@AllArgsConstructor:用于生成全参构造方法。

    • 7.@Data:用于生成getter、setter、toString、equals和hashCode方法。

    • 8.@Builder:用于生成建造者模式。

    • 9.@Slf4j:用于生成日志对象。

    • 10.@Log4j2:用于生成日志对象。

6.基于注解的方案实现基础SQL语句

删除

  • 1.根据主键id删除数据。@Delete("DELETE FROM user WHERE id = #{id}")

  • 2.根据条件删除数据。

  • 配置mybatis日志,需要在application.yml中配置。(预编译SQL:性能高,更安全防止sql注入)

  • mybatis提供参数占位符:1.生成预编译sql,参数传递 #{}。2. 拼接sql ${}。

增加

  • 1.插入一条数据并返回主键id需要的注解:@Insert("INSERT INTO user(x,y) VALUES(#{x},#{y})") @Options("useGeneratedKeys=true,keyProperty=id")

修改

  • 1.根据主键id修改数据。@Select()

  • 2.根据条件修改数据。

查询

  • 1.根据id查询数据。

  • 2.根据条件查询数据。

  • 实体类属性值和数据库查询返回的字段名一致,mybatis会自动封装。不一致不能封装,也就查询不到该属性。解决方案一:给字段起别名,让其与实体类属性名一致。解决方案二:使用@Results,@Result注解手动进行映射封装(麻烦不用)。方案三:开启mybatis驼峰命名的自动开关。在application.yml中加入mybatis.configuration.map-underscore-to-camel-case=true(注意:数据库字段名是由下划线连接命名,java属性名由驼峰命名)

  • 在模糊查询中,使用like关键字会遇到字符拼接,需要使用字符串拼接函数concat('%',#{value},'%'),防止SQL注入。(在springboot1.x和单独使用mybatis时,需要在参数名前加上@Param注解并声明方法形参名称,因为早期版本对mapper接口编译时不会保留方法的形参名称,新版本会内置编译插件对接口方法编译时会将方法形参名称保留)


7.基于XML映射文件实现基础SQL语句

规范

  • 1.同包同名:在resources文件下创建一个和Mapper接口所在相同包名的文件夹(com.example.mapper),然后在该文件夹下创建XML映射文件,XML映射文件名和Mapper接口名(例如EmpMapper)一致。

  • 2.XML映射文件中的namespace属性和Mapper接口全类名(全限定名)一致(例如com.itheima.mapper.EmpMapper)。

  • 3.XML映射文件中sql语句的id属性和Mapper接口中的方法名(例如getEmpByCondition)一致,返回类型要与单条数据封装的全类名(例如com.example.pojo.Epm)一致。 使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。选择何种方式来配置映射,以及是否应该要统一映射语句定义的形式,完全取决于你和你的团队。换句话说,永远不要拘泥于一种方式,你可以很轻松地在基于注解和 XML 的语句映射方式间自由移植和切换。


8.动态sql

定义

  • 随着用户的输入或者外部条件的变化而变化的语句叫做动态sql。

实现

  • 1.if标签:用于判断条件是否成立,成立则执行if标签内的sql语句。

  • 2.where标签:1.动态生成where关键字。2.自动去掉第一个and关键字。

  • 3.set标签:1.将所有更新字段进行包裹。2.自动去掉最后一个逗号。

  • 4.foreach标签:用于遍历集合,可以实现批量插入和批量删除。foreach collection="遍历的集合" item="遍历出来的元素" separator="分隔符" open="遍历开始前拼接的片段" close="遍历结束后拼接的片段"

  • 5.sql和include标签:sql标签可以将一些公共的sql语句抽取出来,使用时直接用include标签引用即可。

    <sql id="commonSelect">
            select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time
            from emp
        </sql>
      <include refid="commonSelect"></include>
    


9.分页插件PageHelper

定义

  • 分页插件,用于实现分页功能。

实现

  • 1.引入依赖。

  • 2.在application.yml中配置分页插件。

  • 3.使用PageHelper.startPage(当前页,每页显示的条数)。

  • 4.使用PageInfo(page)获取分页信息。


10.mybatis-plus

定义

  • 基于mybatis的增强工具,简化开发。

实现

未完待续...


评论