实现购买股票案例:
一、引入JAR文件:
二、开始搭建分层架构---创建账户(Account)和股票(Stock)实体类
Account:
Stock:
三、创建Dao层,定义账户以及股票的接口,自定义新增和修改的方法,实现类实现该接口,重写方法
IAccountDao:
IStockDao:
AccountDaoImpl:实现类。继承自JdbcDaoSupport并实现IAccountDao接口,在这里需要用到JDBC模板的getJdbcTemplate(),通过该方法实现对SQL语句增删改查。
public void updateAccount(int aid, int abalance,boolean isBuy) {
String sql=null;
if(isBuy){
//购买股票
sql="update account set balance=balance-? where aid=?";
}else{
//出售股票
sql="update account set balance=balance+? where aid=?";
}
int update = this.getJdbcTemplate().update(sql,abalance,aid);
}
}
StockDaoImpl:实现类同理
public class StockDAOImpl extends JdbcDaoSupport implements IStockDAO {
public void updateStock(int sid, int scount,boolean isBuy) {
String sql=null;
if(isBuy){
//购买股票
sql="update Stock set count=count+? where sid=?";
}else{
//出售股票
sql="update Stock set count=count-? where sid=?";
}
int update = this.getJdbcTemplate().update(sql,scount,sid);
}
}
四、业务逻辑层:service
定义接口IStockService,并实现添加账户,股票,以及购买股票的方法.购买股票需要传入账户的id,股票的id。以及金额,股数
1
2
3
4
5
6
7
8
9
|
public interface IStockService { //添加账户 public int addAccount(Account account); //添加股票 public int addStock(Stock stock); //购买股票 public void buyStock( int aid, int money, int sid, int num) throws StockException; } |
实现类:StockServiceImpl。重写方法。并植入Dao。以及自定义StockException异常,用于判定用户的余额小于0,抛出异常
public void buyStock(int aid, int abalance, int sid, int scount) throws StockException {
//购买股票 买入 和抛出
boolean isBuy=true;// 默认为购买股票
accountDAO.updateAccount(aid,abalance,isBuy); //账户有关
/* int result=5/0;*/
if (true) {
throw new StockException();
}
stockDAO.updateStock(sid, scount, isBuy); //股票有关
}
}
五、Spring配置文件。[重点]
方式一:通过事务代理工厂bean进行配置[XML方式]
①引入一系列的约束头文件以及标签
②配置C3P0数据源以及DAO、Service
③配置事务管理器以及事务代理工厂Bean。测试类getBean获取的是代理工厂id
方式二:注解。测试类getBean获取的id是原始对象service
1
2
|
<!-- 注解 --> <tx:annotation-driven transaction-manager= "mytx" /> |
方式三:Aspectj AOP配置事务 。同理 测试类getBean方法id获取的是原始对象
测试类:
@Test
public void test04(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext22.xml");
IStockService service= (IStockService) context.getBean("stockServiceProxy");
/* service.buyStock(3,2000,35,20);*/
try {
service.buyStock(3,2000,35,20);
}catch (Exception ex) {
ex.printStackTrace();
}
}
实现购买股票案例:
一、引入JAR文件:
二、开始搭建分层架构---创建账户(Account)和股票(Stock)实体类
Account:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/* * 账户 */ public class Account { private int aid; //账户编号 private String aname; //账户名称 private double balance; //账户金额 public int getAid() { return aid; } public void setAid( int aid) { this .aid = aid; } public String getAname() { return aname; } public void setAname(String aname) { this .aname = aname; } public double getBalance() { return balance; } public void setBalance( double balance) { this .balance = balance; } |
Stock:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
/* * 股票 */ public class Stock { private int sid; //股票编号 private String sname; //名称 private int count; //股数 public int getSid() { return sid; } public void setSid( int sid) { this .sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this .sname = sname; } public int getCount() { return count; } public void setCount( int count) { this .count = count; } } |
三、创建Dao层,定义账户以及股票的接口,自定义新增和修改的方法,实现类实现该接口,重写方法
IAccountDao:
1
2
3
4
5
6
|
public interface IAccountDao { //添加账户 public int addAccount(Account account); //修改账户 public int updateAccount( int aid, int money, boolean isBuyOrNot);<br> |
//查询余额
public int selectMoney(int aid);
1
|
} |
IStockDao:
1
2
3
4
5
6
7
|
public interface IStockDao { //添加股票 public int addStock(Stock stock); //修改股票 public int updateStock( int aid, int num, boolean isBuyOrNot); } |
AccountDaoImpl:实现类。继承自JdbcDaoSupport并实现IAccountDao接口,在这里需要用到JDBC模板的getJdbcTemplate(),通过该方法实现对SQL语句增删改查。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao{ //添加 public int addAccount(Account account) { String sql= "insert into account(aid,aname,balance) values(?,?,?)" ; int count= this .getJdbcTemplate().update(sql, account.getAid(),account.getAname(),account.getBalance()); return count; } //修改 public int updateAccount( int aid, int money, boolean isBuyOrNot) { String sql= null ; if (isBuyOrNot){ sql= "update account set balance=balance-? where aid=?" ; } else { sql= "update account set balance=balance+? where aid=?" ; } int count= this .getJdbcTemplate().update(sql, money,aid); return count; } |
StockDaoImpl:实现类同理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public class StockDaoImpl extends JdbcDaoSupport implements IStockDao{ //添加股票 public int addStock(Stock stock) { String sql= "insert into stock(sid,sname,count) values(?,?,?)" ; int count= this .getJdbcTemplate().update(sql, stock.getSid(),stock.getSname(),stock.getCount()); return count; } //修改 public int updateStock( int aid, int num, boolean isBuyOrNot) { String sql= null ; if (isBuyOrNot){ sql= "update stock set count=count+? where sid=?" ; } else { sql= "update stock set count=count-? where sid=?" ; } int count= this .getJdbcTemplate().update(sql, num,aid); return count; } |
四、业务逻辑层:service
定义接口IStockService,并实现添加账户,股票,以及购买股票的方法.购买股票需要传入账户的id,股票的id。以及金额,股数
1
2
3
4
5
6
7
8
9
|
public interface IStockService { //添加账户 public int addAccount(Account account); //添加股票 public int addStock(Stock stock); //购买股票 public void buyStock( int aid, int money, int sid, int num) throws StockException; } |
实现类:StockServiceImpl。重写方法。并植入Dao。以及自定义StockException异常,用于判定用户的余额小于0,抛出异常
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public class StockServiceImpl implements IStockService{ //植入dao private IAccountDao accountDao; private IStockDao stockDao; //添加账户 public int addAccount(Account account) { return accountDao.addAccount(account); } //添加股票 public int addStock(Stock stock) { return stockDao.addStock(stock); } //购买一股票 public void buyStock( int aid, int money, int sid, int num) throws StockException { boolean isBuy= true ; accountDao.updateAccount(aid, money, isBuy); if (accountDao.selectMoney(aid)<= 0 ){ throw new StockException( "捕获异常!!!" ); } stockDao.updateStock(aid, num, isBuy); } |
五、Spring配置文件。[重点]
方式一:通过事务代理工厂bean进行配置[XML方式]
①引入一系列的约束头文件以及标签
②配置C3P0数据源以及DAO、Service
③配置事务管理器以及事务代理工厂Bean。测试类getBean获取的是代理工厂id
方式二:注解。测试类getBean获取的id是原始对象service
1
2
|
<!-- 注解 --> <tx:annotation-driven transaction-manager= "mytx" /> |
方式三:Aspectj AOP配置事务 。同理 测试类getBean方法id获取的是原始对象