自学内容网 自学内容网

MyBatis

引入

什么是MyBatis?

  • MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。
  • MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
  • 官网:MyBatis中文网

MyBatis入门

快速入门

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

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

    • 创建SpringBoot工程时需要勾选依赖(MyBatis FrameworkMySQL Driver

    • src-main-resources-xxxx.properties文件中配置数据库连接信息

      # 驱动类名称
      spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
      # 数据库连接的url(db01表示所连数据库名)
      spring.datasource.url=jdbc:mysql://localhost:3306/db01
      #连接数据库的用户名
      spring.datasource.username=root
      # 连接数据库的密码
      spring.datasource.password=123456
      
    • 配置mapper接口

    @Mapper
    public interface UserMapper{
        @Select("select * from user")
        public List<User>list();
    }
    
  3. 编写SQL语句(注解/XML)

    • 默认在mybatis中编写SQL语句是不识别的。可以做如下配置:

      (选中)@Select部分——(右键选择)显示上下文操作——(选择)注入语言或引用——(选择)MySQL

    • 初次操作可能会报错,需要在Idea中配置MySQL数据库连接

JDBC介绍

  • JDBC:(Java DataBase Connectivity),就是使用Java语言操作关系型数据库的一套API

  • mysql依赖

    <deoendency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </deoendency>
    
  • 本质

    • sun公司官方定义的一套操作所有关系型数据库的规范,即接口。
    • 各个数据库厂商去实现这套接口,提供数据库驱动jar包。
    • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

数据库连接池

  • 介绍

    • 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
    • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
    • 释放空闲实践超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库遗漏
  • 优势

    • 资源重用
    • 提升系统响应速度
    • 避免数据库连接遗漏
  • 标准接口:DataSource

    • 官方(SUN)提供的数据库连接池接口,由第三方组织实现此接口。
    • 功能:获取连接,Connection getConnection() throws SQLException;
  • 常见产品

    • C3P0

      • C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展
    • DBCP

      • Apache 旗下 Commons 项目下的一个子项目,提供连接池功能
    • Druid(德鲁伊)

      • Druid连接池是阿里巴巴开源的数据库连接池项目

      • 功能强大,性能优秀,是Java语言最好的数据库连接池

      • 更换数据库连接池为Druid

        # 只需要在项目的pom.xml中加上dependency就可以了
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>
        
    • Hikari(springboot默认)

lombok

  • Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率

    注解作用
    @Getter/@Setter为所有的属性提供get/set方法
    @ToString会给类自动生成易阅读的toString方法
    @EqualsAndHashCode根据类拥有的非静态字段自动重写equals和hahcode方法
    @Data提供了更为综合的生成代码功能(@Getter+@Setter+@ToString+@EqualsAndHashCode)
    @NoArgsConstructor为实体类生成无参的构造器方法
    @AllArgsConstructor为实体类生成除了static修饰的字段之外带有各参数的构造器方法
  • 使用需要引入依赖

    <dependency>
        <groupId>org.projectlombok/groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    
  • 注意事项

    • Lombok会再编译时,自动生成对应的java代码。我们使用lombok时,还需要安装一个lombok的插件(idea自带)。

MyBatis基础操作

  • 准备

    • 准备数据库表emp
    • 创建以恶搞心的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok)
    • application.properties中引入数据库连接信息
    • 创建对应的实体类Emp(实体类属性采用驼峰命名)
    • 准备Mapper接口EmpMapper
  • 删除

    // 接口方法
    @Delete("delete from emp where id = #{id}")
    public void delete(Integer id);
    

    注意事项:如果mapper接口方法形参只有一个普通类型的参数,#{…}里面的属性名可以随便写,如:#{id}、#{value}。

  • 插入

    // 接口方法
    // 主键返回
    // 会自动将生成的主键值,赋值给emp对象的id属性
    @Options(keyProperty="id",useGeneratedKeys=true) 
    @Insert("insert into emp(username,name,gender,image,job,entrydate,dept_id,create_time,update_time) values(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
    public void insert(Emp emp);
    
  • 更新

    // 接口方法
    @Update("update emp set username=#{username},name=#{name},gender=#{gender},image=#{image},job=#{job},entrydate=#{entrydate},dept_id=#{deptId},update_time=#{updateTime}where id=#{id}")
    public void update(Emp emp);
    
  • 查询

    • 按照ID查询

      @Select("select * from emp where id=#{id}")
      public Emp getById(Integer id);
      
    • 数据封装

      • 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。

      • 如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。

        解决方法

        • 给字段起别名,让别名誉实体类属性名一致

        • 通过@Results@Result注解手动映射封装

          //举例
          @Results({
              @Result(column = "dept_id", property = "deptId").
              @Result(column = "create_time", property = "createTime")
          })
          @Select("select * from emp where id=#{id}")
          public Emp getById(Integer id);  
          
        • 开启mybatis的驼峰命名自动映射开关

          # 在application.properties文件中加入(例dept_id自动转换为deptID)
          mybatis.configuration.map-underscore-to-camel-case=true
          
      • 条件查询

        /*
        需求:
        1. 名字中带有 张
        2. 性别 男
        3. 出生日期 在一个区间
        */
        @Select("select * from emp where name like concat('%',#{name},'%') and gender=#{gender} and entrydate between #{begin} and #{end} order by update_time desc")
        public List<Emp> list(Strin name,Short genden, LocalDate begin, LocalDate end);
        
  • XML映射

    • XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件喝Mapper接口防止再相同包下(同包同名)。

    • 在resources目录中只能创建目录,创建目录不用.分隔需要用/分隔

    • XML映射文件的namespace属性为Mapper接口全限定名一致。

    • XML映射文件中sql语句的id与Mapper接口中方法名一致,并保持返回类型一致。

    • Mapper接口

      @Mapper
      public interface EmpMapper{
          public List<Emp>list(String name, Short gender, LocalDate begin, LocalDate end);
      }
      
    • XML映射文件

      <?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">
      <!--约束可以直接从官网复制-->
      <mapper namespace="com.itheima.mapper.EmpMapper">
      <select id="list" resultType="com.itheima.pojo.Emp">
          select * from emp where name like concat('%',#{name},'%') and gender=#{gender} and entrydate between #{begin} and #{end} order by update_time desc
          </select>
      </mapper>
      
    • 区别

      • **官方解释:**使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java注解不仅力不从心,还会让你本旧复杂的SQL语句更加混乱不堪。因此,如果你需要做一些很复杂的操作,最好用XML来映射语句。
      • 使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句
  • 注意事项

    • 可以在application.properties中,打开mybatis的日志,并指定输出道控制台

      # 指定mybatis输出日志的位置,输出控制台
      mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
      
    • 参数占位符

      • #{…}
        • 执行SQL时,会将#{…}替换为?,生成预编译SQL,会自动设置参数数值。
        • 使用时机:参数传递,都使用#{…}
      • ${…}
        • 拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题。
        • 使用时机:如果对表名、列表进行动态设置时使用。

MyBatis动态SQL

  • 介绍

    • 随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL
    • 用于判断条件是否成立。使用test属性进行条件判断,如果条件为tru,则拼接SQL。
    • where元素智慧在子元素由内容的情况下猜插入where子句,而且会自动去除子句的开头的AND或OR。

      <select id="list" resultType="com.itheima.pojo.Emp">
      select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp
          <where>
          <if test="name != null">
              name like concat('%',#{name}.'%')
               </if>
              <if test="gender != null">
              and gender = #{gender}
              </if>
              <if test="begin != null and end !=null">
              and entrydate between #{begin} and #{end}
              </if> 
          </where>
      </select>
      
    • 动态的在行首插入SET关键字,并会删掉额外的逗号。(用在update语句中)
    • SQL语句

      delete from emp where id in (1,2,3);
      
    • 接口方法

      // 批量删除
      public  void deleteByIds(List<Interger> ids);
      
    • XMl映射文件

      <delete id="deleteByIds">
      delete from emp where id in
          <foreach collection="ids" item="id" separator="," open="(" close=")">
          #{id}
          </foreach>
      </delete>
      
      <!--
          collection:集合名称
          item:集合遍历出来的元素/项
          speparator:每一次便利使用的分隔符
          open:遍历开始前拼接的片段
          close:遍历结束后拼接的片段
      -->
      
  • <mapper>
    <sql id="use">
        ....
        </sql>
        
        <select>
            <include refid="use" />
        </select>
    </mapper>·
    <!--将需要多次复用的语句放入sql中,然后可以用include引入-->
    

原文地址:https://blog.csdn.net/weixin_45887097/article/details/142417517

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!