mybatis学习

mybatis学习

  • 环境

    • JDK1.8
    • Mysql5.7
    • maven 3.6.1
    • IDEA
  • 回顾:

    • JDBC
    • Mysql
    • Java基础
    • Maven
    • Junit
  • SSM框架:配置文件的。最好的方式:看文档官网;

1.简介

1.1 什么是mybatis

  • MyBatis 是一款优秀的持久层框架

    • 什么叫持久层框架

      • 什么是持久层?
        • 持久是相对于瞬时来说的,*** 持久层,可以理解成数据 保存在 数据库或者 硬盘一类可以保存很长时间的设备里面,不像放在内存中那样断电就消失了,也就是把数据存在持久化设备上*** ,你想一下 内存中的数据 断电就没有了,硬盘的数据 是否会像内存中的数据一样断电消失么?
    • 为什么要使用持久化框架?

      • 企业应用中*** 数据很重要(各种订单数据、客户数据、库存数据之类的),比应用程序本身更重要,** 所以需要把数据持久化。持久化可以通过很多方式,写文件和数据库都可以。只是现在企业一般都会选择把数据持久化到数据库中,因为可以很方便的查询统计分析,但数据库的数据最终还是会写到磁盘上的。Java 程序员为了操作数据库, 最开始是使用JDBC* 来进行的,但是这种方式*** 开发效率低** ,要写一堆重复代码,加上关系数据库和对象本身存在所谓的阻抗不匹配情况,所以 为了提高开发效率,有人发明了 ORM 即 对象关系映射框架* (Hibernate是其中的佼佼者),对于 Java 程序员来说,就可以通过操纵对象来操纵数据库了
  • 它支持自定义 SQL、存储过程以及高级映射。

  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

  • MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis 。

  • 2013年11月迁移到Github

  • iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)

  • 如何获得Mybatis?

1.2、持久层

数据持久化

  • 持久化就是将程序的数据再持久状态和瞬时状态转化的过程
  • 内存:断电即失
  • 数据库(jdbc),io文件持久化。
  • 生活:冷藏,罐头

为什么需要持久化

  • 有一些对象,不能让他丢掉
  • 内存太贵了

1.3、持久层

Dao层,Service层,Controller层...

  • 完成持久化工作的代码块
  • 层界限十分明显。

https://www.bilibili.com/video/BV1NE411Q7Nx

1.4为什么需要Mybatis?

  • 帮助程序员将数据存入到数据库中。
  • 方便
  • 传统的JDBC代码太复杂了。简化。框架。自动化。
  • 不用Mybatis也可以。更容易上手。技术没有高低之分
  • 优点:
    • 简单易学
    • 灵活
    • sql和代码的分离,提高了可维护性
    • 提供隐射标签,支持对象关系组建和维护
    • 提供xml标签,支持编写动态sql

最重要的一点:使用的人多!

Spring SpringMVC SpringBoot

2.第一个MyBatis程序 2021.7.18

  • 思路:搭建环境--->导入MyBatis-->编写代码-->测试!

2.1、搭建环境 2021.7.19

  • 搭建数据库

    CREATE DATABASE `mybatis`;
    USE `mybatis`;
    
    CREATE TABLE `user`(
    		`id` INT(20) PRIMARY KEY,
    		`name` VARCHAR(30) DEFAULT NULL,
    		`pwd` VARCHAR(30) DEFAULT NULL
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    INSERT INTO `user`(`id`,`name`,`pwd`) VALUES 
    (1,‘lxw‘,‘123456‘),
    (2,‘tom‘,‘123456‘),
    (3,‘lee‘,‘123456‘)
    
  1. 新建项目

    新建一个普通的maven项目

    mybatis学习

    mybatis学习

    mybatis学习

  2. 删除src目录,把项目当父工程

mybatis学习

  1. 导入依赖

    <!--导入依赖-->
    <dependencies>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    

2.2、创建一个模块 2021.7.19

  • 编写mybatis核心配置文件:mybatis-config

    <?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核心配置文件-->
    <configuration>
        <!--environments环境,可以多个-->
        <environments default="development">
            <environment id="development">
                <!--transactionManager事务管理-->
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <!--允许安全链接useSSL=true
                        useSSL=false
                        MySQL在高版本需要指明是否进行SSL连接
                        1.true 需要连接
                        2.false 不需要连接
                        在xml配置文件中配置数据库URL时,要使用&的转义字符也就是&amp;
                        让他们使用Unicode编码,useUnicode=true
                    -->
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8"/>
                    <property name="username" value="root"/>
                    <property name="password" value="root"/>
                </dataSource>
            </environment>
        </environments>
    
    </configuration>
    
  • 编写mybatis工具类

    package com.lxw.utils;
    
    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.InputStream;
    
    //SqlSessionFactory-->生产sqlSession
    public class MybatisUtils {
        //定义全局变量,提升作用域
        private static SqlSessionFactory sqlSessionFactory;
    
        static {
            String resource = null;
            try {
                //使用mybatis第一步,使用Mybatis获取sqlSessionFactory对象
                resource = "mybatis-config.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
        //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例了。
        // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL
        public static SqlSession getSqlSession(){
            //优化SqlSession sqlSession = sqlSessionFactory.openSession();
            //return sqlSession
            return sqlSessionFactory.openSession();
        }
    }
    

2.3、编写代码

  • 实体类

    package com.lxw.pojo;
    
    //实体类
    public class User {
        //private 私有的
        private int id;
        private String name;
        private String pwd;
    
        //无参构造 alt+insert Constructor->Constructor
        public User() {
        }
        //有参构造 alt+insert Constructor->全选
        public User(int id, String name, String pwd) {
            this.id = id;
            this.name = name;
            this.pwd = pwd;
        }
    
        //get\set alt+insert 选Getter和Setter然后全选
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPwd() {
            return pwd;
        }
    
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
    
        //toString:异常打印信息alt+insert 选toString 然后全选
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name=‘" + name + ‘\‘‘ +
                    ", pwd=‘" + pwd + ‘\‘‘ +
                    ‘}‘;
        }
    }
    
  • Dao接口

    package com.lxw.dao;
    
    import com.lxw.pojo.User;
    
    import java.util.List;
    
    public interface UserDao {
        //Lsit<>这是泛型
        List<User> getUserList();
    }
    
  • 接口实现类由原来的UserDaoImpl转变为一个Mapper配置文件

    <?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绑定一个对应的Dao/Mapper接口-->
    <mapper namespace="com.lxw.dao.UserDao">
    
        <!--select查询语句
         返回结果
         resultType类型,返回一个,一般都使用type
         resultMap集合,返回多个
         -->
        <select id="getUserList" resultType="com.lxw.pojo.User">
            select * from mybatis.user
        </select>
    </mapper>
    

2.4、测试

  • 新建一个测试:

    • 包的名字要与上面的包一一对应

    mybatis学习

  • 注意点

    • org.apache.ibatis.binding.BindingException: Type interface com.lxw.dao.UserDao is not known to the MapperRegistry.

    • MapperRegistry是什么?

      mybatis学习

    • org.apache.ibatis.exceptions.PersistenceException:

      Error building SqlSession.

      The error may exist in com/lxw/dao/UserMapper.xml

      在target/calsses/com/lxw/dao/里面找不到UserMapper.xml,它不会自动生成

      mybatis学习

      mybatis学习

    • 在pom.xml中添加以下代码可解决问题

      <!--在build中配置resources,来防止我们资源导出失败的问题 -->
      <build>
          <resources>
              <resource>
                  <directory>src/main/resources</directory>
                  <includes>
                      <include>**/*.properties</include>
                      <include>**/*.xml</include>
                  </includes>
                  <filtering>true</filtering>
              </resource>
              <resource>
                  <directory>src/main/java</directory>
                  <includes>
                      <include>**/*.properties</include>
                      <include>**/*.xml</include>
                  </includes>
                  <filtering>true</filtering>
              </resource>
          </resources>
      </build>
      

      mybatis学习

    • 关于Cause: java.sql.SQLException: The server time zone value 的解决办法

    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=UTC"/>
    <!--解决办法:在jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=UTC 加上UTC,让数据库时区和本地时区一样就可以。-->
    //解决方法:https://blog.csdn.net/qq_24880589/article/details/81735535
    

    加上UTC,让数据库时区和本地时区一样就可以。

mybatis学习

  • Loading class com.mysql.jdbc.Driver. This is deprecated警告处理,jdbc更新处
```xml
处理:提示信息表明数据库驱动com.mysql.jdbc.Driver‘已经被弃用了、应当使用新的驱动com.mysql.cj.jdbc.Driver‘
所以,按照提示更改jdbc.properties配置 .com.mysql.jdbc.Driver  改为  com.mysql.cj.jdbc.Driver
原文链接:https://blog.csdn.net/weixin_42323802/article/details/82500458
把src/main/resources/mybatis-config.xml里<property name="driver" value="com.mysql.jdbc.Driver"/>
改成<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
//解决方法:https://blog.csdn.net/weixin_42323802/article/details/82500458
```

![image-20210719215042065](C:\Users\y3060\AppData\Roaming\Typora\typora-user-images\image-20210719215042065.png)
  • Error building SqlSession. ### Cause: org.apache.ibatis.builder.BuilderException(学习MyBatis遇见错误)

    Error building SqlSession. ### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字节的 UTF-8 序列的字节 1 无效。

    • 由于我的项目是Maven构建的,所以在项目依赖配置文件pom.xml上加入构建项目编码属性:

      <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
      

      mybatis学习

  • junit测试

mybatis学习

上一篇:MongoDB学习笔记(索引)


下一篇:题解-HEOI2013 SAO