Mybatis

一、MyBatis简介(了解)

        1、什么是MyBatis

        MyBatis 本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

        MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

        Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

        总之,Mybatis对JDBC访问数据库的过程进行了封装,简化了JDBC代码,解决JDBC将结果集封装为Java对象的麻烦。

        下图是MyBatis架构图:

        (1)mybatis-config.xml是Mybatis的核心配置文件,通过其中的配置可以生成SqlSessionFactory,也就是SqlSession工厂

        (2)基于SqlSessionFactory可以生成SqlSession对象

        (3)SqlSession是一个既可以发送SQL去执行,并返回结果,类似于JDBC中的Connection对象,也是Mybatis中至关重要的一个对象。

        (4)Executor是SqlSession底层的对象,用于执行SQL语句

        (5)MapperStatement对象也是SqlSession底层的对象,用于接收输入映射(SQL语句中的参数),以及做输出映射(即将SQL查询的结果映射成相应的结果)

        2、为什么要使用MyBatis 

       思考:在开始之前,思考下如何通过JDBC查询Emp表中的所有记录,并封装到一个List集合中返回。(演示:准备数据、导包、导入JDBC程序)

  1、使用传统方式JDBC访问数据库:

        (1)使用JDBC访问数据库有大量重复代码(比如注册驱动、获取连接、获取传输器、释放资源等);

        (2)JDBC自身没有连接池,会频繁的创建连接和关闭连接,效率低;

        (3)SQL是写死在程序中,一旦修改SQL,需要对类重新编译;

        (4)对查询SQL执行后返回的ResultSet对象,需要手动处理,有时会特别麻烦;

...

  2、使用mybatis框架访问数据库:

        (1)Mybatis对JDBC对了封装,可以简化JDBC代码;

        (2)Mybatis自身支持连接池(也可以配置其他的连接池),因此可以提高程序的效率;

        (3)Mybatis是将SQL配置在mapper文件中,修改SQL只是修改配置文件,类不需要重新编译。

        (4)对查询SQL执行后返回的ResultSet对象,Mybatis会帮我们处理,转换成Java对象。

...

        总之,JDBC中所有的问题(代码繁琐、有太多重复代码、需要操作太多对象、释放资源、对结果的处理太麻烦等),在Mybatis框架中几乎都得到了解决!!

二、MyBatis快速入门 

        1、springBoot整合mybatis简单使用

        1 准备数据,创建库和表

-- 1、创建数据库 test 数据库
create database if not exists test charset utf8;
use test ; -- 选择yonghedb数据库

-- 2、删除emp表(如果存在)
drop table if exists emp;

-- 3、在 test 库中创建 emp 表
create table emp(
    id int primary key auto_increment,
    name varchar(50),
    job varchar(50),
    salary double
);

-- 4、往 emp 表中, 插入若干条记录
insert into emp values(null, '张三', '程序员', 3300);
insert into emp values(null, '李四', '程序员', 2800);
insert into emp values(null, '王五', '程序员鼓励师', 2700);
insert into emp values(null, '王二', '部门总监', 4200);
insert into emp values(null, '麻子', '程序员', 3000);
insert into emp values(null, '最帅三太子', '程序员', 3500);
insert into emp values(null, '苍老师', '程序员', 3700);
insert into emp values(null, '波多野结衣', 'CEO', 5000);

        2、创建项目 

        首先创建maven项目,然后引入以下依赖:

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.6.14</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId><!---->
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <version>1.18.22</version>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>

        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.3.0</version>
        </dependency>

        <!-- 整合log4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.4</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
            <version>2.6.14</version>
        </dependency>

    </dependencies>

        然后添加 application.yml  文件:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    #username: root
    transaction-isolation: 2 #具体定义可在Transactional->Isolation属性查看
    #hikari数据库连接池
    hikari:
      pool-name: Retail_HikariCP
      minimum-idle: 1 #最小空闲连接数量
      idle-timeout: 180000 #空闲连接存活最大时间,默认600000(10分钟)
      maximum-pool-size: 10 #连接池最大连接数,默认是10
      auto-commit: true  #此属性控制从池返回的连接的默认自动提交行为,默认值:true
      max-lifetime: 1800000 #此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
      connection-timeout: 30000 #数据库连接超时时间,默认30秒,即30000

server:
  port: 8090

 

       创建项目接结构:model目录也可以写为enity、pojo等
        

 

      然后添加在model中添加实体类:  

@Getter
@Setter
@Accessors(chain = true)
public class Emp {


    //1.声明实体类中的属性
    private Integer id;

    private String name;

    private String job;

    private Double salary;

}

 

         在mapper中创建mapper接口,并使用注解写sql语句:

@Mapper
public interface EmpMapper {

    //查询所有数据
    @Select("select * from emp")
    List<Emp> findAll();

}

         创建service层接口:

@Service
public class EmpService {

    @Autowired
    private EmpMapper empMapper;


    //查询所有信息
    public List<Emp> findAll(){
        return empMapper.findAll();
    }

}

        创建controller层接口:

@RestController
@RequestMapping("/emp")
public class EmpController {

    @Autowired
    private EmpService empService;

    @GetMapping("/findAll")
    public List<Emp> findAll(){
        return empService.findAll();
    }

}

        调用接口接口:

[
    {
        "id": 1,
        "name": "张三",
        "job": "程序员",
        "salary": 3300.0
    },
    {
        "id": 2,
        "name": "李四",
        "job": "程序员",
        "salary": 2800.0
    },
    {
        "id": 3,
        "name": "王五",
        "job": "程序员鼓励师",
        "salary": 2700.0
    },
    {
        "id": 4,
        "name": "王二",
        "job": "部门总监",
        "salary": 4200.0
    },
    {
        "id": 5,
        "name": "麻子",
        "job": "程序员",
        "salary": 3000.0
    },
    {
        "id": 6,
        "name": "最帅三太子",
        "job": "程序员",
        "salary": 3500.0
    },
    {
        "id": 7,
        "name": "苍老师",
        "job": "程序员",
        "salary": 3700.0
    },
    {
        "id": 8,
        "name": "波多野结衣",
        "job": "CEO",
        "salary": 5000.0
    }
]

        2、使用mapper.xml文件来写sql

        首先在resoure目录下建mapper目录,然后建EmpMapper.xml文件:
                      

        EmpMapper.xml文件如下所示:
        需要注意的是:
        1、namespace 中的路径要与 EmpMapper 接口的路径保持一直
        2、id 要与 EmpMapper 接口中的对应的方法名保持一致
        3、resultType 要与返回值的类路径保持一致

<?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值应该保证唯一
            在程序中通过[ namespace + id ]定位到要执行哪一条SQL语句
         -->
<mapper namespace="com.test.demo.mapper.EmpMapper">

    <!-- 通过select、insert、update、delete标签声明要执行的SQL -->
    <!-- 练习1: 查询emp表中的所有员工信息
        resultType指定查询的结果将会封装到什么类型中
        即使最终返回的结果是集合(List<Emp>),resultType也只需要指定集合中的泛型即可!
    -->

    <select id="findAll" resultType="com.test.demo.model.Emp">
        select * from emp
    </select>


</mapper>

        EmpMapper 接口,就可以先将原来的 @Select 注释掉:

@Mapper
public interface EmpMapper {

    //查询所有数据
//    @Select("select * from emp")
    List<Emp> findAll();

}

         在application.yml中还要加上一个 mybatis的配置:如果你 mapper.xml文件的路径跟 mapper接口的路径是一样的,理论上可以不加这个配置。

mybatis:
  mapper-locations: classpath:mapper/*.xml

        然后调用接口:调用成功。

[
    {
        "id": 1,
        "name": "张三",
        "job": "程序员",
        "salary": 3300.0
    },
    {
        "id": 2,
        "name": "李四",
        "job": "程序员",
        "salary": 2800.0
    },
    {
        "id": 3,
        "name": "王五",
        "job": "程序员鼓励师",
        "salary": 2700.0
    },
    {
        "id": 4,
        "name": "王二",
        "job": "部门总监",
        "salary": 4200.0
    },
    {
        "id": 5,
        "name": "麻子",
        "job": "程序员",
        "salary": 3000.0
    },
    {
        "id": 6,
        "name": "最帅三太子",
        "job": "程序员",
        "salary": 3500.0
    },
    {
        "id": 7,
        "name": "苍老师",
        "job": "程序员",
        "salary": 3700.0
    },
    {
        "id": 8,
        "name": "波多野结衣",
        "job": "CEO",
        "salary": 5000.0
    }
]

        如果没有调用成功,报了:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.test.demo.mapper.EmpMapper.findAll

        上面这个异常,如果也 添加了此配置mybatis:mapper-locations: classpath:mapper/*.xml
        一般是上面的哪个类路径或者名称没对应上,详细可参考:
        Invalid bound statement (not found) 五种解决方法_invalid bound statement(not found)-CSDN博客

         

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值