Spring整合Mybatis之注解方式

我有一篇博客详细写了我自己使用xml的方法Spring整合MyBatis,现在我就把核心配置文件中的每个bean的配置使用注解的方式实现

注解整合MyBatis分析

注解整合MyBatis分析

⚫ 业务类使用注解形式声明bean,属性采用注解注入
⚫ 建立独立的配置管理类,分类管理外部资源,根据功能进行分类,并提供对应的方法获取bean
⚫ 使用注解形式启动bean扫描,加载所有注解配置的资源(bean)
⚫ 使用AnnotationConfigApplicationContext对象加载所有的启动配置类,内部使用导入方式进行关联

注解整合MyBatis步骤

  1. 修改mybatis外部配置文件格式为注解格式
  2. 业务类使用@Component声明bean,使用@Autowired注入对象
  3. 建立配置文件JDBCConfig与MyBatisConfig类,并将其导入到核心配置类SpringConfig
  4. 开启注解扫描
  5. 使用AnnotationConfigApplicationContext对象加载配置项

项目目录结构

项目准备

数据库mysql

/*
SQLyog Ultimate v12.14 (64 bit)
MySQL - 5.6.45 : Database - test
*********************************************************************
*//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE=''*/;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`test` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `test`;/*Table structure for table `account` */DROP TABLE IF EXISTS `account`;CREATE TABLE `account` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`money` double DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;/*Data for the table `account` */insert  into `account`(`id`,`name`,`money`) values (1,'小付',800),(2,'小花',1200),(3,'小张',324),(4,'小红花',1434),(5,'笑小',1314),(6,'你铪',6575),(8,'花花',333);/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

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.fs</groupId><artifactId>day02_spring_annotation_MyBatis</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.9.RELEASE</version></dependency><!--        jdbc--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.9.RELEASE</version></dependency><!--        test--><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.1.9.RELEASE</version></dependency><!--        spring整合mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.1</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><!--        mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!--druid连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.20</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies></project>

代码演示(代码中有详细解释)

SpringConfig

package com.fs.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
//表示这个类是一个spring的配置类,并将其存入到ioc容器中
@Configuration
/*开启扫描注解的那些包
<!--    启动spring扫描注解的包,只扫描spring的注解--><context:component-scan base-package="com.fs"/>*/
@ComponentScan("com.fs")
//引入其他的配置类
@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {}

JdbcConfig

jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.93.132:3306/test
jdbc.username=root
jdbc.password=root

我们将下面的配置转变成spring的配置类,通过注解实现

<!--    引入properties--><context:property-placeholder location="classpath:jdbc.properties"/>
<!--    整合druid,把DruidDataSource交给spring管理--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean>

创建一个JdbcConfig

package com.fs.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
/*
<!--    引入properties--><context:property-placeholder location="classpath:jdbc.properties"/>*/
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {//@Value("${Key}")@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;/*<!--    整合druid,把DruidDataSource交给spring管理--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean>*///将返回的DruidDataSource交给ioc管理@Beanpublic DruidDataSource getDruidDataSource(){//创建DruidDataSourceDruidDataSource druidDataSource = new DruidDataSource();//给属性赋值,这个是上面从配置文件中依耐注入给属性的druidDataSource.setDriverClassName(driver);druidDataSource.setUrl(url);druidDataSource.setUsername(username);druidDataSource.setPassword(password);//返回DruidDataSource,然后交给ioc管理return druidDataSource;}
}

MybatisConfig

将下面的配置文件中的配置转变成java配置类,通过注解实现

    <!--    整合MyBatis--><!--    配置MyBatis的会话工厂类  mybatis.spring 下的SqlSessionFactoryBean配置的sqlSessionFactory得到SqlSession,然后MyBatis从spring中拿到SqlSession.getMapper()去动态代理dao--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--        给MyBatis配置链接池,依耐注入--><property name="dataSource" ref="dataSource"/>
<!--        配置别名扫描的包,被扫描的包下的类起的别名就是类名首字母小写,用于mapper.xml文件中使用--><property name="typeAliasesPackage" value="com.fs.pojo"/></bean>
<!--配置MyBatis扫描dao的包,让MyBatis动态代理生成这个dao的实现类,并交给ioc管理mybatis-spring这个包下MapperScannerConfigurer提供了spring于MyBatis的整合--><bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--        告诉MyBatis我dao在哪里.然后MyBatis将这个dao实现,然后给spring管理--><property name="basePackage" value="com.fs.dao"/></bean>

创建一个MybatisConfig

package com.fs.config;import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class MybatisConfig {/*<!--    配置MyBatis的会话工厂类  mybatis.spring 下的SqlSessionFactoryBean配置的sqlSessionFactory得到SqlSession,然后MyBatis从spring中拿到SqlSession.getMapper()去动态代理dao--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--        给MyBatis配置链接池,依耐注入--><property name="dataSource" ref="dataSource"/>
<!--        配置别名扫描的包,被扫描的包下的类起的别名就是类名首字母小写,用于mapper.xml文件中使用--><property name="typeAliasesPackage" value="com.fs.pojo"/></bean>*/@Beanpublic SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource){//创建sql会话工厂类                                //这里@Autowired也是从ioc拿DataSourceSqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();//从ioc容器中取出jdbcConfig中配置的druidDatasourcesqlSessionFactoryBean.setDataSource(dataSource);//配置起别名sqlSessionFactoryBean.setTypeAliasesPackage("com.fs.pojo");return sqlSessionFactoryBean;}/*<!--配置MyBatis扫描dao的包,让MyBatis动态代理生成这个dao的实现类,并交给ioc管理mybatis-spring这个包下MapperScannerConfigurer提供了spring于MyBatis的整合--><bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--        告诉MyBatis我dao在哪里.然后MyBatis将这个dao实现,然后给spring管理--><property name="basePackage" value="com.fs.dao"/></bean>*///创建MyBatis动态代理扫描类@Beanpublic MapperScannerConfigurer getMapperScannerConfigurer(){//创建映扫描配置类MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();//设置动态代理扫描的dao的包mapperScannerConfigurer.setBasePackage("com.fs.dao");//交给spring管理return mapperScannerConfigurer;}
}

Dao Service接口

AccountDao

package com.fs.dao;import com.fs.pojo.Account;
import org.apache.ibatis.annotations.*;import java.util.List;public interface AccountDao {@Select("select * from account")List<Account> findAll();//查询所有
}

AccountService

package com.fs.service;import com.fs.pojo.Account;import java.util.List;public interface AccountService {List<Account> findAll();
}

AccountServiceImpl

将下面的配置文件中的配置信息,通过注解的方法交给spring管理

    <!--  把业务类 AccountServiceImpl 交给ioc管理 --><bean id="accountServiceImpl" class="com.fs.service.impl.AccountServiceImpl">
<!--       依耐注入dao,这个dao被MyBatis动态代理实现后被spring存放在ioc容器中--><property name="accountDao" ref="accountDao"/></bean>
AccountServiceImpl
package com.fs.service.impl;import com.fs.dao.AccountDao;
import com.fs.pojo.Account;
import com.fs.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
/*<!--  把业务类 AccountServiceImpl 交给ioc管理 --><bean id="accountServiceImpl" class="com.fs.service.impl.AccountServiceImpl">
<!--       依耐注入dao,这个dao被MyBatis动态代理实现后被spring存放在ioc容器中--><property name="accountDao" ref="accountDao"/></bean>*/
@Service
public class AccountServiceImpl implements AccountService {//从ioc获取MyBatis动态代理的accountDao实现类@Autowiredprivate AccountDao accountDao;//提供DI依耐注入的set方法
//    public void setAccountDao(AccountDao accountDao) {//        this.accountDao = accountDao;
//    }@Overridepublic List<Account> findAll() {return accountDao.findAll();}
}

测试整合代码(注解整合Junit)

注意:
◆ 从Spring5.0以后,要求Junit的版本必须是4.12及以上
◆ Junit仅用于单元测试,不能将Junit的测试类配置成spring的bean,否则该配置将会被打包进入工
程中

测试代码

package com.fs.service;import com.fs.config.SpringConfig;
import com.fs.pojo.Account;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.List;
//设定spring专用的类加载器
@RunWith(SpringJUnit4ClassRunner.class)
//设定加载的spring的配置类或者文件
@ContextConfiguration(classes = SpringConfig.class)
public class AccountServiceTest {//从spring容器中获取AccountService的实现类@Autowiredprivate AccountService accountService;@Testpublic void findAll() {//根据配置文件获取到ioc容器//ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);//从ioc容器中拿到业务层类//AccountService bean = applicationContext.getBean(AccountService.class);//调用查询方法List<Account> all = accountService.findAll();//输出一下System.out.println(all);}
}

测试结果

说明整合成功:

Spring整合Mybatis之注解方式,(注解整合Junit)相关推荐

  1. Spring Boot + Mybatis 配合 AOP 和注解实现动态数据源切换配置

    Spring Boot + Mybatis 配合 AOP 和注解实现动态数据源切换配置 前言: 1. 数据库准备: 2. 环境准备: 3.代码部分 4. 测试: 5.等等 6.配合注解实现 7 .测试 ...

  2. mysql+xml+注释,springboot整合mybatis完整示例, mapper注解方式和xml配置文件方式实现(我们要优雅地编程)...

    一.注解方式 pom org.mybatis.spring.boot mybatis-spring-boot-starter 2.0.0 mysql mysql-connector-java org. ...

  3. SSM整合之纯注解方式,注解实现事务,异常,与拦截器

    SSM整合之纯注解方式Spring,SpringMVC,Mybatis 使用纯注解的方式,整合ssm, sql语句与数据表 在上一篇SSM整合之XML方式中有, 创建maven项目(代码中注释为详细解 ...

  4. springboot update数据_SpringBoot整合Mybatis+Druid+数据库(注解版)

    运行展示 正题 Spring boot :2.1.5RELEASE :数据库(Mysql.Oracle):Mybatis:阿里云的连接池 : Druid : 步骤 1.POM依赖 <!-- My ...

  5. SpringBoot_数据访问-整合MyBatis(二)-注解版MyBatis

    前面已经创建数据表和JAVABEAN,如何用mybatis来对数据进行增删改查,我们先说mybatis注解版的使用,我来写上一个mapper,操作我们这个数据库,我们放在mapper包下,我们操作de ...

  6. Spring+Struts2+Mybatis在Intellij下的整合

    环境:jdk 1.8,      tomcat 8.0.38; 开发工具:Intellj; 具体步骤: 1. 创建一个maven下的web项目 2. 配置相应的jar文件,具体的配置方式为: < ...

  7. (Spring+SpringMVC+MyBatis)SSM三大框架整合教程

    目录 一.基本概念 1.Spring 2.SpringMVC 3.MyBatis 二.开发环境搭建 三.Maven Web项目创建 四.SSM整合 1.Maven引入需要的JAR包 2.Spring与 ...

  8. Spring IoC和DI XML方式 注解方式 依赖注入 AOP面向切面

    初识Spring框架 时代变迁 原始时代我们用一个jsp搞定一切,但如此开发大型项目时我们遇到了问题,前端美化的代码和后端的代码交织,代码中又有html.js.css样式,又有业务逻辑和数据库访问代码 ...

  9. SpringBoot 注解方式快速整合Mybatis

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:yizhiwazi www.jianshu.com/p/82 ...

最新文章

  1. 专家点评Nat Micro | 朱永群组首次发现特异地切割线性泛素链的全新去泛素化酶...
  2. CentOS 7下安装jdk1.8
  3. 源码分享,送你一份Google Python class源码
  4. 【渝粤教育】 国家开放大学2020年春季 1171科学与技术 参考试题
  5. python画矩阵图_Python根据已知邻接矩阵绘制无向图操作示例
  6. 【 如何将.vue文件中的所有css代码放入一个.css文件中】
  7. reviewboard安装实战
  8. ubuntu14.04设置sublime text3为默认文本编辑器
  9. iview 按需引入解决加载慢的问题
  10. pycharm怎么做html网页_html下拉菜单怎么做
  11. 备机大地院系项目dataguard archived_log及standby_log
  12. (java)五大常用算法
  13. Red Hat 9.0下载及安装
  14. 向 webview 添加 userScript
  15. 解决Android调试不显示 “允许USB调试” 认证窗口
  16. httpwatch初级使用
  17. 心田花开写人作文指导,小学优秀写人作文推荐
  18. Android开发之使用createFromStream加载图片发现图片变小
  19. 数论——佩尔方程变量分解
  20. C语言趣味程序设计编程百例精解

热门文章

  1. Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'的解决
  2. 每天,每周,每月,每年程序员该做的事情
  3. 让ie6(opera)支持微软雅黑字体
  4. 初学SSH 配置+错误总结
  5. 如何运用Reflection转化DynamicObject和Generic集合为DataTable
  6. javascript 学习之 数组式的对象
  7. android PreferenceActivity详解
  8. 【转载】Centos7修改root密码
  9. 【题解】Luogu P2783 有机化学之神偶尔会做作弊
  10. openstack--1--基础环境搭建