2023-05-02 10:33
复制项目mymvc4,新建项目mymvc5
packagecom.hy.filter; importjava.io.IOException; importjavax.servlet.Filter; importjavax.servlet.FilterChain; importjavax.servlet.FilterConfig; importjavax.servlet.ServletException; importjavax.servlet.ServletRequest; importjavax.servlet.ServletResponse; importjavax.servlet.annotation.WebFilter; importjavax.servlet.annotation.WebInitParam; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importcom.hy.utils.StringUtil; @WebFilter(urlPatterns={ "*.do"}, initParams={ @WebInitParam(name="encoding", value="UTF-8") }) publicclassCharacterEncodingFilter implementsFilter { privateString encoding="UTF-8"; @Override publicvoidinit(FilterConfig filterConfig) throwsServletException { String encoding=filterConfig.getInitParameter("encoding"); System.out.println("encoding="+encoding); if(StringUtil.isNotEmpty(encoding)) { this.encoding=encoding; } } @Override publicvoiddoFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throwsIOException, ServletException { HttpServletRequest request=(HttpServletRequest) req; HttpServletResponse response=(HttpServletResponse) resp; request.setCharacterEncoding(encoding); response.setCharacterEncoding(encoding); response.setContentType("text/html;charset="+encoding); chain.doFilter(request, response); return; } @Override publicvoiddestroy() { } } |
createtableworker( widintprimarykey, wnamevarchar2(20), ageint ) select* fromuser_tables; select* fromuser_col_commentswheretable_name='WORKER' select* fromworker; insertintoworkervalues(1,'fbb',10); commit; rollback; ##Oracle自动开启事务,但是需要手动的提交事务或回滚事务 ##mysql默认自动开启事务,自动提交事务,失败自动回滚 |
当我们需要手动提交事务,调用 conn.setAutoCommit(false); 但是,我们的conn到底用的是哪个connection?我们三个dao代码中,应该使用同一个Connection对象,才能让三个dao操作处于同一个事务。如果用面向对象的思想来写,那么我们需要在dao中传参。
事务前置到XxxFilter中,进行”所谓的”事务管理的操作。 Service还是正常的Service,不要XxxServiceImpl代码中获取Connection对象,XxxDao的方法也不要传递Connection对象。
但是如何解决三个dao操作要共享同一个Connection对象的问题呢?
有一个工厂,有三个员工 – 相当于三个dao方法。
这个纽带叫ThreadLocal