Mybatis

Mybatis

1.1 Mybatis介绍

1.1.1 需求分析

 //利用jdbc,完成新增的功能
    private static void method2() throws Exception{
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取数据库的连接
        //数据传输协议   数据库的ip 端口号 数据库名
        String url = "jdbc:mysql://localhost:3306/cgb2107";
        Connection c = DriverManager.getConnection(url,"root","root");
        //3,获取传输器
        Statement s = c.createStatement();
        //4,利用传输器执行  增删改的SQL
        //executeUpdate()用来执行增删改的SQL,只返回影响行数
        int rows = s.executeUpdate(
                "INSERT INTO emp(ename,job) VALUES('rose','副总')");
        //5,释放资源
        //r.close();//结果集
        s.close();//传输器
        c.close();//连接
    }

说明: 传统的JDBC代码需要繁琐的API. 开发效率低. 代码重复冗余.

1.1.2 Mybatis介绍

官网地址: https://mybatis.org/mybatis-3/zh/index.html

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github。

1.1.3 Mybatis特点

简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。
sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
提供映射标签,支持对象与数据库的orm字段关系映射
提供对象关系映射标签,支持对象关系组建维护
提供xml标签,支持编写动态sql。 [2]

1.2 Mybatis 环境搭建

1.2.1 准备数据库

说明: 利用sqlYog工具导入数据库
请添加图片描述
2. 导入效果请添加图片描述

1.2.2 创建项目mybatis_demo1

请添加图片描述

1.2.3 导入jar包文件

 <!--mybatis依赖包-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <!--jdbc依赖包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--添加lombok的包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

1.2.4 数据映射

持久层:
1.数据表: 用户的数据信息, 持久化到本地磁盘中
2.POJO: 程序通过对象封装数据信息.

映射关系: 一个POJO对象要求映射一张数据表
1.对象名称 映射数据表表名.
2. 对象的属性 映射数据表中的字段。

数据表结构:
请添加图片描述
编辑POJO对象

package com.jt.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;

@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
}

1.2.5 编辑mybatis-config.xml配置文件

说明: 在resource的目录中添加 该文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://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://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&amp;useUnicode=true&amp;characterEncoding=utf8&amp;autoReconnect=true&amp;allowMultiQueries=true"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!--Mybatis加载Mapper映射文件-->
    <mappers>
        <mapper resource="mybatis/mappers/UserMapper.xml"/>
    </mappers>
</configuration>

1.2.6 编辑UserMapper.xml映射文件

说明: 由于mybatis需要操作数据库.编辑Sql语句. 采用xml映射文件维护Sql语句.
关系:
1.一个接口对应一个xml映射文件
2.一个接口方法对应一个映射文件的Sql.

<?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">

<!--namespace是mybaits映射文件的唯一标识,与接口对应-->
<mapper namespace="com.jt.mapper.UserMapper">
    <!--id 表示接口方法
        resultType 返回值结果类型
    -->
    <select id="findAll" resultType="com.jt.pojo.User">
        select * from demo_user
    </select>
</mapper>

1.2.7 mybatis加载mapper映射文件

 <!--Mybatis加载Mapper映射文件-->
    <mappers>
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>

请添加图片描述

1.3 Mybatis入门

package com.jt;

import com.jt.mapper.UserMapper;
import com.jt.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 org.junit.jupiter.api.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class TestMybatis {
    /**
     * 规则说明:
     *      1.创建SqlSessionFactory 工厂模式
     *      2.获取SqlSession 理解:数据库链接+传输器对象
     *      3.获取Mapper接口对象
     *      4.完成业务调用
     *      5.关闭链接
     */
    @Test
    public void demo1() throws IOException {
        //1.1 指定配置文件的根目录
        String resource = "mybatis-config.xml";
        //1.2 通过IO流 加载配置文件 org.apache.ibatis.io;包路径
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //1.3 实例化工厂对象
        SqlSessionFactory sqlSessionFactory =
                        new SqlSessionFactoryBuilder().build(inputStream);
        //2 获取SqlSession 通过sqlSession可以直接操作数据库
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3 获取接口对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //4.调用接口方法
        List<User> userList = userMapper.findAll();
        System.out.println(userList);
        //5.暂时手动关闭链接
        sqlSession.close();
    }
}

1.4 Mybatis常见报错解析

1.4.1 jar包添加异常

说明: 在dependencies 根标签中添加jar包

  <!--mybatis依赖包-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <!--jdbc依赖包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--添加lombok的包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

请添加图片描述

1.4.2 配置文件名称异常

请添加图片描述

1.4.3 数据源配置异常

数据版本要求: Mysql5.5以上版本 mariaDB 10以上的版本
驱动异常:
请添加图片描述

1.4.4 映射文件加载异常

请添加图片描述
请添加图片描述

1.4.5 接口与映射文件不匹配报错

请添加图片描述
请添加图片描述

2.SpringBoot简化Mybatis

2.1 项目整合

2.1.1 创建项目请添加图片描述

2.1.2 导入jar包

说明: 在pom.xml文件中 添加jar包文件

<!--mybatis依赖包-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <!--jdbc依赖包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--添加lombok的包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

2.1.3 删除多余的文件

说明: 将多余的文件删除,保留图中的文件即可
请添加图片描述
2. 修改配置文件名称请添加图片描述

2.1.4 关于主启动类异常的说明

提示: “开箱即用” 原则
报错信息:
请添加图片描述
报错原理说明:
请添加图片描述
由于Mybatis依赖了JDBC的jar包. 但是该jar包文件是启动项. 当主启动类运行时,开始加载主启动项. 但是JDBC需要链接数据库.所以必须有相关的配置信息.但是此时YML文件中没有数据源的配置.所以报错.

2.1.5 修改YML配置文件

#1.配置端口号  注意缩进!!!!!
server:
  port: 8090

#2.配置数据源
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    password: root

mybatis:
  type-aliases-package: com.jt.pojo
  #将所有的映射文件全部加载
  mapper-locations: classpath:/mappers/*.xml
  #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true

2.1.6 将Mapper接口交给容器管理

package com.jt.mapper;

import com.jt.pojo.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;
@Mapper  //将接口交给Spring容器管理 Map<userMapper,JDK代理对象>
public interface UserMapper {

    //指定接口方法 查询demo_user的全部数据
    List<User> findAll();

}

2.1.7 编辑测试类

package com.jt;

import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
public class TestMybatis {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testDemo1(){
        List<User> userList = userMapper.findAll();
        System.out.println(userList);
    }
}

请添加图片描述

3. Mybatis 基本用法

3.1 根据ID查询数据

3.1.1 编辑测试方法

 @Test
    public void testFindUserById(){
        int id = 1;
        User user = userMapper.findUserById(id);
        System.out.println(user);
    }

3.1.2 编辑Mapper接口

@Mapper //将接口交给Spring容器管理 Map<userMapper,JDK代理对象>
public interface UserMapper {

    //指定接口方法 查询demo_user的全部数据
    List<User> findAll();
    //根据ID查询数据库
    User findUserById(int id);
}

3.1.3 编辑UserMapper.xml映射文件

<!-- 根据ID查询数据库
         动态取值: #{key}
     -->
    <select id="findUserById" resultType="com.jt.pojo.User">
        select * from demo_user where id = #{id}
    </select>

3.2 Sql语句打印

说明: 在YML文件中 添加日志操作

#1.配置端口号  注意缩进!!!!!
server:
  port: 8090

#2.配置数据源
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    #yml文件 0不解析 如果字母以0开头则引号包裹
    #password: "0123456"
    password: root

#3.配置Mybatis
mybatis:
  type-aliases-package: com.jt.pojo
  #将所有的映射文件全部加载
  mapper-locations: classpath:/mappers/*.xml
  #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true

#4.打印Sql com.jt.mapper下的Sql日志
logging:
  level:
    com.jt.mapper: debug

请添加图片描述

3.3 根据name和age查询

3.3.1 编辑测试类

 /**
     * 知识点:
     *      1.如果是多个参数传递,则一般采用对象的方式封装.
     */
    @Test
    public void testFindByNA(){
        String name = "孙尚香";
        int age = 18;
        User user = new User();
        user.setName(name).setAge(age);
        List<User> userList = userMapper.findUserByNA(user);
        System.out.println(userList);
    }

3.3.2 编辑UserMapper

@Mapper //将接口交给Spring容器管理 Map<userMapper,JDK代理对象>
public interface UserMapper {

    //指定接口方法 查询demo_user的全部数据
    List<User> findAll();
    //根据ID查询数据库
    User findUserById(int id);

    List<User> findUserByNA(User user);
}

3.3.3 编辑UserMapper.xml映射文件

 <!-- 根据name和age查询数据
         知识点: 别名包
                在配置文件中指定包路径: 可以自动的实现包路径的拼接
         resultType规则:
               1. 首先根据别名包匹配.设定..
               2. 如果匹配不成功,则按照路径匹配.
         参数传递的规则:
                1. 如果是单个参数,则使用#{key}  获取的参数的值
                2. 如果是对象参数,则使用#{属性} 获取的是属性值
      -->
    <select id="findUserByNA" resultType="User">
        select * from demo_user where
        name = #{name} and age = #{age}
    </select>

3.4 查询age>18 age <100 的用户

3.4.1 Sql语句

	select * from demo_user where age>18 and age <100

3.4.2 编辑测试类

 /**
     * 知识点3:
     *      说明: 如果多个参数不方便使用 User对象封装时,应该使用万能的集合Map
     */
    @Test
    public void testFindByAge(){
        int minAge = 18;
        int maxAge = 100;
        Map<String,Integer> map = new HashMap<>();
        map.put("minAge",minAge);
        map.put("maxAge",maxAge);
        List<User> userList = userMapper.findUserByAge(map);
        System.out.println(userList);
    }

3.4.3 编辑Mapper接口

@Mapper //将接口交给Spring容器管理 Map<userMapper,JDK代理对象>
public interface UserMapper {

    //指定接口方法 查询demo_user的全部数据
    List<User> findAll();
    //根据ID查询数据库
    User findUserById(int id);

    List<User> findUserByNA(User user);
    //习惯: 参数只有一个
    List<User> findUserByAge(Map<String, Integer> map);
}

3.4.4 编辑xml 映射文件

<!--
        根据年龄查询数据
        语法:  如果传递的参数是Map, 则使用#{key}
        xml转译字符:
                    1. >  &gt;
                    2. <  &lt;
                    3. & &amp;
     -->
    <select id="findUserByAge" resultType="User">
        select * from demo_user where age > #{minAge}
                                and   age  &lt; #{maxAge}
    </select>

3.4.5 转义标签

 <!--
        根据年龄查询数据
        语法:  如果传递的参数是Map, 则使用#{key}
        xml转译字符:
                    1. >  &gt;
                    2. <  &lt;
                    3. & &amp;
                    4. 万能转译字符
                       <![CDATA[ 转移内容  ]]>
     -->
    <select id="findUserByAge" resultType="User">
        <![CDATA[
             select * from demo_user
                where age  > #{minAge} and   age  < #{maxAge}
           ]]>
    </select>

3.5 利用注解@Param实现数据封装

3.5.1 编辑测试类

 /**
     * 知识点4:
     *      利用注解实现数据的封装
     */
    @Test
    public void testFindByAge2(){
        int minAge = 18;
        int maxAge = 100;
        List<User> userList = userMapper.findUserByAge2(minAge,maxAge);
        System.out.println(userList);
    }

3.5.2 编辑接口文件

    //原则:Mybatis只支持单值传参 将多值封装为单值
    //注解:@Param("key") int minAge(值)
    // 作用:将数据封装为Map
    List<User> findUserByAge2(@Param("minAge") int minAge, @Param("maxAge") int maxAge);

3.5.3 编辑xml映射文件

 <select id="findUserByAge2" resultType="User">
        <![CDATA[
             select * from demo_user
                where age  > #{minAge} and   age  < #{maxAge}
           ]]>
    </select>

3.6 模糊查询

3.6.1 业务需求

查询name字段中包含"君"的用户.
Sql语句:

	SELECT * FROM demo_user WHERE NAME LIKE "%君%"

3.6.2 编辑测试方法

 /**
     * 知识点5:
     *      利用注解实现数据的封装
     */
    @Test
    public void testFindUserByLike(){
        String name = "%" + "君" + "%";
        List<User> userList = userMapper.findUserByLike(name);
        System.out.println(userList);
    }

3.6.3 编辑接口方法

List<User> findUserByLike(String name);

3.6.4 编辑xml映射文件

<!--模糊查询  特别注意表名的大小写问题!!!!!
        windows系统中: 不区分大小写
        Linux系统中:   区分大小写问题.
    -->
    <select id="findUserByLike" resultType="User">
        SELECT * FROM demo_user WHERE NAME LIKE #{name}
    </select>
	
	方式2: xml配置文件动态拼接%
	 <!--模糊查询  特别注意表名的大小写问题!!!!!
        windows系统中: 不区分大小写
        Linux系统中:   区分大小写问题.
        语法:  "%"     这样的方式
    -->
    <select id="findUserByLike" resultType="User">
        SELECT * FROM demo_user WHERE NAME LIKE "%"#{name}"%"
    </select>

3.7 Sql标签用法

3.7.1 业务需求

说明: Sql语句中经常出现重复的数据.如果每次重复的内容都自己手写.则开发的效率低.
优化: 将公共的Sql进行抽取
优势: Sql标签可以节省代码
缺点: 可读性变差了, 如果是关联操作 则根据情况而定.

3.7.2 Sql标签用法

 <!--模糊查询  特别注意表名的大小写问题!!!!!
        windows系统中: 不区分大小写
        Linux系统中:   区分大小写问题.
        语法:  "%"     这样的方式
    -->
    <select id="findUserByLike" resultType="User">
        SELECT <include refid="tableColumn"/> FROM demo_user WHERE NAME LIKE "%"#{name}"%"
    </select>

    <!--Sql标签: 抽取公共的Sql语句 -->
    <sql id="tableColumn">
        id,name,age,sex
    </sql>

3.8 Mybatis中的集合参数写法

3.8.1 业务需求

查询id=1,2,3,5,7的数据

	select * from demo_user  where id in (1,2,3,5,7........)

3.8.2 编辑测试类

//前端: URL?id=1,2,3,4,5 获取之后一般采用数组接收
    @Test
    public void testFindListByIn(){
        int[] array = {1,2,3,5,7};
        List<User> userList = userMapper.findListByIn(array);
        System.out.println(userList);
    }

3.8.3 编辑Mapper接口

	List<User> findListByIn(int[] array);

3.8.4 编辑Mapper 映射文件

	 <!--
        关于Mybatis的遍历的写法
        foreach:
            1. collection 需要遍历的集合
                   1.1 数组      关键字: array/list
                   1.2 list集合  关键字: list/array
                   1.3 Map<key,array/list>  关键字:key
            2. open/close  循环体的开始和结束 可以写到循环之外简化标签
            3. item  当前遍历数据的变量名
            4. separator 分割符
    -->
    <select id="findListByIn" resultType="User">
        select * from demo_user  where id in (
            <foreach collection="array" item="id" separator=",">
                #{id}
            </foreach>
        )
    </select>

3.9 用户新增

3.9.1 编辑测试方法

@Test
    public void testInsertUser(){
        User user = new User();
        user.setName("张三").setAge(18).setSex("男");
        userMapper.saveUser(user);
        System.out.println("新增成功!!!!");
    }

3.9.2 编辑接口方法

 void saveUser(User user);

3.9.3 编辑xml映射文件

 <insert id="saveUser">
        insert into demo_user(id,name,age,sex)
                value (null, #{name},#{age},#{sex})
    </insert>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值