lombok插件 XML
XML<!-- 加载资源文件 --> <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.添加坐标
XML<!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.26</version> </dependency> </dependencies>
3.编写注解 dbUtil-阿帕奇提供操作数据库的插件 核心类:QueryRunner .query() 查询 .update() 增删改
java//操作数据库的核心类 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(),"update account 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(); } }
XML<!-- 注入QueryRunner --> <bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner"> <constructor-arg name="ds" ref="dataSource"></constructor-arg> </bean>
junit测试 使用步骤: 1.坐标
XML单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
2.注解(修饰方法) @Test======>可以运行的方法 @Before====>@Test运行之前 @After=====>@Test运行之后
javapublic 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); } } }注解
XML<!-- 加载资源文件 --> <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>配置工具
项目总结: 1.事务管理应该由service层进行实现 代码优化: 目的:业务层进行事务管理
javapublic 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对象
javapublic 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
XML<!-- 事务工具类 --> <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.通过连接对象进行事务的统一管理
javapublic 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);//保存 } return connection; } catch (SQLException throwables) { throwables.printStackTrace(); } return null; } //移除连接 public void removeCon(){ threadLocal.remove();//一处连接对象 } }
javapublic 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(); } } }
SpringIOC和SpringAOC
小白nn2024-08-13 18:02
相关推荐
天若有情6731 小时前
【java EE】IDEA 中创建或迁移 Spring 或 Java EE 项目的核心步骤和注意事项钱多多_qdd4 小时前
基础篇:IoC(三):Bean实例化策略InstantiationStrategy安冬的码畜日常7 小时前
【JUnit实战3_27】第十六章:用 JUnit 测试 Spring 应用:通过实战案例深入理解 IoC 原理敲代码的嘎仔8 小时前
JavaWeb零基础学习Day6——JDBC程序猿小蒜11 小时前
基于springboot的校园社团信息管理系统开发与设计兔兔爱学习兔兔爱学习11 小时前
Spring Al学习9:模型上下文协议(MCP)m0_7482480211 小时前
Spring MVC中@RequestMapping注解的全面解析Kay_Liang13 小时前
Spring中@Controller与@RestController核心解析行思理13 小时前
Spring MVC 注释新手教程朝新_14 小时前
【SpringBoot】玩转 Spring Boot 日志:级别划分、持久化、格式配置及 Lombok 简化使用






