• 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 的对象的方法。

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

  • 相关阅读:
    Nginx:缓存
    Nginx:静态资源压缩
    Cassandra:安装
    Cassandra:java客户端操作
    Postgresql:Centos7安装Postgresql
    Cassandra:cql基本操作
    Cassandra:cqlsh基本命令和cql
    Cassandra:基本概念
    Nginx:rewrite功能配置
    Nginx:负载均衡
  • 原文地址:https://www.cnblogs.com/dhome/p/9727137.html
Copyright © 2020-2023  润新知