myBatis

一. MyBatis 简介

(一) 什么是MyBatis?

  • MvBatis是一款优秀的持久层框架,用于简化JDBC开发。
  • 官网: https://mybatis.org/mybatis-3/zh/index.html

(二) 持久层

  • 持久层负责将数据到保存到数据库的那一层代码
  • JavaEE 三层架构:表现层(前端代码)、业务层(后端业务代码)、持久层

(三) 框架

  • 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
  • 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展

(四) JDBC 缺点

myBatis_第1张图片


(五)MyBatis 简化

myBatis_第2张图片
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作



二. MyBatis 快速入门

  • 步骤 查询 user 表中所有数据
    1. 创建 user 表,添加数据
CREATE DATABASE mybatis;  -- 创建一个数据库,名为mybatis
USE mybatis;  -- 使用 mybaits

DROP TABLE if EXISTS tb_user;  -- 若 tb_user 表存在,删除该表

-- 创建 tb_user 表
CREATE TABLE tb_user {
	id int PRIMARY KEY auto_increment,
	username VARCHAR(20),
	password VARCHAR(20),
	gender CHAR(1),
	addr VARCHAR(30)
);

-- 添加数据
INSERT INTO tb_user VALUES(1, '张三', '123', '男', '北京');
INSERT INTO tb_user VALUES(2, '李四', '234', '女', '天津');
INSERT INTO tb_user VALUES(3, '王五', '11', '男', '西安');
    1. 创建模块,导入坐标
      1 )创建新项目
      2 )添加依赖
      在 pom.xml 配置文件中添加依赖
 <dependencies>
    <dependency>

      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>3.8.1version>
      <scope>testscope>
    dependency>


    <dependency>
      <groupId>org.mybatisgroupId>
      <artifactId>mybatisartifactId>
      <version>3.5.0version>
    dependency>


    <dependency>
      <groupId>mysqlgroupId>
      <artifactId>mysql-connector-javaartifactId>
      <version>8.0.30version>
    dependency>


    <dependency>
      <groupId>org.slf4jgroupId>
      <artifactId>jcl-over-slf4jartifactId>
      <version>1.5.6version>
    dependency>


    <dependency>
      <groupId>ch.qos.logbackgroupId>
      <artifactId>logback-classicartifactId>
      <version>1.2.3version>
    dependency>


    <dependency>
      <groupId>ch.qos.logbackgroupId>
      <artifactId>logback-coreartifactId>
      <version>1.2.3version>
    dependency>
  dependencies>
    1. 编写MyBatis核心配置文件 – > 替换连接信息,解决硬编码问题
      1 )新建 mybatis-config.xml核心配置文件
      myBatis_第3张图片
      2 )编写mybatis-config.xml核心配置文件,替换连接信息

DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">

                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            dataSource>
        environment>
    environments>
    <mappers>

        <mapper resource="UserMapper.xml"/>
    mappers>
configuration>
    1. 编写SQL映射文件 – > 统一管理sq|语句,解决硬编码问题
      1 )新建UserMapper.xml映射文件
      myBatis_第4张图片
      2 )编写UserMapper.xml映射文件

DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="test">
    <select id="selectAll" resultType="com.itheima.pojo.User">
        select * from tb_user;
    select>
mapper>

映射文件取名讲究 表名Mapper.xml

    1. 编码
      1 )定义POJO类
      2 )加载核心配置文件,获取SqlSessionFactory对象
      3 )获取SqlSession对象,执行SQL语句
      4 )释放资源
      myBatis_第5张图片

定义user类

package com.itheima.pojo;
// alt + 鼠标左键 整列编辑
public class User {
    private int id;
    private String username;
    private String password;
    private String gender;
    private String addr;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", gender='" + gender + '\'' +
                ", addr='" + addr + '\'' +
                '}';
    }
}

编写核心测试类 MyBatisDemo.java

package com.itheima;

import com.itheima.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisDemo {
    public static void main(String[] args) throws IOException {
        // 1. 加载mybatis 的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";	 // MyBatis核心配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);


        // 2. 获取SqlSession 对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 3. 执行sql
        List<User> users = sqlSession.selectList("test.selectAll");   // 用空间名称和sql 语句的 id ,对sql语句进行辨别

        System.out.println(users);
        /* 
	        [User{id=1, username='张三', password='123', gender='男', addr='北京'}, 
	        User{id=2, username='李四', password='234', gender='女', addr='天津'}, 
        	User{id=3, username='王五', password='11', gender='男', addr='西安'}]
		*/
		
        // 4. 释放资源
        sqlSession.close();
    }
}



三. MyBatis 代理开发

目的:

  • 解决原生方式中的硬编码
  • 简化后期执行SQL

原来的:
在这里插入图片描述
代理开发:
myBatis_第6张图片

  • 步骤 使用 Mapper 代理方式完成入门案例
    1. 定义与 SQL 映射文件同名的 Mapper 接口,并且将 Mapper 接口和 SQL 映射文件放置在同一个目录下
      myBatis_第7张图片

记得改mybatis 核心配置文件中的sql映射文件的路径
myBatis_第8张图片

    1. 设置 SQL 映射文件的 namespace 属性为 Mapper 接口全限定名
      myBatis_第9张图片
    1. 在 Mapper 接口中定义方法,方法名就是 SQL 映射文件中 sql 语句的 id,并保持参数类型和返回值类型一致
      myBatis_第10张图片
    1. 编码
      1 )通过 SqlSessiion 的 getMapper 方法获取 Mapper 接口的代理对象
      2 )调用对应方法完成 sql 的执行
      myBatis_第11张图片

细节:如果 Mapper 接口名称和 SQL 映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化 SQL 映射文件的加载
myBatis_第12张图片



四. MyBatis 核心配置文件

  • 配置各个标签时,需要遵守前后顺序

DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    
    <typeAliases>
        <package name="com.itheima.pojo"/>
    typeAliases>
    
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">

                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            dataSource>
        environment>
    environments>
    <mappers>


        <package name="com.itheima.mapper"/>

    mappers>
configuration>

自定义别名
1)myBatis 核心配置文件中设置别名
myBatis_第13张图片
2)***Mapper.xml 文件中使用别名
myBatis_第14张图片



五. 配置文件完成增删改查

myBatis_第15张图片

MyBatisX 插件
在这里插入图片描述

MyBatisX是一款基于IDEA的快速开发插件,为效率而生。
主要功能:

  • XML 和 接口方法 相互跳转
  • 根据接口方法生成 statement
    myBatis_第16张图片

1. 查询

1) 查询所有数据

myBatis_第17张图片
myBatis_第18张图片

(一) 实体类属性和数据库列名不一致

实体类属性和数据库表列名不一致,不能自动封装数据
myBatis_第19张图片
1)起别名:在sql语句中,对不一样的列名起别名,别名和实体类属性名一样
myBatis_第20张图片
2)resultMap:定义完成不一致的属性名和列名的映射
myBatis_第21张图片

2) 查询详情

myBatis_第22张图片
myBatis_第23张图片

(二) 参数占位符

参数占位符

  1. #{}:会将其替换为?,为了防止SQL注入
    myBatis_第24张图片
  2. ${}:拼sql,会存在SQL注入问题
    myBatis_第25张图片
  3. 使用时机:
  • 参数传递的时候:#{}
  • 表名或列名不固定的情况下:${},会存在SQL注入问题

(三) 参数类型

参数类型:
在这里插入图片描述
parameterType 可以省略

(四) 特殊字符处理

特殊字符处理:

  1. 转义字符
    myBatis_第26张图片
  2. CDATA

    myBatis_第27张图片

3) 条件查询

(1) 查询-多条件查询

myBatis_第28张图片 myBatis_第29张图片

  • SQL语句设置多个参数的三种方式:

  • 1)散装参数需要使用 @Param("SQL参数占位符名称")
    myBatis_第30张图片

  • 2)对象参数:只需要保证SQL中的参数名和实体类属性名对应上,即可设置成功
    myBatis_第31张图片

  • 3)map集合参数:只需要保证SQL中的参数名和map集合的键的名称对应上,即可设置成功
    myBatis_第32张图片


    <select id="selectByCondition0" resultMap="brandResultMap">
        select *
        from tb_brand
        where status = #{status}
        and company_name like #{companyName}
        and brand_name like #{brandName};
    select>

(2) 查询-多条件-动态条件查询

  • SQL语句会随着用户的输入或外部条件的变化而变化,我们称之为动态SQL*
    myBatis_第33张图片
(五) 动态SQL查询

myBatis_第34张图片

  • if:用于判断参数是否有值,使用test属性进行判断
    • 存在问题:第一个条件不需要逻辑运算符
    • 解决方案:
      1)使用恒等式让所有条件各式都一样
      myBatis_第35张图片
      2)标签替换where关键字
      myBatis_第36张图片

    <select id="selectByCondition1" resultMap="brandResultMap">
        select *
        from tb_brand
        <where>
            <if test="status != null">
                and status = #{status}
            if>
            <if test="companyName != null and companyName != ''">
                and company_name like #{companyName}
            if>
            <if test="brandName != null and brandName != ''">
                and brand_name like #{brandName}
            if>
        where>
    select>

(3) 查询-单条件-动态条件查询

  • 从多个条件中选择一个
  • choose(when, otherwise):选择,类似于Java中的switch
    myBatis_第37张图片
    myBatis_第38张图片

    <select id="selectByCondition2" resultMap="brandResultMap">
        select *
        from tb_brand
        <where>
            <choose> 
                <when test="status != null"> 
                    status = #{status}
                when>
                <when test="companyName != null and companyName != ''">
                    company_name like #{companyName}
                when>
                <when test="brandName != null and brandName != ''">
                    brand_name like #{brandName}
                when>
            choose>
        where>
    select>

2. 添加

1)添加

myBatis_第39张图片

  • 实现
    myBatis_第40张图片
 
    <insert id="add">
        insert into tb_brand (brand_name, company_name, ordered, description, status)
        values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
    insert>

2)添加-主键返回

myBatis_第41张图片

  • 实现
    返回添加数据的主键

    myBatis_第42张图片
 
    <insert id="add" useGeneratedKeys="true" keyProperty="id">
        insert into tb_brand (brand_name, company_name, ordered, description, status)
        values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
    insert>

3. 修改

1) 修改全部字段

myBatis_第43张图片


<update id="update">
        update tb_brand
        set brand_name = #{brandName},
            company_name = #{companyName},
            ordered = #{ordered},
            description = #{description},
            status = #{status}
        where id = #{id};
    update>

2) 修改动态字段

myBatis_第44张图片


<update id="update">
        update tb_brand
        <set>
            <if test="brandName != null and brandName != ''">
                brand_name = #{brandName},
            if>
            <if test="companyName != null and companyName != ''">
                company_name = #{companyName},
            if>
            <if test="ordered != null">
                ordered = #{ordered},
            if>
            <if test="description != null and description != ''">
                description = #{description},
            if>
            <if test="status != null">
                status = #{status}
            if>
        set>
        where id = #{id};
    update>

4. 删除

1) 删除一个

myBatis_第45张图片

2) 批量删除

myBatis_第46张图片

  • mybatis 会将数组参数,封装为一个Map集合。
    • 默认:array = 数组
      myBatis_第47张图片
    • 使用 @Param 注解改变 map 集合的默认key 的名称
      myBatis_第48张图片

myBatis_第49张图片



六. 注解完成增删改查

  • 使用注解开发会比配置文件开发更加方便
    myBatis_第50张图片

使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的SQL语句更加混乱不堪。因此,如果你需要做一些很复杂的操作,最好
用XML来映射语句。
选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和XML的语句映射方式间自
由移植和切换。

你可能感兴趣的:(java,数据库,mybatis,java,数据库)