MyBatis框架以及MyBatis的环境搭建

MyBatis

什么是MyBatis

mybatis原来不叫mybatis , ibatis1、2;

mybatis3。被托管在github上。

github地址:https://github.com/mybatis/mybatis-3

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

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

持久态和瞬时态

持久化就是数据在瞬时状态和持久状态之间转化的一个过程。

内存:断电即失。 我们现在无法用技术层面来保存,内存不会断电;

将内存中的数据持久化的存储;磁盘,硬盘,等等;

持久层对应我们代码架构的哪一层:—Dao层

dao层,专注于处理数据库的操作,但是我们写一大堆JDBC的重复代码。

我们应该专注sql语句编写,获得sql的返回值即可。

持久层为什么不叫持久化模块。

我们的系统中,应该有一个单独的层面来处理这个数据库连接问题;

解耦,这个层面就应该有较为清晰的逻辑边界;

为什么需要这个框架

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情:

  1. 封装JDBC操作
  2. 利用反射打通Java类与SQL语句之间的相互转换

MyBatis的主要设计目的就是让我们对执行SQL语句时对输入输出的数据管理更加方便,所以方便地写出SQL和方便地获取SQL的执行结果才是MyBatis的核心竞争力。

hibernate 全自动的ORM框架,不用编写sql语句; 黑箱操作

mybatis 半自动的ORM框架 , 我们可以自定义sql语句;更加灵活; 白箱操作,所有sql语句都由我们开发人员来编写,能够定制化完成许多功能

要求开发人员要掌握SQL语句的编写;

SSM :Spring 、SpingMVC、MyBatis.

MyBatis的优点

  • 不用再去编写一堆JDBC代码
  • 简单易学,不依赖第三方的程序或者框架。官网文档强大,开源,我们可以随时分析源码’;
  • 实现解耦,低耦合,高内聚
  • ORM;对象关系映射
  • 提供XML标签;

MyBatis的主要成员

  • Configuration MyBatis所有的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类中
  • SqlSession 作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能
  • Executor MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
  • StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数等
  • ParameterHandler 负责对用户传递的参数转换成JDBC Statement 所对应的数据类型
  • ResultSetHandler 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
  • TypeHandler 负责java数据类型和jdbc数据类型(也可以说是数据表列类型)之间的映射和转换
  • MappedStatement MappedStatement维护一条节点的封装
  • SqlSource 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
  • BoundSql 表示动态生成的SQL语句以及相应的参数信息

以上主要成员在一次数据库操作中基本都会涉及,在SQL操作中重点需要关注的是SQL参数什么时候被设置和结果集怎么转换为JavaBean对象的,这两个过程正好对应StatementHandler和ResultSetHandler类中的处理逻辑。

第一个Mybatis程序

搭建实验环境

CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `mybatis`;

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` INT(20) NOT NULL,
  `name` VARCHAR(30) DEFAULT NULL,
  `pwd` VARCHAR(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT  INTO `user`(`id`,`name`,`pwd`) VALUES (1,'狂神','123456'),(2,'张三','abcdef'),(3,'李四','987654');

创建一个普通的Maven项目

pom.xml


<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    groupId>com.kuanggroupId>
    <artifactId>ssm-mybatis-studyartifactId>
    <version>1.0-SNAPSHOTversion>
 <dependencies>
        
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.11version>
        dependency>
        
        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatisartifactId>
            <version>3.5.1version>
        dependency>
        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>5.1.47version>
        dependency>
    dependencies>
    <build>
        
        <resources>
            <resource>
                <directory>src/main/javadirectory>
                <includes>
                    <include>**/*.propertiesinclude>
                    <include>**/*.xmlinclude>
                includes>
                <filtering>falsefiltering>
            resource>
            <resource>
                <directory>src/main/resourcesdirectory>
                <includes>
                    <include>**/*.propertiesinclude>
                    <include>**/*.xmlinclude>
                includes>
                <filtering>falsefiltering>
            resource>
        resources>
    build>
project>

编写代码

先创建pojo实体类

package com.kuang.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 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;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

编写mybatis配置文件



<configuration>
    
    <environments default="development">
        
        <environment id="development">
            
            <transactionManager type="JDBC"/>
            
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&charsetEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            dataSource>
        environment>
    environments>
configuration>

创建工具类

目的:获得SqlSessionFactory;

package com.kuang.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
//mybatis的工具类,重复的代码的提纯
public class MyBatisUtils {
    //类变量不需要设置默认值;
    private static SqlSessionFactory sqlSessionFactory;
    static {
        //在maven中,所有的资源文件一般都放在resources目录下,我们可以直接拿到。
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //设置SqlSessionFactory公共的方法
    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }
}

.映射文件的接口,对应原来的dao接口

package com.kuang.dao;
import com.kuang.pojo.User;
import java.util.List;
public interface UserMapper {
    //获取全部的用户
    List<User> selectUser();
}

编写对应的mapper映射文件




<mapper namespace="com.kuang.dao.UserMapper">
    
    <select id="selectUser" resultType="com.kuang.pojo.User">
        select * from user
    select>
mapper>

在mybatis配置文件中绑定编写映射文件



<configuration>
    
    <environments default="development">
        
        <environment id="development">
            
            <transactionManager type="JDBC"/>
            
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&charsetEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            dataSource>
        environment>
    environments>

    
    <mappers>
        <mapper resource="com/kuang/dao/userMapper.xml"/>
    mappers>
configuration>

测试一下

在maven的test文件夹下编写对应的测试类

package com.kunag.dao;
import com.kuang.dao.UserMapper;
import com.kuang.pojo.User;
import com.kuang.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import java.util.List;
public class UserMapperTest {
    @Test
    public void selectUser(){
        //1.拿到sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
        //2.通过sqlSessionFactory对象openSession()创建一个sqlSession。
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.通过sqlSession获得mapper对象 , 参数为映射文件对应的接口类的class对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //4.通过mapper对象来执行操作;
        List<User> users = mapper.selectUser();
        //获得结果集
        for (User user : users) {
            System.out.println(user);
        }
    }
}

结果展示

MyBatis框架以及MyBatis的环境搭建_第1张图片
项目结构MyBatis框架以及MyBatis的环境搭建_第2张图片

你可能感兴趣的:(MyBatis)