Mybatis(一) 初步了解

1、简介

1.1、什么是Mybatis

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

1.2、 如何获取Mybatis?

  • maven仓库:


    org.mybatis
    mybatis
    3.4.6

  • GitHub:https://github.com/mybatis/mybatis-3/releases
  • 中文文档:mybatis – MyBatis 3 | 入门

1.3、 Mybatis 持久化,持久层

持久化
  • 持久化是将程序数据在持久状态瞬时状态间转换的机制。
  • 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
  • JDBC就是一种持久化机制。文件IO也是一种持久化机制。
为什么需要持久化服务呢?
  • 那是由于内存本身的缺陷引起的。
  • 内存断电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号等,遗憾的是,人们还无法保证内存永不掉电。
  • 内存过于昂贵,与硬盘、光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也高所以需要持久化来缓存到外存。
持久层
持久层 --> 完成持久化工作的代码块 --> DAO层 
## DAO (Data Access Object) 数据访问对象
  • 大多数情况下特别是企业级应用,数据持久化往往也就意味着将内存中的数据保存到磁盘上加以固化,而持久化的实现过程则大多通过各种关系数据库来完成。
  • 之所以要独立出一个“持久层”的概念,而不是“持久模块”,“持久单元”,也就意味着,我们的系统架构中,应该有一个相对独立的逻辑层面,专著于数据持久化逻辑的实现。与系统其他部分相对而言,这个层面应该具有一个较为清晰和严格的逻辑边界。 (实际就是用来操作数据库存在的)
为什么需要Mybatis
  • Mybatis就是帮助将数据存入数据库中,和从数据库中取数据 。
  • 传统的jdbc操作 , 有很多重复代码块 。比如 : 数据取出时的封装 , 数据库的建立连接等等,通过框架可以减少重复代码,提高开发效率。
  • MyBatis 是一个半自动化的ORM框架 (Object Relationship Mapping)-->对象关系映射
Mybatis的优点
  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件就可以了,易于学习,易于使用。
  • 灵活:Mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供xml标签,支持编写动态sql。

2、Mybatis第一个程序

思路流程:搭建环境-->导入Mybatis-->编写代码-->测试

2.1、搭建实验所需数据库
CREATE TABLE `user`(
  `id` INT(20) NOT NULL 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,'张三','123456'),
   (2,'李四','123456'),
   (3,'王五','123456');
2.2、导入Mybatis相关 jar 包
  • Mybatis官方文档找

参考文档的格式分别引入Mybatis、MySQL、Junit

    
    
        
        
        
            org.mybatis
            mybatis
            3.4.6
        
        
        
            mysql
            mysql-connector-java
            8.0.19
        
        
        
            junit
            junit
            4.12
        
    
2.3、编写Mybatis核心配置文件

在src/main/resources目录下新建mybatis-config.xml文件。

参考Mybatis官方文档填写需要的value。




    
        
            
            
                
                
                
                
            
        
    
2.4、编写Mybatis工具类xml

在src/main/java/com/lzw目录下新建目录utlis并在该目录下新建MybatisUtlis,参考官方文档进行编写。

package com.lzw.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.IOException;
import java.io.InputStream;

//sqlSessionFactory --> sqlSession
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            //使用Mybatis第一步获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
    // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
    public static SqlSession getsqlsession(){
        return sqlSessionFactory.openSession();
    }
}
2.5、创建实体类
package com.lzw.pojo;

public class User {
    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getPwd() {
        return pwd;
    }

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

    public void setName(String name) {
        this.name = name;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

2.6、编写Mapper接口类
package com.lzw.dao;
import com.lzw.pojo.User;
import java.util.List;

public interface UserMapper {
    List getUserList();
}
2.7、编写Mapper.xml配置文件(代替代码实现接口类)

参考官方文档改写,在src/main/java/lzw/dao新建UserMapper.xml。

  • namespace 十分重要,不能写错!




    
    

2.8、编写Junit测试类
package com.lzw.dao;

import com.lzw.pojo.User;
import com.lzw.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

import static org.junit.Assert.*;

public class UserMapperTest {

    @Test
    public void getUserList() {
        //第一步获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getsqlsession();
        try {
            //方式一:getMapper
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            List userList = userMapper.getUserList();
            for (User user : userList) {
                System.out.println(user);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //关闭SqlSession
            sqlSession.close();
        }

    }
}
2.9、运行Junit测试类,能够查询到数据则成功!(当然了我遇到了些许问题才成功)
2.10、出现的问题
  • Mapper.xml未在核心配置文件中注册
    解决方法:在核心配置文件mybatis-config中添加以下代码

    
        
    
  • Maven静态资源过滤问题
    问题描述:在src或其子文件夹下写了配置文件却无法被导出到target, 导致程序发生错误无法执行
    解决方法:在目录内部pom.xml的build中配置resources,来防止我们资源导出失败的问题
    
    
        
            
                src/main/resources
                
                    **/*.properties
                    **/*.xml
                
                true
            
            
                src/main/java
                
                    **/*.properties
                    **/*.xml
                
                true
            
        
    
  • UTF-8序列的字节无效
    问题描述:Mybatis执行代码报错: Cause: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字节的 UTF-8 序列的字节 1 无效。
    解决方法:修改Mybatis中所有xml配置文件中的utf-8为utf8

  • Timezone报错
    问题描述:Caused by: java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represen
    解决方法:修改mybatis-config.xml的url,添加serverTimezone=UTC字段

3、总结

Mybatis是JDBC的封装,使用了Mybatis之后就不用再写JDBC的原生代码,大大减少代码工作量。

你可能感兴趣的:(Mybatis(一) 初步了解)