1.mybatis的作用。

它是一个数据持久化的解决方案,它是一个ORM的框架。

2.Spring的作用?

备注:将本地jar包拷贝至本地的maven仓库里:oracle的jar包需自己发布到maven本地仓库:

mvn install:install-file -Dfile=D:\maven\ojdbc6.jar -DgroupId=com.jinglin.oracle -DartifactId=oracle -Dversion=6.0 -Dpackaging=jar  -DgeneratePom=true -DcreateChecksum=true

引入的时候:

<dependency>
<groupId>com.jinglin.oracle</groupId>
<artifactId>oracle</artifactId>
<version>6.0</version>
</dependency>

IOC的作用:提供对象的生成。将对象放到容器里。

Spring同Mybatis的整合步骤:

1)除了必要的spring和mybatis的jar包之外,还需要有个spring对mybatis的支持的jar包:

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>

2)拷贝Spring的配置文件:applicationContext.xml

3)整合Spring同Mybatis的配置:

a.首先配置数据源(SqlSessionFactory的底层的配置),去掉原有的mybatis-config.xml里的environments节点。将之前的数据源的相关的配置转移到applicationContext.xml里去。

<!-- 定义数据源Bean,使用C3P0数据源实现 -->
<bean id="jdbcDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<!-- 指定连接数据库的驱动 -->
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>
<!-- 指定连接数据库的URL -->
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<!-- 指定连接数据库的用户名 -->
<property name="user" value="hotelsup"/>
<!-- 指定连接数据库的密码 -->
<property name="password" value="123" />
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize" value="40" />
<!-- 指定连接数据库连接池的最小连接数 -->
<property name="minPoolSize" value="2" />
<!-- 指定连接数据库连接池的初始化连接数 取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize" value="5" />
<!--最大空闲时间,25000秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="25000" />
<!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false -->
<property name="testConnectionOnCheckin" value="true" />
<!--每18000秒检查所有连接池中的空闲连接。Default: 0 -->
<property name="idleConnectionTestPeriod" value="18000" />
</bean>

2)配置SqlSessionFactory的bean对象:

<!-- 配置mybatis中的sqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置数据源 -->
<property name="dataSource" ref="jdbcDataSource" />
<!-- 读取mybatis的配置文件 -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>

3)每次生成这个mapper代理接口的对象,也由spring的bean来配置:

<!-- 因为每次操作的时候,都是由SqlSession生成的代理接口 -->
<bean id="userInfoMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!-- 所代理的接口 -->
<property name="mapperInterface" value="com.jinglin.hotelsup.dao.imp.UserInfoMapper"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>

4)测试代码:

static Logger logger = Logger.getLogger(TestUserInfo.class);
static ClassPathXmlApplicationContext ac=null;
static{
ac =new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void testit(){ UserInfoMapper userInfoMapper =(UserInfoMapper)ac.getBean("userInfoMapper");
UserInfo userinfo = new UserInfo();
userinfo.setCard("222");
userinfo.setUsername("admin124");
userinfo.setUserpwd("123");
int result= userInfoMapper.insertItem(userinfo);
System.out.println("受影响的行数:"+result);
}

3.实际在项目开发的时候,是采取的扫描包+注解的方式

1)对于dao层的扫描:

<!-- 将所有的mapper接口扫描到spring里,扫描出的bean的ID名:
比如UserInfoMapper,扫描到spring里,变成userInfoMapper-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 将哪个包扫描到spring里 -->
<property name="basePackage" value="com.jinglin.hotelsup.dao.imp"></property>
<!-- 扫描的时候,所依赖的SqlSessionFacotry -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>

2)对于service层的扫描:

<!-- 使用扫描的方式,将指定的包下所有的对象扫描到spring里-->
<context:component-scan base-package="com.jinglin.hotelsup.service"></context:component-scan>

3)对于dao层的接口,给它指明它就是一个dao层的bean。

@Repository
public interface UserInfoMapper extends IDaoHotel<UserInfo> { }

4)对于service层的实现,给它指明就是一个service层的bean

@Service
public class UserInfoService {
@Autowired
private UserInfoMapper userInfoMapper;
public int adduser(UserInfo userInfo){
return userInfoMapper.insertItem(userInfo);
}
}

4.关于事务的操作

1)什么是事务?

程序中的事务是程序的最小执行单元。我们所说的事务操作通常指的是在数据库中的操作。对数据库的改变的操作我们可以认为就是一个事务。默认情况下,一条DML的语句就会产生一个事务。事务的特点:

a.原子性:事务是最小的执行单元。

b.隔离性:事务之间是独立的操作,事务之间的操作是不会相互影响。

c.一致性:只要是事务里的语句操作,要么都一致成功,要么都一致失败。要么commit,都成功,要么rollback,都失败。

d.持久性:一旦对数据库的操作进行了事务提交,那么对数据就是持久的改变。

2)开发的时候,对于事务的编程方式:

a.编码式事务操作,主要就是在存储过程里实现。或者用JDBC的事务的操作。

b.声明式事务的操作,主要就是通过配置实现事务的控制。主要通过Spring的方式来实现事务的操作:

Spring的事务是通过AOP的方式来实现声明式事务。

关于声配置事务的管理类:

<!-- 声明式的事务管理类 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="jdbcDataSource" />
</bean>

2)配置事务对方法的控制:

<!-- 配置事务的增强,明确给方法加事务的操作 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 只要符合切面的表达式,所有的方法都加入到事务里 -->
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

3)配置AOP的切面表达式:

<!-- 配置AOP的切面表达式 -->
<aop:config>
<!-- 切面表达式 -->
<aop:pointcut id="serviceCut" expression="execution(public * com.jinglin.hotelsup.service.*.*(..))" />
<!-- 事务管理同切面整合,织入 -->
<aop:advisor pointcut-ref="serviceCut" advice-ref="txAdvice" />
</aop:config>

另外一种通过注解的方式实现事务的管理操作:

1)需要在applicationContext里加入注解的事务操作:

<!-- 使用annotation定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

2)在需要实现注解事务的业务类上加注解@Transactional,并且在方法上加事务的注解:

@Service
@Transactional
public class UserInfoService {
@Autowired
private UserInfoMapper userInfoMapper; public int adduser(UserInfo userInfo){
int i= userInfoMapper.insertItem(userInfo);
userInfo.setUsername("aaaaaaaaaaabbbbbcccccccsssssssdddddddddddddddddddd");
userInfoMapper.updateItem(userInfo);
return i;
}
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public List<UserInfo> getlist(UserInfo u){
return userInfoMapper.getlist(u);
}
}

@Repository

public interface UserInfoMapper extends IDaoHotel<UserInfo> {

}

Spring同mybatis整合讲义(事物)的更多相关文章

  1. Spring+springmvc+Mybatis整合案例 annotation版(myeclipse)详细版

    Spring+springmvc+Mybatis整合案例 Version:annotation版 文档结构图: 从底层开始做起: 01.配置web.xml文件 <?xml version=&qu ...

  2. Spring+springmvc+Mybatis整合案例 xml配置版(myeclipse)详细版

    Spring+springmvc+Mybatis整合案例 Version:xml版(myeclipse) 文档结构图: 从底层开始做起: 01.配置web.xml文件 <?xml version ...

  3. Spring与Mybatis整合的MapperScannerConfigurer处理过程源码分析

    前言 本文将分析mybatis与spring整合的MapperScannerConfigurer的底层原理,之前已经分析过java中实现动态,可以使用jdk自带api和cglib第三方库生成动态代理. ...

  4. Mybatis学习--spring和Mybatis整合

    简介 在前面写测试代码的时候,不管是基于原始dao还是Mapper接口开发都有许多的重复代码,将spring和mybatis整合可以减少这个重复代码,通过spring的模板方法模式,将这些重复的代码进 ...

  5. 九 spring和mybatis整合

    1       spring和mybatis整合 1.1     整合思路 需要spring通过单例方式管理SqlSessionFactory. spring和mybatis整合生成代理对象,使用Sq ...

  6. Mybatis学习(7)spring和mybatis整合

    整合思路: 需要spring通过单例方式管理SqlSessionFactory. spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSession.(spr ...

  7. 框架篇:Spring+SpringMVC+Mybatis整合开发

    前言: 前面我已搭建过ssh框架(http://www.cnblogs.com/xrog/p/6359706.html),然而mybatis表示不服啊. Mybatis:"我抗议!" ...

  8. SpringMVC, Spring和Mybatis整合案例一

    一  准备工作 包括:spring(包括springmvc).mybatis.mybatis-spring整合包.数据库驱动.第三方连接池. 二  整合思路 Dao层: 1.SqlMapConfig. ...

  9. MyBatis学习七:spring和MyBatis整合

    <\mybatis\day02\16mybatis和spring整合-sqlSessionFactory配置.avi;> MyBatis学习七:spring和MyBatis整合.逆向工程 ...

随机推荐

  1. Windows远程linux服务器执行shell命令

    一.前言 借用百度百科关于putty的描述:PuTTY是一个Telnet.SSH.rlogin.纯TCP以及串行接口连接软件.较早的版本仅支持Windows平台,在最近的版本中开始支持各类Unix平台 ...

  2. [补] winpcap编程——EAPSOCKET实现校园网锐捷登录(mentohust)

    EAP SOCKET Implement Mentohust 时间20161115 对于EAP协议不了解,可参考上一篇随笔. 通过抓包分析校园网的锐捷登录流程,我在上一篇随笔中实现了EAPSOCKET ...

  3. UWP中使用Composition API实现吸顶(1)

    前几天需要在UWP中实现吸顶,就在网上找了一些文章: 吸顶大法 -- UWP中的工具栏吸顶的实现方式之一 在UWP中页面滑动导航栏置顶 发现前人的实现方式大多是控制ListViewBase的Heade ...

  4. JAVA字符串操作 (转)

    JAVA字符串操作 原帖地址:http://blog.163.com/hn_myj@126/blog/static/50555635200861133942947/ 参考:http://blog.cs ...

  5. [IB]PeopleSoft异步详细信息中状态“已完成”但订阅合同状态“新建”问题

    最近遇到一个IB异步程序状态不一致问题,异步详细信息中上面的状态是“DONE”但是订阅合同中还是“新建”状态.在域状态中清除域状态也不管用. 重启app server也不好使.最后执行了appmsgp ...

  6. ES2017中的async函数

    前面的话 ES2017标准引入了 async 函数,使得异步操作变得更加方便.本文将详细介绍async函数 概述 async 函数是 Generator 函数的语法糖 使用Generator 函数,依 ...

  7. HDU5744 Keep On Movin (思维题,水题)

    Problem Description Professor Zhang has kinds of characters and the quantity of the i-th character i ...

  8. 华为服务器Linux在线做RAID方法

    背景概述 最近维护大数据的一些主机,大概有3k+的数目,有很大一部分是华为的服务器,大部分是12块数据盘,单盘做RAID0来存放数据,但是通常硬件是不可靠的,磁盘损坏是常态, 然而磁盘损坏进行定位更换 ...

  9. Open-Falcon第三步安装Agent (小米开源互联网企业级监控系统)

    安装Agent 每台机器上,都需要部署agent,agent会自动采集预先定义的各种采集项,每隔60秒,push到transfer. cd $WORKSPACE/agent/ mv cfg.examp ...

  10. React Native 系列(六) -- PropTypes

    前言 本系列是基于React Native版本号0.44.3写的.在我们之前的通过props实现组件间传值的时候,大家有没有发现在父组件传递值过去,在子控件获取props的时候没有提示,那么如何能实现 ...