mybatis与spring整合详解
- 1. 引言
- 2. 传统JDBC代码的弊端
- 3. 配置数据源
- 3.1. 使用spring自带的数据源
- 3.2. 使用DBCP数据源
- 3.3. 使用c3p0数据源
- 3.4. 使用JNDI数据库连接池
- 4. MyBatis-Spring项目配置
- 4.1. 配置Spring-MyBatis项目的步骤(5步)
- 4.2. 配置SqlSessionFactoryBean
- 4.3. mapper的配置
- 4.3.1. 配置MapperFactoryBean
- 4.3.2. 配置MapperScannerConfigurer
1. 引言
- Spring最重要的功能是操作数据。在Java互联网项目中,数据大部分存储在数据库或者NoSQL工具中。本篇博客主要介绍Spring如何操作数据库。Spring为开发者提供了JDBC模板模式,就是自身的jdbcTemplate,他可以简化许多代码的编程,但是在实际工作中并不常用。
- 在工作中更多的是使用Hibernate和MyBatis框架,对于Hibernate矿架,Spring提供了HibernateTemplate给与支持,有效简化了Hibernate的编程。对于MyBatis,MyBatis社区开发了接入Spring的开发包,该包提供了SqlSessionTemplate给开发者使用,该包还可以屏蔽SqlSessionTemplate这样的功能性代码,可以在编程中擦除SqlSessionTemplate让开发者直接使用接口编程,大大提高了编程的可读性。
- 个人理解:推荐使用mybatis框架,并且使用接口编程
2. 传统JDBC代码的弊端
- 传统的JDBC代码过程太过复杂,执行一条简单的SQL语句时,先打开数据库连接执行SQL,然后组装结果,最后关闭数据源,中间有太多的try…catch…finally…语句,造成代码的泛滥。
- 当发生异常时就会回滚,否自提交数据,模式比较固定。
3. 配置数据源
在Sping中配置数据库资源很简单,在实际工作中,大部分会配置为数据库连接池,我们既可以使用Spring内部提供的类,也可以使用第三方数据库连接池或者从web服务器中通过JNDI获取数据源。一般在工程中会采用XML方式进行配置,但是也可以使用注解方式进行配置。对于项目的公共资源,建议采用XML方式进行配置,方便查找公共源。
先简单介绍一下 连接池的原理:当一个应用要操作数据库时就要连接数据库,可以事先在连接池中创建几个数据库连接放着,当我们要操作数据库时,从数据库连接池中直接拿来用,并且标记为忙,使用完之后,放回连接池,标记为空闲。如果连接池中的数据库连接不够用时,可以在连接池中创建连接,连接的数量可以进行控制。
3.1. 使用spring自带的数据源
Spring中提供了一个类org.springframework.jdbc.datasource.SimpleDriverDataSource,此类不支持数据库连接池,可以用XMl方式进行配置。
配置完成之后就是一个简单的数据源,一般用于测试。
<!-- 配置SimpleDriverDataSource -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"><property name="username" value="root"/><property name="password" value="123"/><property name="driverClass" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/springmvc"/></bean>
注意:
- 使用此数据源需要导入的jar包为spring-jdbc.jar
- property属性中name的值与DBCP数据源name值有所不同。
- 注意value值前后不能有空格
3.2. 使用DBCP数据源
<!-- 配置datasource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="${database.driver}" /><property name="url" value="${database.url}" /><property name="username" value="${database.username}" /><property name="password" value="${database.password}" />
</bean>
注意:
- DBCP的配置依赖于2个jar包commons-dbcp.jar,commons-pool.jar。
- property属性中name的值与其他数据源name值有所不同。
- 注意value值前后不能有空格
3.3. 使用c3p0数据源
C3P0是一个开放源代码的JDBC数据源实现项目,C3P0依赖于jar包c3p0.jar
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/springmvc"/> <property name="user" value="root"/> <property name="password" value="root"/> </bean>
c3p0比DBCP有更丰富的配置属性。
3.4. 使用JNDI数据库连接池
如果应用配置在高性能的应用服务器(如WebLogic或Websphere,tomcat等)上,我们可能更希望使用应用服务器本身提供的数据源。应用服务器的数据源 使用JNDI开放调用者使用,Spring为此专门提供引用JNDI资源的JndiObjectFactoryBean类。
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="java:comp/env/jdbc/orclight"/>
</bean>
4. MyBatis-Spring项目配置
目前大部分的Java互联网项目采用的SpringMVC-Spring-MyBatis搭建平台的。使用Spring IoC可以有效管理各类java资源,通过AOP框架,数据库事物可以委托给Spring来处理。
4.1. 配置Spring-MyBatis项目的步骤(5步)
- 配置数据源datasource
- 配置SqlSessionFactory(可以配置SqlSessionTemplate,在同时配置SqlSessionTemplate和SqlSessionFactory的情况下,优先采用SqlSessionTemplate,此中配置不推荐使用,会使用即可)
- 配置Mapper,可以配置单个Mapper,也可以通过扫描的方法生成Mapper,比较灵活。
- 事物管理
4.2. 配置SqlSessionFactoryBean
在MyBatis项目中,要通过SqlSessionFactory生成SqlSession。
在MyBatis-Spring项目中使用SqlSessionFactoryBean去支持SqlSessionFactory的配置。
<!--在Spring的配置文件(生成IoC容器的xml文件)中进行配置-->
<!-- 配置SqlSessionFactory --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!--dataSource属性指定要用到的连接池--><property name="dataSource" ref="dataSource" /><!--configLocation属性指定mybatis的核心配置文件--><property name="configLocation" value="MyBatis_Spring/mybatis-config.xml" /></bean>
4.3. mapper的配置
MyBatis的运行只需要提供一个类似于RoleMapper.java的接口,无需提供一个实现类,通过学习MyBatis的运行原理,可以知道这个实现类由MyBatis体系创建的动态代理对象运行的,所以Spring也没有办法为其生成实现类。
有三种配置方法:
- 原始dao接入的配置方法
- 配置MapperFactoryBean的bean对象,写好dao接口,让spring生成代理对象,此种方法的缺点是:当有很多个mapper需要配置时,需要一个个配置文件去手动配置。
- 批量配置mapper,使用MapperScannerConfigurer(推荐使用)
4.3.1. 配置MapperFactoryBean
我们可以通过配置MapperFactoryBean类作为中介,来实现Mapper。
<!--项目比较大的时候,会有很大的配置量-->
<!-- 配置mapperFactoryBean --><bean id="role" class="org.mybatis.spring.mapper.MapperFactoryBean"><!-- Mapper接口将被扫描为Mapper --><property name="mapperInterface" value="Mapper接口的全限类名称"/><property name="SqlSessionFactory" ref="sqlSessionFactory"/><!-- 如果同时注入SqlSessionFactory和SqlSessionTemplate,则会使用SqlSessionTemplate --><!-- <property name="SqlSessionTemplate" ref="sqlSessionTemplate"/>--></bean>
当这样配置后,使用下面代码获取映射器:
RoleMapper roleMapper = ctx.getBean(RoleMapper.class);//在MyBatis中使用下面这种方式//获取mapper接口的代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
4.3.2. 配置MapperScannerConfigurer
这是通过扫描的形式配置Mapper的类。
<!--配置MapperScannerConfigurer--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basepackage" value="Mapper接口的包路径"/><property name="SqlsessionFactoryBeanName"value="指定的上面配置的SqlSessionFactory"/><!-- 指定标注才扫描成Mapper --><property name="annotationClass" value="org.springframework.sterotype.Repository"/></bean>
- annotationClass:表示如果类被这个注解标识的时候,才进行扫描。在Spring中常常使用@Repository注解表示数据访问层(DAO).
- basePackage:指定让Spring自动扫描什么包,他会逐层深入扫描,如果遇到多个包,可以使用半角逗号分割。mapper接口要与对应的mapper.xml文件放在同一个目录下,并且名称相同。
- SqlSessionFactoryBeanName:指定在Spring中定义的SqlSessionFactory的Bean的名称。
- MapperInterface:指定实现了什么接口就认为他是Mapper
对于Mapper接口,使用@Repository注解,它标志这是一个DAO层。然后指定扫描那个包,就能扫描出对应的Mapper到Spring IoC容器中。
接口的编写方式:
//注意注解@Repository是用在接口上@Repositorypublic interface RoleMapper { //添加数据public int insertRole(Role role);}
mybatis与spring整合详解相关推荐
- Spring和Elasticsearch全文搜索整合详解
Spring和Elasticsearch全文搜索整合详解 一.概述 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web ...
- Spring和Security整合详解
Spring和Security整合详解 一.官方主页 Spring Security 二.概述 Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 基于 Sp ...
- Spring和Ehcache整合详解
Spring和Ehcache整合详解 一.官方主页 Spring Cache 二.概述 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点. Spring 提供了对缓存功能的抽象: ...
- Spring和Redis整合详解
Spring和Redis整合详解 官方主页 Spring Spring Redis 概述 Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库,缓存和消息代理. 简单来说,它是一个以(ke ...
- Spring和WebSocket整合详解
Spring和WebSocket整合详解 本篇编写日期较早,代码冗余较多,新博文:Spring和WebSocket整合并建立简单的Web聊天室 官方主页 Spring WebSocket 概述 Web ...
- Spring和Email整合详解
Spring和Email整合详解 官方主页 Spring Email 概述 Spring Mail API都在org.springframework.mail及其子包org.springframewo ...
- Spring和Ldap整合详解
Spring和Ldap整合详解 官方主页 Spring Spring Ldap 概述 LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问 ...
- Spring和Spring Mvc整合详解
Spring和Spring Mvc整合详解 官方主页 Spring Spring Mvc SpringMvc 5,可以参考这一篇<Spring和Spring Mvc 5整合详解> 概述 S ...
- Spring入门详解
typora-copy-images-to: upload Spring入门详解 Spring框架是Java开发中最常用的框架,功能非常强大 源码下载:Spring Framework jar包.文档 ...
最新文章
- 404 – File or directory not found.
- python变量后面加星号_Python开发中关于参数使用的几点建议 -- 1
- syslog-ng按源ip保存记录
- 7-34 点赞 (20 分)
- unity 主线程调用_Kafka的Producer的调用序列图
- python学爬虫还是人工_本人初二生,学习Python爬虫,要不要继续深入学习啊?
- 100个iOS开发/设计面试题汇总,你将如何作答?
- Linux上oracle精简版客户端快速部署
- html音乐播放器收起展开代码,JS模拟酷狗音乐播放器收缩折叠关闭效果代码
- chrome安装crxMouse鼠标右键手势插件后导致需要双击两次才能打开右键菜单
- background 互联网图片_微信小程序 background-image设置背景图片不显示的解决办法...
- HDU4609 3-idiots fft
- tao.opengl + C#
- 数据库:关系模型基本介绍
- REVA世界巡回交流会——亚太峰会 澳门站拉开序幕
- LeetCode/LintCode 题解丨一周爆刷字符串:URL 编码
- 计算机视觉入门(一)
- 图像直方图均衡化和空间滤波
- 【Java】公式计算 | JEXL
- C语言第五章实验原理,C语言第五章实验报告.docx
热门文章
- 第一章 android以及智能手机行业相关简介
- 生成二维码并将Bitmap保存成图片
- 电脑只有一个c盘怎么办?看我怎么一招解决!
- Windows - 文件系统 学习/收集
- png怎么转换成jpg格式?如何转换照片格式为jpg?
- kubevirt 存储 网络 监控
- Apache Hudi的编译及安装
- 单身职场人士怎么利用晚上时间提高自己?
- 【已解决】ocker: Error response from daemon: Conflict. The container name “/nginx“ is alrea.....
- while 循环进入死循环?