Mybatis精讲(一)---环境配置及架构梳理

此文已独家受权给【新华先后端开发】使用。其余平台使用联系做者后再使用java

[TOC]git

简介

在数据库方面咱们最经常使用的应该JDBC、Hibernate和Mybatis。经过JDBC方式链接数据库,咱们会发现工做量是至关的复杂。咱们得处理一些琐碎的关闭。而后入参出参咱们都得本身管理。基于次产生了ORM(Object Relational Mapping)模型。github

ORM模型

  • 简单的说ORM模型就是数据库表和Java对象的映射模型。主要解决了数据库和Java对象的相互映射。咱们能够操做实体对象进而操做数据库表。这样的好处是咱们不须要太了解数据库。减轻了咱们的学习代价。

Hibernate

  • 基于ORM模型很快咱们的第二主角登场了。可是因为Hibernate配置比较复杂,且操做性能上不是很好。虽然大大的弱化了咱们的sql可是由于性能低下很快就被淘汰了。

Ibatis

  • Mybatis的前身严格意义上说应该是Ibatis,后面咱们都称之为Mybatis.为了解决Hibernate的不足,Mybatis产生了相对于Hibernate的全表映射Mybatis能够说是半自动映射的框架。由于他是实体和sql结合的一个框架。
  • Mybatis有SQL , 实体 , 映射规则三个主要对象主成。和Hibernate相比虽然多出了sql的编写,可是正是由于sql的编写使得Mybatis变得很方便。Hibernate由于不用sql,因此他没法调用存储过程这些数据库方法。可是Mybatis不同,Mybatis能够调用sql中的存储过程。

环境搭建

jar

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.0</version>
</dependency>

配置

  • 在上面的图示中咱们能够发现,Mybatis中提供的注解或者是接口的方式来操做数据库的。因此这里咱们准备一个接口。与接口对应的是xml文件。二者组成了Mybatis中的一个组件。
package com.github.zxhtom.mapper;
import com.github.zxhtom.model.Student;
import java.util.List;
public interface StudentMapper {
    /**
     * 获取学生列表
     * @return
     */
    public List<Student> getStudents();
    /**
     * 经过id获取学生信息
     * @param id
     * @return
     */
    public Student getStudentByStuId(String id);
}
  • 与接口对应的是xml,里面记录了真是的sql。这里注意下xml的位置须要和实体在赞成文件夹下且同名
<?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="com.github.zxhtom.mapper.StudentMapper">

    <select id="getStudents" resultType="com.github.zxhtom.model.Student">
        select * from student
    </select>
    <select id="getStudentByStuId" resultType="com.github.zxhtom.model.Student">
        select * from student where id=#{id}
    </select>
</mapper>

xml方式配置

  • 有了上面的接口和xml,下面咱们开始配置咱们的Mybatis环境。
<?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>
    <!--引入外部配置文件-->
    <properties resource="config.properties"></properties>
    <!--定义别名-->
    <typeAliases>
        <package name=""/>
    </typeAliases>

    <!--定义数据库信息,默认使用development数据库构建环境-->
    <environments default="development">
        <environment id="development">
            <!--jdbc事物管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据库链接信息-->
            <dataSource type="POOLED">
                <property name="driver" value="${database.driver}"/>
                <property name="url" value="${database.url}"/>
                <property name="username" value="${database.username}"/>
                <property name="password" value="${database.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/github/zxhtom/mapper/StudentMapper.xml"></mapper>
    </mappers>

</configuration>
  • 而后咱们就能够加载这个xml环境配置,构建咱们的sqlsession.
//获取mybatis-config.xml位置
InputStream inputStream = Resources.getResourceAsStream(Constant.MYBATIS);
//加载mybatis-config,并建立sqlsessionfactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//建立sqlsession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", 1);
//执行select语句,将resultSet映射成对象并返回
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = studentMapper.getStudents();
studentPrint(students);

代码方式配置

  • 官方提供了另一种Java对象的方式来配置环境。这种配置咱们控制的力度更加细腻,可是致使的问题是咱们的一些配置将会硬编码在代码里。咱们这里经过Properties文件将硬编码的东西挪出去。
Map<Object, Object> properties = PropertiesUtil.getProperties("config.properties");
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver(properties.get("database.driver").toString());
dataSource.setUrl(properties.get("database.url").toString());
dataSource.setUsername(properties.get("database.username").toString());
dataSource.setPassword(properties.get("database.password").toString());
//构建数据库事物方式
TransactionFactory transactionFactory = new JdbcTransactionFactory();
//建立数据库运行环境
Environment environment = new Environment("development",transactionFactory,dataSource);
//构建Configure对象
Configuration configuration = new Configuration(environment);
//注册别名
configuration.getTypeAliasRegistry().registerAlias("stu", Student.class);
//加入一个映射器
configuration.addMapper(StudentMapper.class);
//使用sqlsessionfactoryBuilder构建sqlsessionfactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
SqlSession sqlSession = sqlSessionFactory.openSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = studentMapper.getStudents();
studentPrint(students);

两种方式对比

  • 上面我强调了咱们的StudentMapper.xml和StudentMapper.java要同名并且在同一位置上。这是为何呢。由于在Mybatis源码中默认会读取Java对象同目录下的同名的xml文件做为sql配置文件。
  • 可是后期咱们项目的展开Java和xml会愈来愈多,放在一块儿的话很乱。做为一个框架不会这么局限的。在xml配置环境方式中咱们是经过Mappers-->Mapper标签来注入咱们的Mapper.xml的。这里的xml路径并无要求在同一个目录。咱们这里能够随意的改。上面的那些限制是在Java代码搭建环境的方式中。由于在Java代码方式中咱们只是经过java对象注册mapper接口的。在这种方式下默认就会加载同目录下的同名xml

Mybatis结构

  • 学习的过程就是认知的过程。接下来咱们来认识下Mybnatis的核心组件吧。
  • SqlSessionFactoryBuilder : 根据xml(mybatis-config.xml)或者Java代码(代码方式)来生成SqlSessionFactory
  • SqlSessionFactory : 构建SqlSession
  • SqlSession : 既能够发送sql执行并返回结果,也能够获取Mapper接口
  • SQL Mapper : Mybatis独有的组件。有Java接口和xml文件构成的一个总体。负责将xml中的sql进行解析而后传递给数据库并获取结果

源码解读xml环境加载

  • 由于范畴基础课程,这里对源码的跟踪点到为止(再深我也不会)。
  • 在解析mybatis-config.xml标签这一块是重点。这一块会专门介绍各个标签解析及做用。文章留言或点赞让咱们看到大家对这一块的喜好。留言点赞多的会尽快出这一篇。

映射器解读

  • 上面已经说了映射器是有Java+xml组合而成的Mybatis组件。咱们上面的案例也展现了二者的编写。Java实际就是一个接口定义好方法。在xml中对应的标签带上咱们的sql就好了。


  • 圈出来的这条sql中咱们会发现和咱们平时的sql不同。#{id}是Mybatis为咱们提供的入参。在提交给数据库的时候会将真正的sql填充过来。这里还有一个注意点咱们写的是select * 。由于数据库字段和咱们实体属性是同样的。因此Mybatis就会自动把相同字段内容映射给实体了。这就实现了自动映射了。
  • 以前说了和Hibernate相比,Mybatis属于半自动。若是咱们的实体和数据库字段不同了(注意驼峰和平峰在数据库经过设置能够认为是同样的。Mybatis也提供功能能够映射的。这里咱们认为是同样的),咱们能够经过resultMap来实现数据库字段和实体字段的映射。这就是咱们所谓的半自动映射

Ibatis

  • 虽然咱们用Mybatis。可是Ibatis以前的方法仍是保留下来的。这里提一下。可是不推荐使用的方式执行sql

加入战队sql

<span id="addMe">加入战队</span>

微信公众号

微信公众号

相关文章
相关标签/搜索