Service层写业务逻辑,dao层是数据库操作的最小单位,那事务管理应该放在service层对吧?

whereismymindM 2020-06-21 06:22:54
有个疑惑,如果不用框架开发,操作数据库只用jdbc,那么获取connection是不是只能写在service方法里?比如一个公司新进一名员工,那么员工表里新增一条记录, 部门表里的人员数量字段数值要加一,这涉及到两张表的操作,员工表对应YuanGongDaoImpl,部门表对应BuMenDaoImpl.
Service层的代码是不是得这样写:

class xxxServiceImpl{

private YuanGongDao ygd = 省略;
privaet BuMenDao bmd = 省略;

void ZengJiaYuanGong(YuanGong yg){
// 获取连接
Connection con = 省略;
// 开启事务
con.setAutoCommit(false);

ygd.insert(yg);//新增员工记录
bmd.update(String sql);//部门人员数量加一

con.commit();
con.close();

}
}
但是上面得con没传入 ygd.insert(yg)和bmd.update(String sql),那么这两个方法也不能对数据库操作啊,假如这两个方法里各自new 一个新得con,那这个事务也操作不起来啊,如果是这样的方法ygd.insert(yg,con)和bmd.update(String sql,con),好像也没人这样设计!
我看网上很多教程里面,讲数据库操作,都是把connection或者sqlsession等等设计成在在dao层里获取,当然那些例子都只是对数据库增删改查,简单的操作,我是想不明白,如果要用到事务,到底要怎么设计啊,不考虑使用框架!


...全文
4876 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
杨大侠Guitar 2022-05-04
  • 打赏
  • 举报
回复
Connection con = 省略; // 开启事务 con.setAutoCommit(false); 仅作演示。这里通过con获取具体的dao,你懂的,动态代理 ygd=con. getMapper(YuanGongDao.class); ygd.insert(yg);//新增员工记录 下面类似,这样就能保证2个的dao用的是同一个数据库连接,才能事务一致性,ok?
vswen5 2020-06-23
  • 打赏
  • 举报
回复
你在dao层 新加一个处理事务的方法把获取连接去掉 在ServiceImpl层获取就行了
s478853630 2020-06-23
  • 打赏
  • 举报
回复
大部分情况下都是一条sql一个connection,事物自动提交,自己写一个DBUtil就能搞定, 多条sql一个connection,一起提交事物,可以参考如下代码:

/**
	 * 批量执行多条SQL
	 * 
	 * @param connection 数据库连接
	 * @param sqls       多条更新语句
	 */
	public static void moreSql(Connection connection, JSONArray sqls) {
		Statement statement = null;
		try {
			connection.setAutoCommit(false);
			statement = connection.createStatement();
			for (Object sql : sqls) {
				if (null != sql && !ToolUtil.isBlank(sql.toString())) {
					SqlUtil.show(sql.toString(), null, null);
					statement.addBatch(sql.toString());
				}
			}
			statement.executeBatch();// 执行更新
			connection.commit();// 统一提交事务
			statement.clearBatch();// 清除批量
		} catch (Exception e) {
			try {
				connection.rollback();// 事务回滚
			} catch (Exception e2) {
			}
			throw new RuntimeException(e);
		} finally {
			ReflectUtil.close(connection, statement);
		}
	}
qq_39936465 2020-06-22
  • 打赏
  • 举报
回复
引用 楼主 whereismymindM 的回复:
有个疑惑,如果不用框架开发,操作数据库只用jdbc,那么获取connection是不是只能写在service方法里?比如一个公司新进一名员工,那么员工表里新增一条记录, 部门表里的人员数量字段数值要加一,这涉及到两张表的操作,员工表对应YuanGongDaoImpl,部门表对应BuMenDaoImpl. Service层的代码是不是得这样写: 但是上面得con没传入 ygd.insert(yg)和bmd.update(String sql),那么这两个方法也不能对数据库操作啊,假如这两个方法里各自new 一个新得con,那这个事务也操作不起来啊,如果是这样的方法ygd.insert(yg,con)和bmd.update(String sql,con),好像也没人这样设计! 我看网上很多教程里面,讲数据库操作,都是把connection或者sqlsession等等设计成在在dao层里获取,当然那些例子都只是对数据库增删改查,简单的操作,我是想不明白,如果要用到事务,到底要怎么设计啊,不考虑使用框架!
如果不用框架的话,你除了在dao内设计正常的添加,删除,查询,更新方法以外你还要设计一个链接数据库方法,框架是通过bean注入方式链接数据库的,不用框架的话你需要自己编写出来。
maradona1984 2020-06-22
  • 打赏
  • 举报
回复
引用 1 楼 whereismymindM 的回复:
突然想到,如果在service层里把con存储到线程里,然后带到dao层,这样是不是可行?
spring的事务管理就是将connection存到ThreadLocal里的,只是你自己要写好也不容易,比如service调用service你的connection该在哪里获取,在哪里提交?
w401557499 2020-06-22
  • 打赏
  • 举报
回复
不使用框架的话,一般会定义一个Connection的工具来,来获取连接、执行sql、获取结果集,执行完后释放连接。开启事务就是设置下aotucommit的事情。
whereismymindM 2020-06-21
  • 打赏
  • 举报
回复
突然想到,如果在service层里把con存储到线程里,然后带到dao层,这样是不是可行?

81,117

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧