zoukankan      html  css  js  c++  java
  • 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/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://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 {
        @Resource
        private JdbcTemplate jdbcTemplate;
    
        /**
         * 添加记录返回受影响行数
         * @param account
         * @return
         */
        @Override
        public 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
         */
        @Override
        public 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() {
                @Override
                public 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
         */
        @Override
        public 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() {
                @Override
                public 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());
                }
    
                @Override
                public int getBatchSize() {
                    return accounts.size();
                }
            }).length;
        }
    
        /**
         * 统计账户记录-聚合查询
         * @param userId
         * @return
         */
        @Override
        public Integer countAccountsByUserId(Integer userId) {
            String sql="select count(1) from account where userId=?";
            return jdbcTemplate.queryForObject(sql,Integer.class,userId);
        }
    
        /**
         * 根据id查询记录详情
         * @param Id
         * @return
         */
        @Override
        public 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>() {
                @Override
                public 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
         */
        @Override
        public 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>() {
    
                @Override
                public 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;
                }
            });
    
        }
    
        @Override
        public 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
         */
        @Override
        public Integer updateAccountsBatch(List<Account> accounts) {
            String sql="update account set name=?,type=?,money=? where id=?";
            return jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
                @Override
                public 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());
                }
    
                @Override
                public int getBatchSize() {
                    return accounts.size();
                }
            }).length;
        }
    
        /**
         * 根据id删除记录
         * @param id
         * @return
         */
        @Override
        public Integer deleteAccountById(Integer id) {
            String sql="delete from account where id=?";
            return jdbcTemplate.update(sql,id);
        }
    
        /**
         * 批量删除
         * @param ids
         * @return
         */
        @Override
        public Integer deleteAccountsBatch(Integer[] ids) {
            String sql="delete from account where id=?";
            return jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
                @Override
                public void setValues(PreparedStatement ps, int i) throws SQLException {
                    ps.setInt(1,ids[i]);
                }
    
                @Override
                public int getBatchSize() {
                    return ids.length;
                }
            }).length;
        }
    
        @Override
        public Integer inMoney(Integer sourceId, BigDecimal money) {
            String sql="update account set money=money-? where id=?";
            return jdbcTemplate.update(sql,money,sourceId);
        }
    
        @Override
        public 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 的对象的方法。

      具体实现先不写了,我还没弄清楚。待修改

  • 相关阅读:
    【Java EE 学习 81】【CXF框架】【CXF整合Spring】
    【Java EE 学习 80 下】【调用WebService服务的四种方式】【WebService中的注解】
    【Java EE 学习 80 上】【WebService】
    【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】
    【Java EE 学习 79 上】【mybatis 基本使用方法】
    【Java EE 学习 78 下】【数据采集系统第十天】【数据采集系统完成】
    【Java EE 学习 78 中】【数据采集系统第十天】【Spring远程调用】
    【Java EE 学习 78 上】【数据采集系统第十天】【Service使用Spring缓存模块】
    【Java EE 学习 77 下】【数据采集系统第九天】【使用spring实现答案水平分库】【未解决问题:分库查询问题】
    【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】
  • 原文地址:https://www.cnblogs.com/dhome/p/9727137.html
Copyright © 2011-2022 走看看