从来好事天生俭,自古瓜儿苦后甜。这篇文章主要讲述推荐学java——Spring集成MyBatis相关的知识,希望能为你提供帮助。
前情回顾
到本文,我们已经学习了 SSM
框架中的 MyBatis 和 Spring 两大核心内容,本文介绍如何将两者结合起来在项目中使用,这也是实际开发中常用的操作,必须掌握,下面开始撸码~
集成步骤
第一步:创建数据库、数据表数据库各位跟随自己爱好建就行,数据表我这里是 programmer
,字段有这几个:
id
主键,varchar(64)、自动增长、不为nullname
姓名,varchar(125)age
年龄,int
maven
的 java项目,完成如下配置:pom.xml
文件中主要是依赖:<
?xml version="1.0" encoding="UTF-8"?>
<
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.0<
/modelVersion>
<
groupId>
com.javafirst<
/groupId>
<
artifactId>
spring-mybatis<
/artifactId>
<
version>
1.0-SNAPSHOT<
/version>
<
properties>
<
project.build.sourceEncoding>
UTF-8<
/project.build.sourceEncoding>
<
maven.compiler.source>
1.8<
/maven.compiler.source>
<
maven.compiler.target>
1.8<
/maven.compiler.target>
<
/properties>
<
dependencies>
<
dependency>
<
groupId>
junit<
/groupId>
<
artifactId>
junit<
/artifactId>
<
version>
4.11<
/version>
<
/dependency>
<
!-- mysql驱动-->
<
dependency>
<
groupId>
mysql<
/groupId>
<
artifactId>
mysql-connector-java<
/artifactId>
<
version>
8.0.25<
/version>
<
/dependency>
<
!--MyBatis依赖-->
<
dependency>
<
groupId>
org.mybatis<
/groupId>
<
artifactId>
mybatis<
/artifactId>
<
version>
3.5.7<
/version>
<
/dependency>
<
!--Spring依赖-->
<
dependency>
<
groupId>
org.springframework<
/groupId>
<
artifactId>
spring-context<
/artifactId>
<
version>
5.3.14<
/version>
<
/dependency>
<
!--MyBatis集成Spring-->
<
dependency>
<
groupId>
org.mybatis<
/groupId>
<
artifactId>
mybatis-spring<
/artifactId>
<
version>
1.3.3<
/version>
<
/dependency>
<
!-- Spring事务-->
<
dependency>
<
groupId>
org.springframework<
/groupId>
<
artifactId>
spring-tx<
/artifactId>
<
version>
5.3.14<
/version>
<
/dependency>
<
dependency>
<
groupId>
org.springframework<
/groupId>
<
artifactId>
spring-jdbc<
/artifactId>
<
version>
1.2.6<
/version>
<
/dependency>
<
!--阿里数据库连接池 druid-->
<
dependency>
<
groupId>
com.alibaba<
/groupId>
<
artifactId>
druid<
/artifactId>
<
version>
1.2.8<
/version>
<
/dependency>
<
/dependencies>
<
build>
<
resources>
<
resource>
<
directory>
src/main/java<
/directory>
<
includes>
<
include>
**/*.properties<
/include>
<
include>
**/*.xml<
/include>
<
/includes>
<
filtering>
false<
/filtering>
<
/resource>
<
/resources>
<
/build>
<
/project>
以上配置基本是固定的,用到什么依赖就在这里配置即可。
第三步:创建实体类这个和我们之前学习过,就是创建和表中字段对应Java实体类对象,代码如下:
package com.javafirst.daomain;
/**
* desc: 数据表 对应的 实体类
* <
p>
* author: 推荐学java
* <
p>
* weChat: studyingJava
*/
public class Programmer private Integer id;
private String name;
private Integer age;
public Integer getId()
return id;
public void setId(Integer id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public Integer getAge()
return age;
public void setAge(Integer age)
this.age = age;
@Override
public String toString()
return "Programmer信息:" +
"id=" + id +
", name=" + name + \\ +
", age=" + age +
;
第四步:创建dao接口和mapper文件这一步其实还属于
MyBatis
的配置,需要注意的是我这里将接口和对应的 mapper
文件没有放在同一个目录(package)下,这里不同会引起MyBatis 配置文件中给JavaBean对象起别名的配置有区别,看个人习惯,我习惯将class和xml分开。ProgrammerDao.java
代码如下:/**
* desc: MyBatis 对应的 dao 层,操作SQL使用
* <
p>
* author: 推荐学java
* <
p>
* weChat: studyingJava
*/
public interface ProgrammerDao int addProgrammer(Programmer programmer);
List<
Programmer>
selectAllProgrammer();
这个应该不陌生,使我们学习
MyBatis
的时候用到的,这里定义的接口,实际会映射到去执行 Mapper 中的 SQL 语句。ProgrammerMapper.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.javafirst.dao.ProgrammerDao">
<
insert id="addProgrammer">
insert into programmer(`name`,age) values (#name,#age)
<
/insert>
<
select id="selectAllProgrammer" resultType="com.javafirst.daomain.Programmer">
select * from programmer
<
/select>
<
/mapper>
该类在
resource
目录下的 mapper
文件夹下。第五步:完成MyBatis主配置文件这个文件的位置在
resource
目录下,名为 mybatis-config.xml
,其代码如下:<
?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>
<
!--日志-->
<
settings>
<
setting name="logImpl" value="https://www.songbingjia.com/android/STDOUT_LOGGING"/>
<
/settings>
<
typeAliases>
<
typeAlias type="com.javafirst.daomain.Programmer" alias="programmerDao"/>
<
!--要求 dao接口和mapper文件在同一文件夹下-->
<
!--<
package name="com.javafirst.daomain"/>
-->
<
/typeAliases>
<
mappers>
<
mapper resource="mapper/ProgrammerMapper.xml"/>
<
/mappers>
<
/configuration>
第四步中提到的不同之处就在这里的
&
lt;
typeAliases&
gt;
标签里面的内容了,各位看注释或者看往期文章就明白了。接下来的操作就和
Spring
相关了,可能细心的同学已经有疑惑了,我们的数据源去哪了,也就是连接数据库的配置去哪了?能想到这一点,说明我们对学过的内容记忆的很好,其实,MyBatis 和 Spring 结合使用的时候,数据源是交给 Spring容器来处理的,相对我们单独使用 MyBatis 更简单轻松了,快往下看:第六步:创建 Service 接口和实现类定义
ProgrammerService
接口代码如下:public interface ProgrammerService int insertProgrammer(Programmer programmer);
List<
Programmer>
queryProgrammers();
这步操作其实就是我们学习 Spring 的流程,会动态创建 Java 对象,然后通过相关设置方式来赋值。
实现类代码:
/**
* desc:
* author: 推荐学java
* <
p>
* weChat: studyingJava
*/
public class ProgrammerServiceImpl implements ProgrammerService private ProgrammerDao programmerDao;
public void setProgrammerDao(ProgrammerDao programmerDao)
this.programmerDao = programmerDao;
@Override
public int insertProgrammer(Programmer programmer)
return programmerDao.addProgrammer(programmer);
@Override
public List<
Programmer>
queryProgrammers() return programmerDao.selectAllProgrammer();
这里可以理解为代理对象的作用。
第七步:创建 Spring 的配置文件这个应该很熟悉了,名为
applicationContext.xml
在 resource
目录下,不同前面我们使用的是,这里的内容有所变化:<
?xml version="1.0" encoding="UTF-8"?>
<
beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<
!--使用属性文件 配置数据源中数据库链接信息-->
<
context:property-placeholder location="jdbc.properties"/>
<
!-- 声明数据源-->
<
bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<
!--<
property name="driver" value="https://www.songbingjia.com/android/com.mysql.jdbc.Driver"/>
-->
<
property name="url" value="https://www.songbingjia.com/android/$jdbc.url"/>
<
property name="username" value="https://www.songbingjia.com/android/$jdbc.username"/>
<
property name="password" value="https://www.songbingjia.com/android/$jdbc.password"/>
<
/bean>
<
!--声明 SQLSessionFactoryBean-->
<
bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<
property name="dataSource" ref="myDataSource"/>
<
property name="configLocation" value="https://www.songbingjia.com/android/classpath:mybatis-config.xml"/>
<
/bean>
<
!--声明 MapperScannerConfigurer-->
<
bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<
property name="sqlSessionFactoryBeanName" value="https://www.songbingjia.com/android/sqlSessionFactory"/>
<
!--指定包名,包名是dao接口所在的包名
MapperScannerConfigurer 会扫描 basePackage 给定包中的所有接口,把每个接口都执行
一次getMapper()方法,得到每个接口的dao对象
创建好的dao对象放入到spring的容器中dao默认对象的名称:是接口名字的首字母小写
-->
<
property name="basePackage" value="https://www.songbingjia.com/android/com.javafirst.dao"/>
<
!--多个包下有实体,使用,分割-->
<
!--<
property name="basePackage" value="https://www.songbingjia.com/android/com.javafirst.dao,com.javafirst.dao2"/>
-->
<
/bean>
<
!--注册自定义Service-->
<
bean id="programmerService" class="com.javafirst.service.impl.ProgrammerServiceImpl">
<
property name="programmerDao" ref="programmerDao"/>
<
/bean>
<
/beans>
这里其实主要有四小步工作,且这四步基本都是固定模式,我们在理解的基础上把流程记下来就行,后面用就知道为什么这么写了。
jdbc.properties
文件内容如下:jdbc.url=jdbc:mysql://localhost:3306/spring_demo
jdbc.username=root
jdbc.password=root
下面说这四小步都代表什么意思:
声明数据源
:其实就是和数据库建立链接,这个过程交给了 Spring容器来管理声明 SQLSessionFactoryBean
:这个工作的意思就是读取MyBatis
主配置文件,讲声明的javaBean
对象映射到SqlSessionFactoryBean
管理器中。声明 MapperScannerConfigurer
:会扫描给定包下的接口对象,将所有接口执行一次getMapper()
后得到接口的 dao 对象,将这些对象交给 Spring容器管理。注册自定义Service
:这是我们自定义的东西,也就是我们自己的业务层。
@Test
public void test_addProgrammer()
String config = "applicationContext.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(config);
ProgrammerDao programmerDao = (ProgrammerDao) context.getBean("programmerDao");
Programmer programmer = new Programmer();
programmer.setName("王重阳");
programmer.setAge(102);
programmerDao.addProgrammer(programmer);
这一步测试不需要我们前面配置中的自定义Service 即可进行。需要注意的是Spring中添加记录,已经不需要我们手动
commit()
了。第二种测试,就是我们 Spring 和 MyBatis 集成后的测试,代码如下:
@Test
public void test_addProgrammer_spring()
String config = "applicationContext.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(config);
ProgrammerService programmerService = (ProgrammerService) context.getBean("programmerService");
Programmer programmer = new Programmer();
programmer.setName("周伯通");
programmer.setAge(112);
int row = programmerService.insertProgrammer(programmer);
System.out.println("插入结果:" + row);
结果大家自行验证,看下数据表中这里插入的值:
文章图片
我们还定义了一个查询功能,测试代码如下:
/**
* Spring方式 查询记录
*/
@Test
public void test_selectProgrammers_spring()
String config = "applicationContext.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(config);
ProgrammerService programmerService = (ProgrammerService) context.getBean("programmerService");
List<
Programmer>
programmers = programmerService.queryProgrammers();
System.out.println("查询结果:" + programmers);
结果各位自己验证哈,一般前面流程跑通,到这里不会有问题。
最后,再看下我的项目结构:
文章图片
总结
【推荐学java——Spring集成MyBatis】本文将前面学习的 MyBatis 和 Spring 结合起来使用,掌握其流程和原理很重要,其实思考一下,结合起来反倒简单多了,可能第一次接触的时候,被各种流程性的东西搞的有点懵,但这并不妨碍我们后面的顺利上手。
推荐阅读
- oeasy教您玩转vim - 88 - # 自动命令autocmd
- Kubernetes官方java客户端之八(fluent style)
- netty系列之:channel和channelGroup
- Spring源码之四prepareBeanFactory()方法
- 微服务架构 | *3.5 Nacos 服务注册与发现的源码分析 #yyds干货盘点#
- 手把手教你 Springboot 开发环境搭建和项目启动
- web技术分享| 白板SDK之函数和方程式的运用
- 设计模式11-- 搞定组合模式
- 处理XP系统【16位ms dos子系统】弹出提示的办法