spring+mybatis,spring+mybatis实现事务的配置
spring+mybatis,spring+mybatis实现事务的配置详细介绍
本文目录一览: Spring整合Mybatis一文讲透,手把手带你实操
在介绍Spring整合Mybatis原理之前,我们得先来稍微介绍Mybatis的工作原理。
在Mybatis中,我们可以使用一个接口去定义要执行sql,简化代码如下: 定义一个接口,@Select表示要执行查询sql语句。
以下为执行sql代码:
Mybatis的目的是:使得程序员能够以调用方法的方式执行某个指定的sql,将执行sql的底层逻辑进行了封装。 这里重点思考以下mapper这个对象,当调用SqlSession的getMapper方法时,会对传入的接口生成一个 代理对象,而程序要真正用到的就是这个代理对象,在调用代理对象的方法时,Mybatis会取出该方法所对应的sql语句,然后利用JDBC去执行sql语句,最终得到结果。
UserService中的userMapper属性就会被自动注入为Mybatis中的代理对象。如果你基于一个已经完成整合的项目去调试即可发现,userMapper的类型为: org.apache.ibatis.binding.MapperProxy@41a0aa7d。证明确实是Mybatis中的代理对象。 好,那么现在我们要解决的问题的就是:如何能够把Mybatis的代理对象作为一个bean放入Spring容器中?要解决这个,我们需要对Spring的bean生成过程有一个了解。
Spring启动过程中,大致会经过如下步骤去生成bean
假设有一个A类,假设有如下代码: 一个A类
一个B类,不存在@Component注解
执行如下代码:
输出结果为:com.luban.util.A@6acdbdf5 A类对应的bean对象类型仍然为A类。但是这个结论是不确定的,我们可以利用BeanFactory后置处理器来 修改BeanDefinition,我们添加一个BeanFactory后置处理器:
这样就会导致,原本的A类对应的BeanDefiniton被修改了,被修改成了B类,那么后续正常生成的bean对 象的类型就是B类。此时,调用如下代码会报错:
但是调用如下代码不会报错,尽管B类上没有@Component注解:
并且,下面代码返回的结果是:com.luban.util.B@4b1c1ea0
之所以讲这个问题,是想说明 个问题:在Spring中,bean对象跟class没有直接关系,跟 BeanDefinition才有直接关系。 那么回到我们要解决的问题:如何能够把Mybatis的代理对象作为一个bean放入Spring容器中? 在Spring中,如果你想生成一个bean,那么得先生成一个BeanDefinition,就像你想new一个对象实 例,得先有一个class。
继续回到我们的问题,我们现在想自己生成一个bean,那么得先生成一个BeanDefinition,只要有了 BeanDefinition,通过在BeanDefinition中设置bean对象的类型,然后把BeanDefinition添加给 Spring,Spring就会根据BeanDefinition 动帮我们 成 个类型对应的bean对象。 所以,现在我们要解决两个问题:
注意:上文中我们使用的BeanFactory后置处理器,他只能修改BeanDefinition,并不能新增一个 BeanDefinition。我们应该使用Import技术来添加一个BeanDefinition。后面再详细介绍如果使用Import 技术来添加一个BeanDefinition,可以先看一下伪代码实现思路。
假设:我们有一个UserMapper接口,他的代理对象的类型为UserMapperProxy。 那么我们的思路就是这样的,伪代码如下:
但是,这里有一个严重的问题,就是上文中的UserMapperProxy是我们假设的,他表示一个代理类的类 型,然而Mybatis中的代理对象是利用的JDK的动态代理技术实现的,也就是代理对象的代理类是动态生成的,我们根本方法确定代理对象的代理类到底是什么。 所以回到我们的问题:Mybatis的代理对象的类型是什么? 本来可以有两个答案: 1. 代理对象对应的代理类 2. 代理对象对应的接口 那么答案1就相当于没有了,因为是代理类是动态生成的,那么我们来看答案2:代理对象对应的接口如果我们采用答案2,那么我们的思路就是:
但是,实际上给BeanDefinition对应的类型设置为一个接口是行不通的,因为Spring没有办法根据这个 BeanDefinition去new出对应类型的实例,接口是没法直接new出实例的。 那么现在问题来了,我要解决的问题:Mybatis的代理对象的类型是什么? 两个答案都被我们否定了,所以这个问题是无解的,所以我们不能再沿着这个思路去思考了,只能回到最 开始的问题:如何能够把Mybatis的代理对象作为一个bean放入Spring容器中?
总结上文的推理:我们想通过设置BeanDefinition的class类型,然后由Spring自动的帮助我们去生成对应的bean,但是这条路是行不通的。 终极解决方案 那么我们还有没有其他办法,可以去生成bean呢?并且生成bean的逻辑不能由Spring来帮我们做了,得 由我们自己来做。 FactoryBean 有,那就是Spring中的FactoryBean。我们可以利用FactoryBean去自定义我们要生成的bean对象,比如
我们定义了一个LubanFactoryBean,它实现了FactoryBean,getObject方法就是用来自定义生成bean 对象逻辑的。 执行如下代码:
将打印: lubanFactoryBean: com.luban.util.LubanFactoryBean 1@4d41cee &lubanFactoryBean: com.luban.util.LubanFactoryBean@3712b94 lubanFactoryBean-class: class com.sun.proxy. Proxy20 从结果我们可以看到,从Spring容器中拿名字为"lubanFactoryBean"的bean对象,就是我们所自定义的 jdk动态代理所生成的代理对象。
所以,我们可以通过FactoryBean来向Spring容器中添加一个自定义的bean对象。上文中所定义的 LubanFactoryBean对应的就是UserMapper,表示我们定义了一个LubanFactoryBean,相当于把 UserMapper对应的代理对象作为一个bean放入到了容器中。 但是作为程序员,我们不可能每定义了一个Mapper,还得去定义一个LubanFactoryBean,这是很麻烦的 事情,我们改造一下LubanFactoryBean,让他变得更通用,比如:
改造LubanFactoryBean之后,LubanFactoryBean变得灵活了,可以在构造LubanFactoryBean时,通 过构造传入不同的Mapper接口。 实际上LubanFactoryBean也是一个Bean,我们也可以通过生成一个BeanDefinition来生成一个 LubanFactoryBean,并给构造方法的参数设置不同的值,比如伪代码如下:
特别说一下注意二,表示表示当前BeanDefinition在生成bean对象时,会通过调用LubanFactoryBean的 构造方法来生成,并传入UserMapper的Class对象。那么在生成LubanFactoryBean时就会生成一个 UserMapper接口对应的代理对象作为bean了。 到此为止,其实就完成了我们要解决的问题:把Mybatis中的代理对象作为一个bean放入Spring容器中。
只是我们这是用简单的JDK代理对象模拟的Mybatis中的代理对象,如果有时间,我们完全可以调 Mybatis中提供的方法区生成一个代理对象。这里就不花时间去介绍了。 Import 到这里,我们还有一个事情没有做,就是怎么真正的定义一个BeanDefinition,并把它添加到Spring中, 上文说到我们要利用Import技术,比如可以这么实现: 定义如下类:
并且在AppConfig上添加@Import注解:
这样在启动Spring时就会新增一个BeanDefinition,该BeanDefinition会生成一个LubanFactoryBean对 象,并且在生成LubanFactoryBean对象时会传入UserMapper.class对象,通过LubanFactoryBean内部 的逻辑,相当于会自动生产一个UserMapper接口的代理对象作为一个bean。
总结一下,通过我们的分析,我们要整合Spring和Mybatis,需要我们做的事情如下:
作者:程序员周瑜 链接:https://juejin.cn/post/7089023062800236552
在mybatis跟spring集成的时候,为什么还要导入spring-jdbc的包呢,这里面不是
使用SSM(Spring、SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方。之前没有记录SSM整合的过程,这次刚刚好基于自己的一个小项目重新搭建了一次,而且比项目搭建的要更好一些。以前解决问题的过程和方法并没有及时记录,以后在自己的小项目中遇到我再整理分享一下。这次,先说说三大框架整合过程。个人认为使用框架并不是很难,关键要理解其思想,这对于我们提高编程水平很有帮助。不过,如果用都不会,谈思想就变成纸上谈兵了!!!先技术,再思想。实践出真知。(可通过图片水印查看博客地址)
1、基本概念
1.1、Spring
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
1.2、SpringMVC
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
1.3、MyBatis
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
2、开发环境搭建
如果需要,参看之前的博文:http://blog.csdn.net/zhshulin/article/details/30779873
3、Maven Web项目创建
如果需要,参看之前的博文:http://blog.csdn.net/zhshulin/article/details/37921705
4、SSM整合
下面主要介绍三大框架的整合,至于环境的搭建以及项目的创建,参看上面的博文。这次整合我分了2个配置文件,分别是spring-mybatis.xml,包含spring和mybatis的配置文件,还有个是spring-mvc的配置文件,此外有2个资源文件:jdbc.propertis和log4j.properties。
mybatis跟spring集成的时候
在spring的配置文件中使用了SqlSessionFactoryBean这个类
接着去看SqlSessionFactoryBean的源码
因为使用了org.springframework.jdbc.datasource这个包下的类
所以要加spring-jdbc这个依赖
spring mvc中的mybatis怎么使用
你这问的就有问题,springmvc和mysatis是两个框架;springmvc是一个前端控制器,客户端和服务端交互用的;mybatis是数据库的框架;这两个框架可以一起使用,配置文件配好,就能用,百度有很多配置好的你可以看一下
spring mvc+myBatis配置详解
一、spring mvc
Spring框架(框架即:编程注解+xml配置的方式)MVC是Spring框架的一大特征,Spring框架有三大特征(IOC(依赖注入),AOP(面向切面),MVC(建模M-视图V-控制器C)。框架一般用于团队开发,使用分层的方式使每个人完成不同的模块,然后再组合在一起,使完成项目。
以下是Spring mvc具有的能加速开发的功能列表:
Spring mvc中提供了一个DispatchServlet,无需额外开发Spring mvc中使用基于xml的配置文件,可以编辑,而无需重新编译应用程序Spring mvc实例化控制器,并根据用户输入来构造Bean。
Spring mvc可以自动绑定用户输入,并正确的转换数据类型。例如,Spring mvc能自动解析字符串,并设置float或decimal类型的属性.
Spring mvc可以校验用户输入,若校验不通过,则重定向回输入表单。输入校验是可选的,支持编程方式以及声明。关于这一点,Spring mvc内置了常见的校验器Spring mvc是Spring框架的一部分,可以利用Spring提供的其他能力。
Spring mvc支持国际化和本地化。支持根据用户区域显示多国语言Spring mvc支持多种视图技术。最常见的JSP技术以及其他技术包括Velocity和FreeMarker.
配置spring mvc
1、导入Spring需要的jar 包
2、配置spring-mvc.xml
复制代码
开启spring mvc注解扫描,如果不基于注解: 该类需要继承 CommandController 或者 其他很多 参见 spring帮助.我用的是基于注解的,这样比较方便
<context:component-scan
base-package="com.包名"/>
开启组件扫描,请确保所有的控制器都在基本包下,并且不要制定一个太宽泛的基本包
</context:component-scan
复制代码
补充:
第一个为开启spring mvc注解扫描,如果不基于注解: 该类需要继承 CommandController 或者 其他很多 参见 spring帮助.我用的是基于注解的,这样比较方便第二个为开启组件扫描Spring使用扫描机制来找到应用程序中所有基于注解的控制器类,为了能保证Spring你那个找到你的控制器,a.需要在Spring mvc中配置spring-contextb.在
元素中指定控制器类的基本包基于此,在Controller中可以方便调用了,实例见最下方3.部署web.xmlDispatcherServlet作为Spring mvc框架中的一级控制器(前端控制器),是浏览器发送请求的入口该Servlet的全称是org.springframework.web.servlet.DispatcherServlet.
要使用这个Servlet,需要把他配置在部署描述符(web.xml),应用servlet和servlet-mapping元素如下:
相关解释:
1、servlet元素内的on-startup元素是可选的。if存在,表示它将在应用程序启动时就装在servlet并调用它的init方法。else,则在该servlet的第一个请求是加载。
2、Dispatcher Servlet将会使用spring mvc诸多默认组件。此外,初始化时,它会寻找一个在应用程序下的web-INF目录下 的配置文件,该配置文件的命名规则如下;servletName-servlet.xml其中servletName是在部署描述符中的Dispatcher Servlet的名字。如图所示,本例中的servlet-name为springmvc,则在初始化的时候会找到第二步配置的springmvc.xml文件.
3、当然springmvc.xml文件也可以放到应用程序目录中的任何地方,
元素就是为了实现这个功能的。
其中的
不用改,而
则包含配置文件的路劲。
补充一下:(1)Spring可以通过指定classpath*:与classpath:前缀加路径的方式从classpath加载文件,如bean的定义文件.
classpath*:的出现是为了从多个jar文件中加载相同的文件.
classpath:只能加载找到的第一个文件
(2) url-pattern的写法
1 三种写法
① 完全匹配
/test/list.do
② 目录匹配
/test/*
③ 扩展名匹配
*.do
2 注意事项
容器会首先查找完全匹配,如果找不到,再查找目录匹配,如果也找不到,就查找扩展名匹配。
如果一个请求匹配多个“目录匹配”,容器会选择最长的匹配。
定义”/*.action”这样一个看起来很正常的匹配会报错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。
“/” 是用来定义default servlet映射的。
*.do它不是一个文件,并没有一个真正的.do文件存在,只是一个servlet映射.意思是URL里一切以.do结尾的URL都驱动servlet里设置的那个类;而*则是所有请求都交由servlet里设置的那个类处理!
二、MyBatis的配置和使用
Spring与MyBatis结合,主要是由Spring管理数据库访问组件Dao,数据库访问组件主要是基于MyBatis实现,在Spring环境中使用MyBatis实现数据库访问组件过程是:首先需要引入一个Spring和MyBatis整合的开发包 mybatis-spring-1.2.2.jar。在Spring配置中定义SqlSessionFactoryBean,等价于SqlSessionFactory放入Spring容器管理。(不需要开发者利用手工创建SqlSessionFactory对象,需要开发者定义式注入连接信息和SQL定义的XML信息)在Spring配置中定义MapperFactoryBean,可以根据指定的Mapper接口生成一个Mapper实现类接口。需引入引入开发包:spring ioc,spring aop,dbcp,mybatis,驱动,mybatis-spring.jar。添加Spring框架的配置文件主要有applicationContext.xml,根据user表编写实体类User,编写UserMapper.xml(定义SQL语句),并且编写UserMapper接口(与UserMapper.xml映射),在applicationContext.xml中配置组件SqlSessionFactoryBean,Mapper FactoryBean。最后测试MapperFactoryBean生成的UserMapperDao实例。
MyBatis的两个特点:
1.MyBatis采用SQL与Entity映射,对JDBC封装程度较轻2.MyBatis自己写SQL,更具有灵活性配置MyBatis
(1)导入jar包
(2)创建数据库
(3)添加MyBatis.xml配置文件
复制代码
<bean id="dbcp"
class="org.apachemons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
<property name="url"
value="jdbc:mysql:///cloud_note">
<!-- -->
<bean id="ssf"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="mapperLocations"
value="classpath:com/niuniu/sql/*.xml">
<bean id="mapperscanner"
class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage"
value="com.niuniu.dao">
复制代码
(4)定义表所对应的实体类,如下图所示
代码如下:
复制代码
package com.niuniu.entity;
import java.io.Serializable;
public class User implements Serializable {private String cn_user_id;private String cn_user_name;
private String cn_user_password;
private String cn_user_token;
private String cn_user_nick;
public String getCn_user_id() {
return cn_user_id;
}
public void setCn_user_id(String cnUserId) {cn_user_id = cnUserId;}
public String getCn_user_name() {
return cn_user_name;
}
public void setCn_user_name(String cnUserName) {cn_user_name = cnUserName;}
public String getCn_user_password() {
return cn_user_password;
}
public void setCn_user_password(String cnUserPassword) {cn_user_password = cnUserPassword;}
public String getCn_user_token() {
return cn_user_token;
}
public void setCn_user_token(String cnUserToken) {cn_user_token = cnUserToken;}
public String getCn_user_nick() {
return cn_user_nick;
}
public void setCn_user_nick(String cnUserNick) {cn_user_nick = cnUserNick;}
}
复制代码
(5)定义操作users表的sql映射文件UserMapping.xml复制代码
insert into cn_user(
cn_user_id,cn_user_name,
cn_user_password,cn_user_token,
cn_user_nick)
values(#{cn_user_id},#{cn_user_name},#{cn_user_password},#{cn_user_token},#{cn_user_nick})
select * from cn_userwhere cn_user_name=#{name}
复制代码
(6)写Controller,进行测试。
复制代码
@Controller//将类名前加上该注解,当spring启动或者web服务启动 spring会自动扫描所有包(当然,这个可以设置,见上述Springmvc的配置)作用: 就是告诉服务器这个类是MVC中的C, 这个类可以接收用户请求、处理用户请求@RequestMapping("/note")//这个控制类里面可以有很多方法,哪个方法用来处理用户请求,就在那个方法前面 加 @RequestMapping(“/xxxxx请求路径”)public class LoadNoteDetailController {@Resource//直接使用@Resource注解一个域(field)同样是可能的。通过不暴露setter方法,代码愈发紧凑并且还提供了域不可修改的额外益处。
//正如下面将要证明的,@Resource注解甚至不需要一个显式的字符串值,在没有提供任何值的情况下,域名将被当作默认值。
//该方式被应用到setter方法的时候,默认名是从相应的属性衍生出来,换句话说,命名为'setDataSource'的方法被用来处理名为'dataSource'的属性。
private NoteService noteService;
@RequestMapping("/loaddetail.do")//映射到JSP的前台页面中ajax发布的请求,打开相应的页面↑@ResponseBody ↑public NoteResult execute(String noteId){ ↑NoteResult result=noteService.loadDetail(noteId); ↑return result;//当请求处理完毕后,返回值决定了该处理完毕后,用户将跳转到那个页面.这个很重要。service调util}
}
复制代码
知识补充:
@Resource
@Resource默认按照ByName自动注入,有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性 则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既 不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
@ResponseBody
作用:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
spring+mybatis实现事务的配置
????1、xml文件头部需要添加spring的相关支持:
????2、配置事务管理器
? ? 3、配置需要加入事务的方法规则,或者说是一个切面
?
?
?
?
?
?
事物配置中有哪些属性可以配置
(1)事务的传播性:@Transactional(propagation=Propagation.REQUIRED)?
? ? ? 如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
(2)事务的超时性:@Transactional(timeout=30) //默认是30秒?
? ? ? 注意这里说的是事务的超时性而不是Connection的超时性,这两个是有区别的
(3)事务的隔离级别:@Transactional(isolation = Isolation.READ_UNCOMMITTED)
? ? ? 读取未提交数据(会出现脏读, 不可重复读) 基本不使用
(4)回滚:
指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)
指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。
(5)只读:@Transactional(readOnly=true)
该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。
例如:
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class,timeout=1,isolation=Isolation.DEFAULT)?
public void saveUser(Map
map) throws Exception {?
? ? System.out.println("方法开始");?
? ? for (int i = 0; i < 500000; i++) {?
? ? ? ? ? ? System.out.println("*");?
? ? ? ? }?
? ? System.out.println("进入保存");?
? ? userDao.saveUser(map);?
? ? System.out.println("退出保存");?
}?
解释说明
事务的传播级别定义的是事务的控制范围,主要是父子事务之间的相互影响关系;事务的隔离级别定义的是事务读写的控制范围,主要是两个事务之间的相互影响关系。
传播级别:
1)、REQUIRED
如果当前方法已经在事务中,那么就以父事务执行,不需要新建事务;如果当前方法不在事务中,那么就为当前方法新建事务。回滚情况:父子方法中任何地方出现问题,都会全部回滚。
2)、SURPPORTED
如果当前方法已经在事务中,那么就以当前事务执行;如果当前方法不再事务中,那么就以非事务方式运行。如果运行在事务中,那么只要出现异常都会回滚。
3)、NOT_SURPPORTED
如果当前方法已经在事务中,那么就挂起当前事务,以非事务方式运行,方法执行完毕后,恢复事务;如果当前方法不再事务中,那么就以非事务方式执行。
4)、MANDATORY
强制以事务方式执行,如果当前方法不在事务中,那么会抛出异常。
5)、NEVER
与MANDATORY相反,强制以非事务方式执行,如果当前方法在事务中,那么会抛出异常。
6)、REQUIRED_NEW
与REQUIRED不同的是,无论该方法当前是不是在事务中,都会为自己新建一个事务。如果当前已经在事务中,那么会挂起父事务,为自己新建一个事务。父事务不影响它子事务的提交和回滚。
7)、NESTED
嵌套事务。理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。而Nested事务的好处是他有一个savepoint。
例如:
ServiceA {
/**
* 事务属性配置为 PROPAGATION_REQUIRED
*/
void methodA() {
try {
//savepoint
ServiceB.methodB(); //PROPAGATION_NESTED 级别
} catch (SomeException) {
// 执行其他业务, 如 ServiceC.methodC();
}
}
}
也就是说ServiceB.methodB失败回滚,那么ServiceA.methodA也会回滚到savepoint点上,ServiceA.methodA可以选择另外一个分支,比如ServiceC.methodC,继续执行,来尝试完成自己的事务。
原文链接:https://blog.csdn.net/wgh1015398431/java/article/details/52861048
springmvc+mybatis整合后还需要spring吗
springmvc+mybatis整合后还需要spring吗, 如何整合springmvc+mybatis, springmvc整合mybatis需要哪些jar包, springMVC+mybatis整合的jar包 非常感谢 springMVC只是spring这个框架中的一部分功能,spring与mabatis整合不仅包含sprinMVC与mybatis的整合,而且还可以使用spring的AOP,IOC功能来管理元件以及事物等。
spring整合mybatis 需要spring-jdbc吗 不需要spring-jdbc,mybatis是一个持久层框架,支援了对资料库的增删改查等操作
有了glassfish后还需要和apache整合吗? 1、tomcat6+apache(ligd); 2、glassfish v2.1 3、glassfish v2.1+apache 问题就在这里,glassfish具有web伺服器的能力,据说其web静态资源的处理能力不亚于apache,我的疑问是在使用glassfish后还需要她与apache整合吗?请有经验的朋友给予解答,如果有资料证明的话最好,thanks。另有一个问题:jdbc直接操作资料库与jpa相比谁的效能更好,oracle 10g,jpa在今后的分表分库上的处理的灵活程度如何?问题补充魔力猫咪 写道 Apache的效能其实已经算比较差的了。即使是使用单独的静态伺服器,也推荐ligd。Glassfish本身的效能不错,完全可以负担静态处理。当然,是否符合你的需要必须通过效能测试才能确定。 JDBC和JPA的效能问题。首先,要肯定的是如果没有快取,那么JDBC绝对比JPA快。但是现在的JPA实现都是可以快取的,所以是否能做到超过JDBC的速度就看你的设计功力了。比如快取的选择、快取设定、物件结构的设计。
springmvc+spring+mybatis整合还要写dao的实现吗 你好 个人觉得没必要,直接写在serviceimpl 你的采纳是我前进的动力,还有不懂的地方,请继续“追问”。 如你还有别的问题,可另外向我求助;答题不易,互相理解,互相帮助。
Spring与MyBatis整合需要哪些包 开始整合Spring和MyBatis: 1、在Eclipse里新建一个web专案,汇入需要的jar包, 2、建立一个简单的资料库(springmybaitis)和资料表(user---id,username,password)。 3、以使用者管理为例,建立model和dao. 5、MyBatis的配置档案------mybatis-config.xml 6、测试
spring-webmvc(3.2.8)、dbcp、spring-jdbc、oracle drive(oracle14)、mybatis(3.2.5) mybatis-spring(1.2.2) 我用的就是这些
springmvc+mybatis sqlsession需要关闭么 给你个思路,你去实现HandlerIntercepter这个介面去实现判断当前使用者是否登入如果当前使用者没有登入,则将提示使用者登入,反之。
关于spring集成mybatis如何实现mysql数据库读写分离的实例分析
本文通过实例代码给大家介绍了spring集成mybatis实现mysql数据库读写分离,需要的朋友可以参考下前言 在网站的用户达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈。幸运的是目前大部分的主流数据库都提供主从热备功能,通过配置两台数据库主从关系,可以将一台数据库的数据更新同步到另一台服务器上。网站利用数据库的这一功能,实现数据库读写分离,从而改善数据库负载压力。如下图所示:应用服务器在写数据的时候,访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库,这样当应用服务器读数据的时候,就可以通过从数据库获得数据。为了便于应用程序访问读写分离后的数据库,通常在应用服务器使用专门的数据库访问模块,使数据库读写分离对应用透明。 而本博客就是来实现“专门的数据库访问模块”,使数据库读写分离对应用透明。另外,mysql数据库的主从复制可以参考我的mysql5.7.18的安装与主从复制。注意,数据库实现了主从复制,才能做数据库的读写分离,所以,没有实现数据库主从复制的记得先去实现数据库的主从复制配置读写数据源(主从数据库) mysqldb.properties#主数据库数据源jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://192.168.0.4:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=falsejdbc.username=rootjdbc.password=123456jdbc.initialSize=1jdbc.minIdle=1jdbc.maxActive=20jdbc.maxWait=60000jdbc.removeAbandoned=truejdbc.removeAbandonedTimeout=180jdbc.timeBetweenEvictionRunsMillis=60000jdbc.minEvictableIdleTimeMillis=300000jdbc.validationQuery=SELECT 1jdbc.testWhileIdle=truejdbc.testOnBorrow=falsejdbc.testOnReturn=false#从数据库数据源slave.jdbc.driverClassName=com.mysql.jdbc.Driverslave.jdbc.url=jdbc:mysql://192.168.0.221:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=falseslave.jdbc.username=rootslave.jdbc.password=123456slave.jdbc.initialSize=1slave.jdbc.minIdle=1slave.jdbc.maxActive=20slave.jdbc.maxWait=60000slave.jdbc.removeAbandoned=trueslave.jdbc.removeAbandonedTimeout=180slave.jdbc.timeBetweenEvictionRunsMillis=60000slave.jdbc.minEvictableIdleTimeMillis=300000slave.jdbc.validationQuery=SELECT 1slave.jdbc.testWhileIdle=trueslave.jdbc.testOnBorrow=falseslave.jdbc.testOnReturn=false主、从数据库的地址记得改成自己的,账号和密码也需要改成自己的;其他配置项,大家可以酌情自行设置 mybatis-spring.xml
AOP实现数据源的动态切换DataSource.javapackage com.yzb.util;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * RUNTIME * 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。 * */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface DataSource{ String value();}DataSourceAspect.javapackage com.yzb.util;import java.lang.reflect.Method;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.reflect.MethodSignature;public class DataSourceAspect{ /** * 在dao层方法获取datasource对象之前,在切面中指定当前线程数据源 */ public void before(JoinPoint point) { Object target = point.getTarget(); String method = point.getSignature().getName(); Class<
spring mybatis 使用的是什么事务
spring,mybatis事务管理配置与@Transactional注解使用
spring支持编程式事务管理和声明式事务管理两种方式。
编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。
声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。
SpringBoot整合ORM开发框架MyBatis和JPA
1、在使用Spring整合ORM组件的过程中,为了达到简化的目的,往往会进行大量的配置。利用SpringBoot可以进一步实现配置的简化。SpringBoot整合MyBatis开发框架,MyBatis是一款常用并且配置极为简单的ORM开发框架。其与Spring结合后,可以利用Spring的特征实现DAO接口的自动配置。在SpringBoot中,又对MyBatis框架的整合进行了进一步简化。
修改pom.xml配置文件,在项目中引入mybatis-spring-boot- starter依赖支持库,切记也需要数据库链接池的支持的哦。
数据表结构,如下所示:
注意:如果数据表字段两个英文单词之间是下划线连接的,但是你的实体类是驼峰命名法,此时就需要进行配置,数据库字段是你下划线分隔,但是bean中的字段是驼峰命名的,如user_name和userName,导致无法匹配。如果是通过xml文件来配置的话,只需要开启驼峰命名转换,setting name="mapUnderscoreToCamelCase" value="true"/>,在/src/main/resources/mybatis/mybatis.cfg.xml里面配置即可。
创建一个po实体类,方便数据传输,如下所示:
在src/main/resources目录中创建mybatis/mybatis.cfg.xml配置文件。如果要开启驼峰命名转换,在这里开启即可,如下所示:
如果在application.properties中开启转换的话,使用mybatis.configuration.map-underscore-to-camel-case=true配置即可。
或者搞个配置类,如果数据库表字段Column无法自动映射到相对应的实体类属性上,我们可以在config包下新建一个自动配置类MybatisConfig,开始驼峰命名规则。
MyBatis配置文件开启驼峰命名映射
修改application.yml配置文件,追加MyBatis配置,如下所示:
搞几个Dao层、Service层、Controller层的接口或者类,如下所示:
注意:如果不想每次都在mapper接口上添加@Mapper注解,可以在主启动类上通过添加@MapperScan注解来批量扫描指定包下的所有mapper接口。
Service层的接口和实现类代码,如下所示:
控制层的代码,如下所示:
项目启动类,如下所示:
通过Postman测试一下,自己写的接口,看看好使不,如下所示:
项目结构,如下所示:
2、JPA是官方推出的Java持久层操作标准(现主要使用Hibernate实现),使用SpringData技术和JpaRepository接口技术,也可以达到简化数据层的目的。要在SpringBoot中使用SpringDataJPA,需要spring-boot-starter-data-jpa依赖库的支持。
修改pom.xml配置文件,引入相关依赖包,如下所示:
创建UserInfo实体类,如下所示:
创建UserDao,然后继承JpaRepository ,此时就可以使用写好的方法了,不用自己再额外写接口和实现,如下所示:
然后定义Service接口和Service接口实现,如下所示:
然后搞一个Controller,作为接口访问的入口,如下所示:
修改程序启动主类,追加Repository扫描配置。如果使用JpaRepository实现了DAO接口的自动实现。需要注意的是,如果想启用Repository配置,则需要在程序启动主类时使用@EnableJpaRepositories注解配置扫描包,而后才可以正常使用。
修改application.properties,使用Druid作为数据源连接池,如下所示:
使用postman进行接口调用,如下所示:
最主要的是给自己增加知识的储备,有备无患。最后给大家分享Spring系列的学习笔记和面试题,包含spring面试题、spring cloud面试题、spring boot面试题、spring教程笔记、spring boot教程笔记、最新阿里巴巴开发手册(63页PDF总结)、2022年Java面试手册。一共整理了1184页PDF文档。私信博主(666)领取,祝大家更上一层楼!!!
mybatis与springjdbc比较,谁更有优势
其实,没有什么区别。
就底层的SQL的执行效率而言,二者都不会去具体的实现数据驱动,底层都依赖数据库的JDBC驱动程序。没有区别。
持久层面上,MyBatis 用xml 配置SQL语句。JDBCTemplate 直接书写SQL。但是最后的结果都要OO化(Spring 的 OO 化 可能需要写代码),本质上没有啥区别的。
所差别的是事务管理的灵活性和效率而以。
在事务灵活性上Spring的txManager 要好于 MyBatis 的SqlSession。二者的区别是Spring 的AOP 实现了前后通知,在3段提交过程中,可以很方便的定义补充动作。灵活的同时就带来效率的降低,毕竟AOP 是基于动态代理,动态代理就要用到反射,反射就是慢。
SQLSession 在灵活性上不如Spring 的 tx。但是就效率来说要好于tx,毕竟人家没有用到反射,就是一个代理模式应用而已。
综上,在分布式的条件下,建议Spring,在单点的条件下.....还是建议Spring。tx 虽然用到反射效率低,但是没有低到不能接受的程度。
SpringBoot使用Mybatis&Mybatis-plus文件映射配置
简介 :Springboot使用Mybatis&Mybatis-plus 两者文件映射配置略有不同,之前我用的是Mybatis,但公司用Mybatis-plus;自己新建了一个Springboot项目,代码运行时一直报错not found not found,明明配置了mybatis相关信息的扫描路径,但是就是not found;检查修改了很多地方但都是无用功,最终发现是Plus惹的祸。
1、使用Mybatis
yml文件配置的mapper映射及相关信息格式:
2、使用Mybatis-Plus
yml文件配置的mapper映射及相关信息格式:
3、Others
加上 @Slf4j 注解后,仍然不能用log直接支配日志,因为没有安装Lombok插件。
加上 @Data 注解后,仍然不能使用getter/setter,因为没有安装Lombok插件。
在类上加注解@AllArgsConstructor 注解可以代替所有@Autowired 注解,就不用在一个类中引入多个@Autowired。 下载前端代码后需要在控制台运行:npm install,下载前端工程后在控制台npm install 相当于后端的下载jar包,目录级别还不能乱放,按照git工程代码格式,不能新建目录文件,否则资源下不来。