石小疯 发表于 2024-8-12 05:17:15

SpringIOC和SpringAOC

lombok插件
<strong>XML</strong>

    <!-- 加载资源文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>

    <!-- 注入数据源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
      <property name="driverClass" value="${msg1}"></property>
      <property name="jdbcUrl" value="${msg2}"></property>
      <property name="user" value="${msg3}"></property>
      <property name="password" value="${msg4}"></property>
    </bean>

    <!-- 注入QueryRunner -->
    <bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
      <constructor-arg name="ds" ref="dataSource"></constructor-arg>
    </bean>

    <!-- 连接工具类 -->
    <bean id="connectionUtil" class="com.xn.util.ConnectionUtil">
      <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 事务工具类 -->
    <bean id="transactionUtil" class="com.xn.util.TransactionUtil">
      <property name="connectionUtil" ref="connectionUtil"/>
    </bean>

    <!-- 注入dao -->
    <bean id="mapperImp" class="com.xn.dao.AccountMapperImp">
      <property name="queryRunner" ref="queryRunner"></property>
      <property name="connectionUtil" ref="connectionUtil"></property>
    </bean>

    <!-- 注入service -->
    <bean id="service" class="com.xn.service.AccountServiceImp">
      <property name="mapper" ref="mapperImp"/>
      <property name="transactionUtil" ref="transactionUtil"></property>
    </bean>

    <!-- 注入controller -->
    <bean id="controller" class="com.xn.controller.AccountControllerImp">
      <property name="service" ref="service"/>
    </bean>功能:对实体类自动,动态生成getset,无参有参.....
步骤:
    1.idea安装插件(只做一次)


    2.添加坐标
   <!-- lombok -->
      <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.26</version>
      </dependency>
    </dependencies>
   3.编写注解

dbUtil-阿帕奇提供操作数据库的插件
核心类:QueryRunner
            .query()查询
            .update() 增删改

    //操作数据库的核心类
    QueryRunner queryRunner;

    public void setQueryRunner(QueryRunner queryRunner) {
      this.queryRunner = queryRunner;
    }



@Override
    public void save(Account account) {
      try {
            queryRunner.update(connectionUtil.createCon(),"insert into account(aname,amoney) value(?,?)",account.getAname(),account.getAmoney());
      } catch (SQLException throwables) {
            throwables.printStackTrace();
      }
    }



@Override
    public void updateById(Account account) {
      try {
            queryRunner.update(connectionUtil.createCon(),"updateaccount set aname=?,amoney=? where aid=?",account.getAname(),account.getAmoney(),account.getAid());
      } catch (SQLException throwables) {
            throwables.printStackTrace();
      }
    }

    @Override
    public void deleteById(int id) {
      try {
            queryRunner.update(connectionUtil.createCon(),"delete from account where aid=?",id);
      } catch (SQLException throwables) {
            throwables.printStackTrace();
      }
    } <!-- 注入QueryRunner -->
    <bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
      <constructor-arg name="ds" ref="dataSource"></constructor-arg>
    </bean>
junit测试
使用步骤:
    1.坐标
   单元测试-->
      <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
      </dependency>   2.注解(修饰方法)
      @Test======>可以运行的方法
      @Before====>@Test运行之前
      @After=====>@Test运行之后public class Test01 {
    ClassPathXmlApplicationContext applicationContext=null;
    IAccountController controller=null;

    @Before
    public void beforeMethod(){
      applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
      controller = (IAccountController) applicationContext.getBean("controller");
    }


    @After
    public void afterMethod(){
      applicationContext.close();
    }


    @Test
    public void show1(){
      controller.save(new Account("林航宇",2000));
      controller.save(new Account("杨文琪",2000));
    }

    @Test
    public void show2(){
      List<Account> all = controller.findAll();
      for (int i = 0; i < all.size(); i++) {
            Account account =all.get(i);
            System.out.println(account);
      }
    }

}
注解
<!-- 加载资源文件 -->    <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>    <!-- 注入数据源 -->    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">      <property name="driverClass" value="${msg1}"></property>      <property name="jdbcUrl" value="${msg2}"></property>      <property name="user" value="${msg3}"></property>      <property name="password" value="${msg4}"></property>    </bean>    <!-- 注入QueryRunner -->
    <bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
      <constructor-arg name="ds" ref="dataSource"></constructor-arg>
    </bean>
    <context:component-scan base-package="com.xn"></context:component-scan></beans>https://i-blog.csdnimg.cn/direct/3cf9378e50694324b3a68972e943e9c2.png
https://i-blog.csdnimg.cn/direct/ab4d65f4f1b74d908ba5f27c91ccea19.png
https://i-blog.csdnimg.cn/direct/da16c47f33d74e06923f3782deef7af0.png
https://i-blog.csdnimg.cn/direct/f69b2393f2a049bd9e3912ce08db1b1b.png
设置工具
https://i-blog.csdnimg.cn/direct/7befa98f79a74c9f98c3efe660e2e339.png
https://i-blog.csdnimg.cn/direct/ce2aae30df3c413f9823c3654d7bab44.png
https://i-blog.csdnimg.cn/direct/ff4c91ef2c60444f98c67971b3500213.png
https://i-blog.csdnimg.cn/direct/bc48a6628a634f7fa28256648b294051.png
   
项目总结:
    1.事务管理应该由service层进行实现
代码优化:
    目的:业务层进行事务管理
public class AccountServiceImp implements IAccountService{

    IAccountMapper mapper;

    public void setMapper(IAccountMapper mapper) {
      this.mapper = mapper;
    }

    //装配
    TransactionUtil transactionUtil;

    public void setTransactionUtil(TransactionUtil transactionUtil) {
      this.transactionUtil = transactionUtil;
    }

    @Override
    public void transfer(String sourceName, String targetName, int money) {

      try {
            transactionUtil.beginTx();

            //查询数据
            Account sourceAccount=mapper.findByName(sourceName);
            Account targetAccount=mapper.findByName(targetName);

            //转账
            sourceAccount.setAmoney(sourceAccount.getAmoney()-money);
            targetAccount.setAmoney(targetAccount.getAmoney()+money);

            //修改数据库
            mapper.updateById(sourceAccount);
//            int a=10/0;//模拟异常
            mapper.updateById(targetAccount);

            transactionUtil.commitTx();

      } catch (Exception e) {
            e.printStackTrace();
            transactionUtil.rollbackTx();
      } finally {
            transactionUtil.closeTx();
      }
    }    1.同一个业务方法的多个dao方法公用一个connection对象
public class AccountMapperImp implements IAccountMapper{

    //操作数据库的核心类
    QueryRunner queryRunner;

    public void setQueryRunner(QueryRunner queryRunner) {
      this.queryRunner = queryRunner;
    }

    //注入连接工具类
   ConnectionUtil connectionUtil;

    public void setConnectionUtil(ConnectionUtil connectionUtil) {
      this.connectionUtil = connectionUtil;
    }


    @Override
    public void save(Account account) {
      try {
            queryRunner.update(connectionUtil.createCon(),"insert into account(aname,amoney) value(?,?)",account.getAname(),account.getAmoney());
      } catch (SQLException throwables) {
            throwables.printStackTrace();
      }
    }
   2.ThreadLocal
<!-- 事务工具类 -->
    <bean id="transactionUtil" class="com.xn.util.TransactionUtil">
      <property name="connectionUtil" ref="connectionUtil"/>
    </bean>

    <!-- 注入dao -->
    <bean id="mapperImp" class="com.xn.dao.AccountMapperImp">
      <property name="queryRunner" ref="queryRunner"></property>
      <property name="connectionUtil" ref="connectionUtil"></property>
    </bean>

    <!-- 注入service -->
    <bean id="service" class="com.xn.service.AccountServiceImp">
      <property name="mapper" ref="mapperImp"/>
      <property name="transactionUtil" ref="transactionUtil"></property>
    </bean>    3.通过连接对象进行事务的统一管理public class ConnectionUtil {
    //装配数据源
    DataSource dataSource;

    public void setDataSource(DataSource dataSource) {
      this.dataSource = dataSource;
    }

    //线程区域对象
    ThreadLocal<Connection> threadLocal=new ThreadLocal<Connection>();

    //获取连接
    public Connection createCon(){

      try {
            //获取线程内的连接对象
            Connection connection=threadLocal.get();
            //判断
            if(connection==null){
                connection=dataSource.getConnection();//创建连接
                threadLocal.set(connection);//保存
            }
            returnconnection;
      } catch (SQLException throwables) {
            throwables.printStackTrace();
      }

      return null;
    }

    //移除连接
    public void removeCon(){
      threadLocal.remove();//一处连接对象
    }
}
public class TransactionUtil {
    //注入连接工具类
    ConnectionUtil connectionUtil;

    public void setConnectionUtil(ConnectionUtil connectionUtil) {
      this.connectionUtil = connectionUtil;
    }

    //开启事务
    public void beginTx(){
      try {
            connectionUtil.createCon().setAutoCommit(false);

      } catch (SQLException throwables) {
            throwables.printStackTrace();
      }
    }

    //提交事务
    public void commitTx(){
      try {
            connectionUtil.createCon().commit();
      } catch (SQLException throwables) {
            throwables.printStackTrace();
      }
    }

    //回滚事务
    public void rollbackTx(){
      try {
            connectionUtil.createCon().rollback();
      } catch (SQLException throwables) {
            throwables.printStackTrace();
      }
    }

    //关闭事务
    public void closeTx(){
      try {
            connectionUtil.createCon().close();
            connectionUtil.removeCon();
      } catch (SQLException throwables) {
            throwables.printStackTrace();
      }
    }

}


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: SpringIOC和SpringAOC