杭州网站建设优化案例,用什么网站可以做,网页网站开发,wordpress可视化函数目录 一、xml方式实现
1.介绍lombok插件
2.功能
3.步骤
3.1 idea安装插件(只做一次)
3.2 添加坐标
3.3 编写注解
4.核心类
4.1 QueryRunner
4.2 query() 查询
4.3 update() 增删改
5.配置文件applicationContext.xml
6.junit测试
6.1使用步骤
6.1.1 坐标
6.1.2…目录 一、xml方式实现
1.介绍lombok插件
2.功能
3.步骤
3.1 idea安装插件(只做一次)
3.2 添加坐标
3.3 编写注解
4.核心类
4.1 QueryRunner
4.2 query() 查询
4.3 update() 增删改
5.配置文件applicationContext.xml
6.junit测试
6.1使用步骤
6.1.1 坐标
6.1.2 注解(修饰方法)
二、annotation注解方式实现
1.控制层(cotroller)
2.业务层(service)
3.数据访问层(dao)
4.配置文件applicationContext.xml
三、configuration配置类方式实现
1.ApplicationConfig
2.DataConfig 替换applicationContext.xml
3.测试类
四、在xml基础上实现转账业务
1.同一个业务方法的多个dao方法公用一个connection对象
2.ThreadLocal
3.通过连接对象进行事务的统一管理
5.项目总结 一、xml方式实现
1.介绍lombok插件
dbUtil-阿帕奇提供操作数据库的插件
2.功能
对实体类自动动态生成getset无参有参 toString.....
3.步骤
3.1 idea安装插件(只做一次) 3.2 添加坐标
!--lombok--
dependency
groupIdorg.projectlombok/groupId
artifactIdlombok/artifactId
version1.18.26/version
/dependency
3.3 编写注解
NoArgsConstructor
AllArgsConstructor
Data
public class Account implements Serializable {private int aid;private String aname;private int amoney;public Account(String aname, int amoney) {this.aname aname;this.amoney amoney;}
}
4.核心类
4.1 QueryRunner
//操作数据库的核心类QueryRunner queryRunner;public void setQueryRunner(QueryRunner queryRunner) {this.queryRunner queryRunner;}4.2 query() 查询
Overridepublic void save(Account account) {try {queryRunner.update(insert into account(aname,amoney) value(?,?),account.getAname(),account.getAmoney());} catch (SQLException throwables) {throwables.printStackTrace();}}
Override
public void updateById(Account account) {try {queryRunner.update(udpate 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(delete from account where aid?,id);} catch (SQLException throwables) {throwables.printStackTrace();}
}
4.3 update() 增删改
Override
public Account findByName(String name) {try {return queryRunner.query(select * from account where aname?,new BeanHandlerAccount(Account.class),name);} catch (SQLException throwables) {throwables.printStackTrace();}return null;
}Override
public ListAccount findAll() {try {return queryRunner.query(select * from account,new BeanListHandlerAccount(Account.class));} catch (SQLException throwables) {throwables.printStackTrace();}return null;
}5.配置文件applicationContext.xml
!--加载资源文件--context:property-placeholder locationjdbc.properties/context:property-placeholder!--注入数据源--bean iddataSource classcom.mchange.v2.c3p0.ComboPooledDataSourceproperty namedriverClass value${msg1}/propertyproperty namejdbcUrl value${msg2}/propertyproperty nameuser value${msg3}/propertyproperty namepassword value${msg4}/property/bean!--注入QueryRunner--bean idqueryRunner classorg.apache.commons.dbutils.QueryRunnerconstructor-arg nameds refdataSource/constructor-arg/bean!--注入dao--bean idmapperImp classcom.ztt.dao.AccountMapperImpproperty namequeryRunner refqueryRunner/property/bean!--注入service--bean idservice classcom.ztt.service.AccountServiceImpproperty namemapper refmapperImp/property/bean!--注入controller--bean idcontroller classcom.ztt.controller.AccountControllerImpproperty nameservice refservice/property/bean
6.junit测试
6.1使用步骤
6.1.1 坐标
!--单元测试--
dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope
/dependency
!--数据源--dependencygroupIdc3p0/groupIdartifactIdc3p0/artifactIdversion0.9.1.2/version
/dependency
6.1.2 注解(修饰方法)
Test可以运行的方法
BeforeTest运行之前
AfterTest运行之后
方式一
public class Test01 {ClassPathXmlApplicationContext applicationContext null;IAccountController controller null;Beforepublic void beforeMethod(){applicationContext new ClassPathXmlApplicationContext(applicationContext.xml);controller (IAccountController) applicationContext.getBean(controller);}Afterpublic void afterMethod(){applicationContext.close();}Testpublic void show1(){controller.save(new Account(张甜甜,2000));controller.save(new Account(许娜,2000));}Testpublic void show2(){ListAccount all controller.findAll();for (int i 0; i all.size(); i) {Account account all.get(i);System.out.println(account);}}}
方式二
RunWith(SpringJUnit4ClassRunner.class)
ContextConfiguration(locations classpath:applicationContext.xml)
public class Test02 {AutowiredIAccountController controller;Testpublic void show1(){controller.save(new Account(张甜甜,2000));controller.save(new Account(许娜,2000));}Testpublic void show2(){ListAccount all controller.findAll();for (int i 0; i all.size(); i) {Account account all.get(i);System.out.println(account);}}Testpublic void show3(){controller.transfer(张甜甜,许娜,100);}
}二、annotation注解方式实现
1.控制层(cotroller)
Controller(controller)
public class AccountControllerImp implements IAccountController {AutowiredIAccountService service;
2.业务层(service)
Service
public class AccountServiceImp implements IAccountService{AutowiredIAccountMapper mapper;
3.数据访问层(dao)
Repository
public class AccountMapperImp implements IAccountMapper{//操作数据库的核心类AutowiredQueryRunner queryRunner;
4.配置文件applicationContext.xml
!--加载资源文件--context:property-placeholder locationclasspath:jdbc.properties/context:property-placeholder!--注入数据源--bean iddataSource classcom.mchange.v2.c3p0.ComboPooledDataSourceproperty namedriverClass value${msg1}/propertyproperty namejdbcUrl value${msg2}/propertyproperty nameuser value${msg3}/propertyproperty namepassword value${msg4}/property/bean!--注入QueryRunner--bean idqueryRunner classorg.apache.commons.dbutils.QueryRunnerconstructor-arg nameds refdataSource/constructor-arg/bean!--扫描--context:component-scan base-packagecom.ztt/context:component-scan
测试类同上
三、configuration配置类方式实现
在三层框架的基础上新建一个包config,用来写配置类
1.ApplicationConfig
Configuration
ComponentScan(basePackages com.ztt)
Import(DataConfig.class)
public class ApplicationConfig {
}
2.DataConfig 替换applicationContext.xml
Configuration
PropertySource(value classpath:jdbc.properties)
public class DataConfig {Value(${msg1})private String driverClass;Value(${msg2})private String jdbcUrl;Value(${msg3})private String user;Value(${msg4})private String password;// bean iddataSource classcom.mchange.v2.c3p0.ComboPooledDataSource
// property namedriverClass value${msg1}/property
// property namejdbcUrl value${msg2}/property
// property nameuser value${msg3}/property
// property namepassword value${msg4}/property
// /beanBeanpublic DataSource dataSource(){try {ComboPooledDataSource comboPooledDataSource new ComboPooledDataSource();comboPooledDataSource.setDriverClass(driverClass);comboPooledDataSource.setJdbcUrl(jdbcUrl);comboPooledDataSource.setUser(user);comboPooledDataSource.setPassword(password);return comboPooledDataSource;} catch (PropertyVetoException e) {e.printStackTrace();}return null;}// bean idqueryRunner classorg.apache.commons.dbutils.QueryRunner
// constructor-arg nameds refdataSource/constructor-arg
// /beanBeanpublic QueryRunner queryRunner(){return new QueryRunner(dataSource());}}3.测试类 四、在xml基础上实现转账业务
目的业务层进行事务管理
1.同一个业务方法的多个dao方法公用一个connection对象
2.ThreadLocal
3.通过连接对象进行事务的统一管理
ConnectionUtil连接工具类
public class ConnectionUtil {//装配数据源DataSource dataSource;public void setDataSource(DataSource dataSource) {this.dataSource dataSource;}//线程区域对象ThreadLocalConnection threadLocalnew ThreadLocalConnection();//获取连接public Connection createCon(){Connection connection null;try {//1.获取线程内的连接对象connectionthreadLocal.get();//2.判断if(connectionnull){connectiondataSource.getConnection();//创建连接threadLocal.set(connection);//保存}return connection;} catch (SQLException throwables) {throwables.printStackTrace();}return connection;}//移除连接public void removeCon(){threadLocal.remove();//移除连接}}TransactionUtil事务管理工具类
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();}}
}AccountMapperImp
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;} AccountServiceImp
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;}Overridepublic void transfer(String sourceName, String targetName, int money) {try {transactionUtil.beginTx();//1.查询数据Account sourceAccount mapper.findByName(sourceName);Account targetAccount mapper.findByName(sourceName);//2.转账sourceAccount.setAmoney(sourceAccount.getAmoney()-money);targetAccount.setAmoney(targetAccount.getAmoney()money);//3.修改数据库mapper.updateById(sourceAccount);int a10/0;//模拟异常mapper.updateById(targetAccount);transactionUtil.commitTx();} catch (Exception e) {e.printStackTrace();transactionUtil.rollbackTx();} finally {transactionUtil.closeTx();}} AccountControllerImp
public class AccountControllerImp implements IAccountController {IAccountService service;public void setService(IAccountService service) {this.service service;}Overridepublic void transfer(String sourceName, String targetName, int money) {service.transfer(sourceName,targetName,money);}public void save(Account account) {service.save(account);}
配置文件applicationContext.xml 在原有的基础上注入连接工具类、事务工具类、以及在业务层注入事务管理工具类
!--连接工具类--
bean idconnectionUtil classcom.ztt.util.ConnectionUtil
property namedataSource refdataSource/property
/bean!--事务工具类--
bean idtransactionUtil classcom.ztt.util.TransactionUtil
property nameconnectionUtil refconnectionUtil/property
/bean!--注入dao--
bean idmapperImp classcom.ztt.dao.AccountMapperImp
property namequeryRunner refqueryRunner/property
/bean!--注入service--
bean idservice classcom.ztt.service.AccountServiceImp
property namemapper refmapperImp/property
property nametransactionUtil reftransactionUtil/property
/bean!--注入controller--
bean idcontroller classcom.ztt.controller.AccountControllerImp
property nameservice refservice/property
/bean
测试方法
Testpublic void show3(){controller.transfer(张甜甜,许娜,100);}
5.项目总结
1.事务管理应该由service层进行实现
代码优化
目的业务层进行事务管理
1.同一个业务方法的多个dao方法公用一个connection对象
2.ThreadLocal
3.通过连接对象进行事务的统一管理