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(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT 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框架整合
spring mybatis 整合 可以省略mybatis配置文件吗
手写MyBatis,纯手工打造开源框架(第四篇:决胜千里)- 第272篇
阿里四面:你知道Spring AOP创建Proxy的过程吗?
Mybaits 源码解析 ----- Mybatis的事务如何被Spring管理?Mybatis和Spring事务中用的Connection是同一个吗?