Spring-整合JDBC-事务-远程方法调用RMI
一、spring整合JDBC
spring整合jdbc使用了模版方法设计模式
定义一套规范,固定流程不变,传入可变内容
1、Maven项目添加依赖
spring-context坐标依赖
mysql驱动包
c3p0连接池
spring jdbc
2、准备数据库的配置文件
3、xml配置
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--配置扫描器--><context:component-scan base-package="com.shsxt"/><!--加载properties--><context:property-placeholder location="classpath:jdbc.properties"/><!--配置数据源c3p0--><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driver}"/><property name="jdbcUrl" value="${jdbc.url}"/><property name="user" value="${jdbc.user}"/><property name="password" value="${jdbc.password}"/></bean><!--配置JdbcTemplate--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean></beans>
这里使用了c3p0数据源
C3P0有自动回收空闲连接功能;
dbcp没有自动回收空闲连接功能;
4、使用spring jdbc完成crud操作
package com.shsxt;import com.shsxt.po.Account; import com.sun.xml.internal.bind.v2.model.core.ID; import org.apache.commons.lang3.StringUtils; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository;import javax.annotation.Resource; import javax.lang.model.element.Name; import java.math.BigDecimal; import java.sql.*; import java.util.ArrayList; import java.util.List; @Repository public class AccountDaoImpl implements AccountDao {@Resourceprivate JdbcTemplate jdbcTemplate;/*** 添加记录返回受影响行数* @param account* @return*/@Overridepublic Integer saveAccount(Account account) {String sql="insert into account (name,type,money,remark,create_time,update_time,userId) values(?,?,?,?,?,?,?)";return jdbcTemplate.update(sql,account.getName(),account.getType(),account.getMoney(),account.getRemark(),account.getCreate_time(),account.getUpdate_time(),account.getUserId());}/*** 添加记录返回主键* @param account* @return*/@Overridepublic Integer saveAccountHasPrimaryKey(Account account) {String sql="insert into account (name,type,money,remark,create_time,update_time,userId) values(?,?,?,?,?,?,?)";KeyHolder keyHolder=new GeneratedKeyHolder();jdbcTemplate.update(new PreparedStatementCreator() {@Overridepublic PreparedStatement createPreparedStatement(Connection con) throws SQLException {PreparedStatement ps=con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);ps.setString(1,account.getName());ps.setString(2,account.getType());ps.setBigDecimal(3,account.getMoney());ps.setString(4,account.getRemark());ps.setObject(5,account.getCreate_time());ps.setObject(6,account.getUpdate_time());ps.setInt(7,account.getUserId());return ps;}},keyHolder);return keyHolder.getKey().intValue();}/*** 批量添加记录* @param accounts* @return*/@Overridepublic Integer saveAccountsBatch(List<Account> accounts) {String sql="insert into account (name,type,money,remark,create_time,update_time,userId) values(?,?,?,?,?,?,?)";return jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {@Overridepublic void setValues(PreparedStatement ps, int i) throws SQLException {ps.setString(1,accounts.get(i).getName());ps.setString(2,accounts.get(i).getType());ps.setBigDecimal(3,accounts.get(i).getMoney());ps.setString(4,accounts.get(i).getRemark());ps.setObject(5,accounts.get(i).getCreate_time());ps.setObject(6,accounts.get(i).getUpdate_time());ps.setInt(7,accounts.get(i).getUserId());}@Overridepublic int getBatchSize() {return accounts.size();}}).length;}/*** 统计账户记录-聚合查询* @param userId* @return*/@Overridepublic Integer countAccountsByUserId(Integer userId) {String sql="select count(1) from account where userId=?";return jdbcTemplate.queryForObject(sql,Integer.class,userId);}/*** 根据id查询记录详情* @param Id* @return*/@Overridepublic Account queryAccountById(Integer Id) {String sql="select id,userId,name,type,money,remark,update_time,create_time from account where id=?";return (Account) jdbcTemplate.queryForObject(sql,new Object[]{Id}, new RowMapper<Account>() {@Overridepublic Account mapRow(ResultSet rs, int rowNum) throws SQLException {Account account=new Account();account.setUpdate_time(rs.getDate("update_time"));account.setRemark(rs.getString("remark"));account.setType(rs.getString("type"));account.setMoney(rs.getBigDecimal("money"));account.setCreate_time(rs.getDate("create_time"));account.setId(rs.getInt("id"));account.setName(rs.getString("name"));account.setUserId(rs.getInt("userId"));return account;}});}/*** 多条件查询* @param userId* @param type* @param createTime* @param aname* @return*/@Overridepublic List<Account> queryAccountsByParams(Integer userId, String type, String createTime, String aname) {StringBuffer sql=new StringBuffer("select id,userId,name,type,money,remark,update_time,create_time from account where 1=1");List<Object> params=new ArrayList<>();if (null!=userId){sql.append(" and userId=?");params.add(userId);}if (StringUtils.isNotBlank(type)){sql.append(" and type=? ");params.add(type);}if (StringUtils.isNotBlank(createTime)){sql.append(" and createTime=?");params.add(createTime);}if (StringUtils.isNotBlank(aname)){sql.append(" and name=?");params.add(aname);}return jdbcTemplate.query(sql.toString(), params.toArray(), new RowMapper<Account>() {@Overridepublic Account mapRow(ResultSet rs, int rowNum) throws SQLException {Account account=new Account();account.setId(rs.getInt("id"));account.setUserId(rs.getInt("userId"));account.setName(rs.getString("name"));account.setCreate_time(rs.getDate("create_time"));account.setMoney(rs.getBigDecimal("money"));account.setType(rs.getString("type"));account.setRemark(rs.getString("remark"));account.setUpdate_time(rs.getDate("update_time"));return account;}});}@Overridepublic Integer updateAccount(Account account) {String sql="update account set name=?,type=?,money=? where id=?";return jdbcTemplate.update(sql,account.getName(),account.getType(),account.getMoney(),account.getId());}/*** 批量更新* @param accounts* @return*/@Overridepublic Integer updateAccountsBatch(List<Account> accounts) {String sql="update account set name=?,type=?,money=? where id=?";return jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {@Overridepublic void setValues(PreparedStatement ps, int i) throws SQLException {ps.setString(1,accounts.get(i).getName());ps.setString(2,accounts.get(i).getType());ps.setBigDecimal(3,accounts.get(i).getMoney());ps.setInt(4,accounts.get(i).getId());}@Overridepublic int getBatchSize() {return accounts.size();}}).length;}/*** 根据id删除记录* @param id* @return*/@Overridepublic Integer deleteAccountById(Integer id) {String sql="delete from account where id=?";return jdbcTemplate.update(sql,id);}/*** 批量删除* @param ids* @return*/@Overridepublic Integer deleteAccountsBatch(Integer[] ids) {String sql="delete from account where id=?";return jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {@Overridepublic void setValues(PreparedStatement ps, int i) throws SQLException {ps.setInt(1,ids[i]);}@Overridepublic int getBatchSize() {return ids.length;}}).length;}@Overridepublic Integer inMoney(Integer sourceId, BigDecimal money) {String sql="update account set money=money-? where id=?";return jdbcTemplate.update(sql,money,sourceId);}@Overridepublic Integer outMoney(Integer targetId, BigDecimal money) {String sql="update account set money=money+? where id=?";return jdbcTemplate.update(sql,money,targetId);} }
crud
二、spring事务
1、事务的四大特性(ACID)
原子性(Atomicity):共生死,要么全部成功,要么全部失败
一致性(Consistency):事务在执行前后,数据库中数据要保持一致性状态
隔离性(Lsolation):事务与事务之间的执行应当是相互隔离互不影响的
持久性(Durability):事务提交完毕后,数据库中的数据的改变是永久的
2、事务配置
1)、添加坐标依赖
aop、spring事务
2)、XML配置
修改xml命名空间
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
<!--aop代理--><aop:aspectj-autoproxy/><!--事务配置--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--事务通知配置--><tx:advice id="txAdvice" transaction-manager="txManager"><tx:attributes><!--配置事务要拦截的方法--><tx:method name="save*" propagation="REQUIRED"/><tx:method name="update*" propagation="REQUIRED"/><tx:method name="del*" propagation="REQUIRED"/></tx:attributes></tx:advice><!--aop切面定义--><aop:config><aop:pointcut id="cut" expression="execution(* com.shsxt.service..*.*(..))"></aop:pointcut><aop:advisor advice-ref="txAdvice" pointcut-ref="cut"/></aop:config><!--注解方式配置事务,可以和xml配置共同使用--><tx:annotation-driven transaction-manager="txManager"/>
3)、注解使用事务,xml配置后在方法上添加注解
4)、事务传播行为
三、远程方法调用RMI
Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。 JVM 可以位于相同或不同计算机上,在多个 JVM 中,一个 JVM 可以调用存储在其它 JVM 的对象的方法。
具体实现先不写了,我还没弄清楚。待修改
转载于:https://www.cnblogs.com/dhome/p/9727137.html
Spring-整合JDBC-事务-远程方法调用RMI相关推荐
- 系统间通信2:通信管理与远程方法调用RMI
本文引用 : https://yinwj.blog.csdn.net/article/details/49120813 RMI : Remote Method Invocation,远程方法调用 RP ...
- java中使用rmi进行远程方法调用
java中进行远程方法调用,能支持分布式计算.并且可以实现在server的修改,能反应到各个client. 假如server的ip是:192.168.11.2, server端的代码如下: /*** ...
- Spring事务内方法调用自身事务
Spring事务内方法调用自身事务 增强的三种方式 ServiceA.java文件: 查看Spring Tx的相关日志: 可以看到只创建了一个事物ServiceA.service方法的事务,但是cal ...
- Spring4.x()--Spring整合Jdbc的HelloWorld
Spring整合Jdbc的HelloWorld 一.JdbcTemplate概述 它是spring框架中提供的一个对象,是对原始Jdbc API对象的简单封装.spring框架为我们提供了很多的操作模 ...
- Spring声明式事务配置管理方法
/*2011年8月28日 10:03:30 by Rush */ 环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加 ...
- spring整合jdbc
spring整合jdbc 在pom.xml文件中导入依赖: <!-- 阿里数据源 --> <dependency><groupId>com.alibaba</ ...
- spring整合JDBC 实现拦截器用户的登录和注册的案例源代码及解析
前言:为了大家学习的方便,我自己完成了一个登录注册的小案例供大家参考,如有疑问?请私信博主,小主辛苦总结,望大家转载请标明出处. **项目介绍:**本项目使用的是spring整合jdbc实现用户的登录 ...
- XML-RPC远程方法调用
一.简介 XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用. 它是一套允许运行在不同操作系统.不同环境的程序实现基于Internet过程调用的规范和一系列 ...
- Spring4.x()--Spring的Jdbc事务-零配置
Spring的Jdbc事务-零配置 一.拷贝必要的jar包到工程的lib目录 二.准备数据库表和实体类 创建数据库: create database spring; use spring; 创建表: ...
最新文章
- 2021年大数据Spark(十一):应用开发基于IDEA集成环境
- WinAPI: PtInRect - 判断点是否在矩形中
- linux ftp 命令集合
- 分享一个ASP.NET 文件压缩解压类 C#
- 快速筛选数据集中某列特征符合某种规律的所有数据集
- 『设计模式』难道你现在还不知道:C/S和B/S
- 01.HTML基础命令笔记
- sas数据导入终极汇总-之一
- QT5新建工程错误-无法打开源文件QtWidgets/QApplication
- [Java] 蓝桥杯BASIC-27 基础练习 2n皇后问题
- python基础系列教程——Python3.x标准模块库目录
- 突然发现foxmail原来是腾讯的
- mock模拟接口测试_Python接口测试之mock(上)
- 贾俊平统计学第七版笔记和课后答案
- c语言十六进制字符串求和,一串十六进制求和软件 两个十六进制怎么相加的
- ResponseEntity返回图片,下载图片
- 南邮 OJ 1160 繁杂的道路
- P4379 [USACO18OPEN]Lemonade Line
- Libvirt同步机制 —— 实现原理
- 深入学习Java:关于List下标越界源码分析