MyBatis能脱离Spring吗

Posted SpringBoot

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis能脱离Spring吗相关的知识,希望对你有一定的参考价值。

一、前言

不得不说Spring给我们带来了很多的便利:IOC解决对象的依赖关系、AOP切面编程、声明式的事务支持、方便集成其它框架等等。

       对于MyBatis,Spring也提供了快速集成方式,真是宝刀在手,天下我有。但今天我们不是要研究Spring怎么集成MyBatis,而是要研究一下MyBatis脱离了Spring还能玩的起来吗?答案是能肯定的,有人就得想:博主你有毒吧,研究这个干吗呢?我相信看完了接下里的几篇文章,你自己会有答案的。

 

二、思路

       对于MyBatis的使用,我们需要知道我们的操作是使用的SqlSession也就是一个数据库连接,而SqlSession是由SqlSessionFactory而构建出来的;对于SqlSessionFactory由一些配置如:数据库连接信息、mappr路径就能够进行创建。

       所以我们要进行编写一个mybatis hello world的话,就可以分解成以下几个步骤:

(1)创建一个maven项目;

(2)添加mybatis的依赖和数据库驱动的依赖,这里mybatis使用的是3.5.1的版本(2019.7.10最新的版本);

(3)添加mybatis的配置,主要是数据库连接信息、实体类的路径、mapper的路径;

(4)编写实体类,通过InputStream载入配置文件,构建SqlSessionFactory;

(5)到这里就可以进行数据库操作测试了。

 

三、编码

3.1 依赖添加

       创建一个maven项目,取名为mybatis,在pom.xml文件添加mybatis和mysql依赖:

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

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
</dependency>

说明:这里mybatis使用3.5.1的版本,是截止到目前最新的版本,mysql驱动使用的是8.0.16,需要注意的是太低的mysql驱动版本会遇到类型无法转换问题。

 

3.2 添加配置文件

       在使用Spring的时候,很多的配置都是Spring帮忙进行管理的,单独使用MyBatis的话,需要有一个mybatis-config.xml,这里主要是配置数据源、实体类包路径、mapper路径:

<?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="jdbc.properties" />

    <!-- 为SQL映射配置文件的parameterType和resultType来设置别名。别名默认为首字母小写。 -->
    <typeAliases>
        <package name="com.kfit.mybatis"/>
    </typeAliases>

    <!-- environment 元素体中包含了事务管理和连接池的配置 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!-- DBCP数据源 -->
            <dataSource type="POOLED"> 
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- mappers 元素包含一组 mapper 映射器(这些 mapper 的 XML 文件包含了 SQL 代码和映射定义信息) -->
    <mappers>
        <mapper resource="mappers/DemoMapper.xml"/>
    </mappers>

</configuration>

说明:

(1)jdbc.properties 是连接数据库的基本信息;

(2)typeAliases指定了entity的包路径;

(3)mappers定义了mapper的路径

 

3.2.1 jdbc.properties配置信息

       在和mybatis-config.xml文件同目录下添加jdbc.properties:

url:jdbc:mysql://127.0.0.1:3306/test
driver:com.mysql.cj.jdbc.Driver
username:root
password:root

 

3.2.2 创建一个实体类Demo

       这里为了演示,创建一个Demo(id,name):

package com.kfit.mybatis.demo.bean;

public class Demo {
    private long id;
    private String name;
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Demo [id=" + id + ", name=" + name + "]";
    }
}

       创建test数据库,并且创建表demo:

DROP TABLE IF EXISTS `demo`;
CREATE TABLE `demo` (
  `id` bigint(11NOT NULL AUTO_INCREMENT,
  `name` varchar(100DEFAULT NULL,
  PRIMARY KEY (`id`)
)

       随意往数据库添加几条数据。

 

3.2.3 创建mapper.xml

       创建一个mapper/DemoMapper.xml(和mybatis-config.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.kfit.mybatis.demo.mapper.DemoMapper">
    <select id="getById" resultType="Demo">
           select *from demo where id = #{id}
    </select>

    <select id="getAll" resultType="Demo">
           select *from demo
    </select>
</mapper>

说明:mapper的两个坐标就是namespace和id,通过这两个坐标就可以定位到这个操作,  namespace和id很重要,namespace和id很重要,namespace和id很重要,重要的事情说三遍。

       另外就是namespace在没有定义Mapper.java的时候,这个命名是可以随意的。

 

3.3 编写测试

       到这里就可以进行测试了,什么怎么没见到Mapper.xml对应的接口呐?MyBatis并不强制需要Mapper.java类哦,通过二维坐标就可以进行查询操作了,就是这么神奇哦:

public class App {
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";

        InputStream inputStream = Resources.getResourceAsStream(resource);

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //使用sqlSession直接查询
        SqlSession sqlSession = sqlSessionFactory.openSession(true); //true 不开启事务,自动提交
        Demo demo = sqlSession.selectOne("com.kfit.mybatis.demo.mapper.DemoMapper.getById",1L);
        System.out.println(demo);

        List<Demo> demos = sqlSession.selectList("com.kfit.mybatis.demo.mapper.DemoMapper.getAll");
        System.out.println(demos);

    }
}

说明:通过InputStream就可以构造SqlSessionFactory,有了SqlSessionFactory就可以打开一个SqlSession了,SqlSession就是一个数据库连接,就可以进行数据库操作了,这里主要通过二维码坐标进行定位sql语句。

       常用的SqlSession的方法:

  selectOne(String statement);
  selectOne(String statement, Object parameter);
  selectList(String statement);
  selectList(String statement, Object parameter);
  selectList(String statement, Object parameter, RowBounds rowBounds);
  selectMap(String statement, String mapKey);
  selectMap(String statement, Object parameter, String mapKey);
selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds);
  select(String statement, Object parameter, ResultHandler handler);
select(String statement, ResultHandler handler);
select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler);
  insert(String statement);
  insert(String statement, Object parameter);
update(String statement);
  update(String statement, Object parameter);
delete(String statement);
  delete(String statement, Object parameter);
getMapper(Class<T> type);

 

3.4 更优雅的使用方式

       上面的使用方式,肯定是不好的,不利于代码的维护,看起来也不清爽,所以就出现了Mapper接口定义的方式,我们也看到了在SqlSession中有一个getMapper的方法。

       好了让我们定义DemoMapper.java:

 package com.kfit.mybatis.demo.mapper;

import java.util.List;
import com.kfit.mybatis.demo.bean.Demo;

public interface DemoMapper {
    public Demo getById(long id);
    public List<Demo> getAll();
}

       测试使用:

public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";

        InputStream inputStream = Resources.getResourceAsStream(resource);

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true); 

        //使用Mapper
        DemoMapper demoMapper = sqlSession.getMapper(DemoMapper.class);
        Demo demo = demoMapper.getById(1);
        System.out.println(demo);
        List<Demo> demos = demoMapper.getAll();
        System.out.println(demos);
    }

       是不是瞬间爽,爽,爽…

 

四、总结

       简单总结下本节的内容吧:

(1)要知道MyBatis在没有Spring的庇护下也是能自己玩耍的哦。

(2)MyBatis单独使用的话,主要mybatis-config.xml配置文件,通过sqlSession可以进行数据库的操作,更优雅的方式就是通过mapper面向接口的方式。

 

疑问?:在mapper接口上是否是可以@Select的方式呐?



我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

à悟空学院:http://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/R3QepWG

Spring Cloud视频:http://t.cn/R3QeRZc

SpringBoot Shiro视频:http://t.cn/R3QDMbh

SpringBoot交流平台:http://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/R1pSojf

SpringSecurity5.0视频:http://t.cn/EwlLjHh

Sharding-JDBC分库分表实战:http://t.cn/E4lpD6e

以上是关于MyBatis能脱离Spring吗的主要内容,如果未能解决你的问题,请参考以下文章

Spring+SpringMVC+MyBatis+Maven框架整合

mybatis oracle 不能返回 null 列

spring mybatis 整合 可以省略mybatis配置文件吗

手写MyBatis,纯手工打造开源框架(第四篇:决胜千里)- 第272篇

阿里四面:你知道Spring AOP创建Proxy的过程吗?

Mybaits 源码解析 ----- Mybatis的事务如何被Spring管理?Mybatis和Spring事务中用的Connection是同一个吗?