一、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相关推荐

  1. 系统间通信2:通信管理与远程方法调用RMI

    本文引用 : https://yinwj.blog.csdn.net/article/details/49120813 RMI : Remote Method Invocation,远程方法调用 RP ...

  2. java中使用rmi进行远程方法调用

    java中进行远程方法调用,能支持分布式计算.并且可以实现在server的修改,能反应到各个client. 假如server的ip是:192.168.11.2, server端的代码如下: /*** ...

  3. Spring事务内方法调用自身事务

    Spring事务内方法调用自身事务 增强的三种方式 ServiceA.java文件: 查看Spring Tx的相关日志: 可以看到只创建了一个事物ServiceA.service方法的事务,但是cal ...

  4. Spring4.x()--Spring整合Jdbc的HelloWorld

    Spring整合Jdbc的HelloWorld 一.JdbcTemplate概述 它是spring框架中提供的一个对象,是对原始Jdbc API对象的简单封装.spring框架为我们提供了很多的操作模 ...

  5. Spring声明式事务配置管理方法

    /*2011年8月28日 10:03:30 by Rush  */ 环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加 ...

  6. spring整合jdbc

    spring整合jdbc 在pom.xml文件中导入依赖: <!-- 阿里数据源 --> <dependency><groupId>com.alibaba</ ...

  7. spring整合JDBC 实现拦截器用户的登录和注册的案例源代码及解析

    前言:为了大家学习的方便,我自己完成了一个登录注册的小案例供大家参考,如有疑问?请私信博主,小主辛苦总结,望大家转载请标明出处. **项目介绍:**本项目使用的是spring整合jdbc实现用户的登录 ...

  8. XML-RPC远程方法调用

    一.简介 XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用. 它是一套允许运行在不同操作系统.不同环境的程序实现基于Internet过程调用的规范和一系列 ...

  9. Spring4.x()--Spring的Jdbc事务-零配置

    Spring的Jdbc事务-零配置 一.拷贝必要的jar包到工程的lib目录 二.准备数据库表和实体类 创建数据库: create database spring; use spring; 创建表: ...

最新文章

  1. 2021年大数据Spark(十一):应用开发基于IDEA集成环境
  2. WinAPI: PtInRect - 判断点是否在矩形中
  3. linux ftp 命令集合
  4. 分享一个ASP.NET 文件压缩解压类 C#
  5. 快速筛选数据集中某列特征符合某种规律的所有数据集
  6. 『设计模式』难道你现在还不知道:C/S和B/S
  7. 01.HTML基础命令笔记
  8. sas数据导入终极汇总-之一
  9. QT5新建工程错误-无法打开源文件QtWidgets/QApplication
  10. [Java] 蓝桥杯BASIC-27 基础练习 2n皇后问题
  11. python基础系列教程——Python3.x标准模块库目录
  12. 突然发现foxmail原来是腾讯的
  13. mock模拟接口测试_Python接口测试之mock(上)
  14. 贾俊平统计学第七版笔记和课后答案
  15. c语言十六进制字符串求和,一串十六进制求和软件 两个十六进制怎么相加的
  16. ResponseEntity返回图片,下载图片
  17. 南邮 OJ 1160 繁杂的道路
  18. P4379 [USACO18OPEN]Lemonade Line
  19. Libvirt同步机制 —— 实现原理
  20. 深入学习Java:关于List下标越界源码分析

热门文章

  1. android 人脸检测_Android人脸检测
  2. linux ping 命令_Linux ping命令示例
  3. java des算法_Java DES算法程序
  4. 苹果x翻新机序列号开头_Android翻新电话每隔X秒
  5. Java架构师具备的特点有哪些?
  6. C++进阶教程之异常如何处理
  7. 开课吧课堂之如何使用多重catch语句
  8. 【东师软工】第二次成绩排行榜
  9. Python实战之SocketServer模块
  10. Redis bind用法