ThreadLocal(jdk中) 线程容器,给线程绑定一个 Object 内容,后只要线程不变,可以随时取出.改变线程,无法取出内容.
1 2 3 4 5 6 7 final ThreadLocal<String> threadLocal = new ThreadLocal<>();threadLocal.set("测试" ); new Thread(){ public void run () { String result = threadLocal.get(); System.out.println("结果:" +result); }; }.start();
利用这一特性优化mybatis中service加载配置文件,创建session代码
MyUtil
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 package com.kylin.util;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;import java.io.InputStream;public class MyBatisUtil { private static SqlSessionFactory factory; private static ThreadLocal<SqlSession> tl = new ThreadLocal<>(); static { try { InputStream is = Resources.getResourceAsStream("mybatis.xml" ); factory = new SqlSessionFactoryBuilder().build(is); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSession () { SqlSession session = tl.get(); if (session==null ){ tl.set(factory.openSession()); } return tl.get(); } public static void closeSession () { SqlSession session = tl.get(); if (session!=null ){ session.close(); } tl.set(null ); } }
OpenSessionInView
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 30 31 32 33 34 35 36 37 38 39 40 41 42 package com.kylin.filter;import com.kylin.util.MyBatisUtil;import org.apache.ibatis.session.SqlSession;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import java.io.IOException;@WebFilter("/*") public class OpenSessionInView implements Filter { @Override public void init (FilterConfig filterConfig) throws ServletException { } @Override public void doFilter (ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { SqlSession session = MyBatisUtil.getSession(); try { filterChain.doFilter(servletRequest,servletResponse); session.commit(); }catch (Exception e){ session.rollback(); e.printStackTrace(); }finally { MyBatisUtil.closeSession(); } } @Override public void destroy () { } }
InsertServlet
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 30 31 package com.kylin.Servlet;import com.kylin.pojo.Log;import com.kylin.service.LogService;import com.kylin.service.impl.LogServiceImpl;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/insert") public class InsertServlet extends HttpServlet { private LogService logService = new LogServiceImpl(); @Override protected void service (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8" ); Log log = new Log(); log.setAccIn(req.getParameter("accin" )); log.setAccOut(req.getParameter("accout" )); log.setMoney(Double.parseDouble(req.getParameter("money" ))); int index = logService.ins(log); if (index>0 ){ resp.sendRedirect("success.jsp" ); }else { resp.sendRedirect("/os/error.jsp" ); } } }
LogServiceImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package com.kylin.service.impl;import com.kylin.mapper.LogMapper;import com.kylin.pojo.Log;import com.kylin.service.LogService;import com.kylin.util.MyBatisUtil;import org.apache.ibatis.session.SqlSession;public class LogServiceImpl implements LogService { @Override public int ins (Log log) { SqlSession session = MyBatisUtil.getSession(); LogMapper mapper = session.getMapper(LogMapper.class); return mapper.ins(log); } }
具体过程和代码意义: