三层思想: 高内聚(自己的事自己完成) , 低耦合(增强程序的扩展性)
- Web试图层 : 和用户进行交互的 , 给用户展示效果 .
- Service业务层: 对业务进行处理 . 对数据进行效验和计算. - - 有问题使劲try
- Dao数据访问层: 对数据库的表进行CURD. - - 有异常使劲抛
包名: com.xxxxx 公司域名倒写
一张表 < - - - - - - > 一个Dao类 .
工具类 - - - - - - > utils包 .
javaBean - - - - - - > domain包 .
使用三层思想完成转账案例:
com.xxxx.dao包
package com.xxxx.dao;
public class AccountDao {
/*
定义一个减钱方法
参数:
String fromName:付款人姓名
double money:转账金额
返回值:
int:影响数据库的有效行数
*/
public int fromAccount(String fromName, double money) throws SQLException {
//创建QueryRunner对象
QueryRunner qr = new QueryRunner();
//使用QueryRunner对象中的方法update执行sql语句
int row = qr.update(C3P0UtilsXMLThreadLocal.getConnection(),"update account set money=money-? where name= ?;",money,fromName);
//把结果返回
return row;
}
/*
定义一个加钱方法
参数:
String toName:收款人姓名
double money:转账金额
返回值:
int:影响数据库的有效行数
*/
public int toAccount(String toName, double money) throws SQLException {
//创建QueryRunner对象
QueryRunner qr = new QueryRunner();
//使用QueryRunner对象中的方法update执行sql语句
int row = qr.update(C3P0UtilsXMLThreadLocal.getConnection(),"update account set money=money+? where name= ?;",money,toName);
//把结果返回
return row;
}
}
com.xxxx.service包
package com.xxxx.service;
public class AccountService {
// 定义一个转账的功能 .
public boolean TransferAccount(String fromName , String toName , double money){
// 使用C3P0UtilsXMLThreadLocal获取连接
Connection conn = C3P0UtilsXMLThreadLocal.getConnection();
// 定义一个初始变量 , 用于返回 .
boolean flag = false;
try {
// 开启事务.
conn.setAutoCommit(false);
// 创建AccountDao对象 ,
AccountDao ad = new AccountDao();
// 调用其加钱 ,捡钱的方法.
int row1 = ad.fromAccount(fromName, money);
int row2 = ad.toAccount(toName, money);
// 对结果进行判断 .
if (row1 > 0 && row2 > 0 ){
flag = true;
// 全部成功 , 提交事务.
conn.commit();
}
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally {
DbUtils.closeQuietly(conn);
}
return flag;
}
}
com.xxxx.web包
package com.xxxx.web;
public class AccountWeb {
public static void main(String[] args) {
// 创建AccountService对象.
AccountService as = new AccountService();
// 调用其转账的方法 .
boolean b = as.TransferAccount("jack", "rose", 1000);
if (b){
System.out.println("jack --> rose转账成功...");
}else {
System.out.println("jack --> rose转账失败...");
}
// 开启一个新的线程, 一个新的连接 .
new Thread(new Runnable() {
@Override
public void run() {
// 创建AccountService对象,
AccountService as1 = new AccountService();
// 调用其转账的方法 .
boolean b1 = as1.TransferAccount("jack", "tom", 1000);
if (b1){
System.out.println("jack --> tom转账成功...");
}else {
System.out.println("jack --> tom转账失败...");
}
}
}).start();
}
}
ThreadLocal和事务知识点:
可以看: https://blog.csdn.net/qq_42986107/article/details/82808473