Mybatis

介绍

Mybatis入门

  1. 准备工作(创建springboot工程、数据库表、实体类)

  2. 引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)

    • 相关依赖就是MyBatis Framework和MySQL Driver。如果是springboot工程可以在创建项目时直接勾选即可
    • 基础配置,在resource文件夹下的application文件进行配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #驱动类名称
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    #数据库连接url
    spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
    #连接数据库的用户名
    spring.datasource.username=root
    #连接数据库的密码
    spring.datasource.password=123456
    #开启mybatis的日志,指定输出到控制台
    mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
    #开启mybatis的驼峰命名自动映射开关
    mybatis.configuration.map-underscore-to-camel-case=true
  3. 编写SQL语句(注解/XML)

    • @Mapper注解,会自动生成该接口的实现类对象(代理对象),并且将该对象交给IOC容器管理

数据库连接池

  • 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
  • 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏
  • 优势
    • 资源重用
    • 提升系统响应速度
    • 避免数据库连接遗漏
  • 标准接口:DataSource,是官方(sun)提供的数据库连接池接口,由第三方组织实现此接口。
  • 常见数据库连接池产品(都是实现了DataSource接口的)

预编译

  • 参数占位符#{}

    • 执行SQL时,会将#{…}替换为?,生成预编译SQL,会自动设置参数值。使用时机:参数传递,都使用#{…}
  • 参数占位符${}

    • 拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题。使用时机:如果对表名、列表进行动态设置时使用。
  • 预编译的好处:性能更高,更安全(防止SQL注入)

  • SQL注入:SQL注入是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。

  • 主键返回:@Options(keyProperty=”id”,useGeneratedKeys=true)

    • 会自动将生成的主键值,赋值给emp对象的id属性
  • 数据封装

    • 起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样。
    • 手动结果映射:通过@Results及@Result进行手动结果映射。
    • 开启驼峰命名:如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射。

sql语句的定义

方法一:注解映射定义

  • 直接在Mapper接口类中添加注解

方法二:xml映射定义

  • 创建一个xml文件进行配置

  • xml映射文件规范

    • XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。
    • XML映射文件的namespace属性为Mapper接口的全类名。
    • XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。

    如:

    1
    2
    3
    4
    5
    6
    <mapper namespace="com.itheima.mapper.EmpMapper">
    <select id="listEmp" resultType="com.itheima.pojo.Emp">
    select * from emp where name like concat('%',#{name},'%') and gender=#{gender} and
    entrydate between #{start} and #{end} order by update_time desc
    </select>
    </mapper>
    • resultType:单条记录所封装类型的全类名
  • xml配置文件约束(官网和网上都可以找到)

    1
    2
    3
    4
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

动态SQL

随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL。

  • <if test=”条件”></if>:用于判断条件是否成立。使用test=”条件”属性进行条件判断,如果条件为true,则拼接SQL
  • <where><where>:where元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND或OR。
  • <set></set>:动态地在行首插入SET关键字,并会删掉额外的逗号。(用在update语句中)
    • <foreach collection=”要遍历的集合” item=”遍历出来的元素” separator=”分隔符” open=”遍历开始前拼接的sql片段” close=”遍历结束后拼接的sql片段”></foreach>
  • <sql id=”xxx”></sql>:定义可重用的SQL片段。
  • <include refid=”xxx”><>:通过属性refid,指定包含的sql片段。