您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
13-SqlSessionFactory工具类抽取(代码复用与性能优化)
发布时间:2024-12-02 11:02:51编辑:雪饮阅读()
-
我们上篇中实现的用户注册案例中其实获取sqlSessionFactory如:
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
这句是有性能问题的,工厂就是一个连接池,创多次会消耗更多资源。
所以需要封装下,并且如用静态代码块来封装,静态代码块仅在类加载的时候加载一次,不会重复加载,并且这获取sqlSessionFactory每次都要执行3行代码,代码重复率挺高。
那么第二个就是我们的获取参数时候防止中文乱码,也同样是每次额外执行2行代码,代码重复率也挺高(但由于每次参数不同,所以不能用于静态代码块,而是直接实现静态方法更妥善一点)。基于此,所以我们可以实现如下一个工具类如:
package com.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
public class SessionFactoryUtil {
private static SqlSessionFactory sqlSessionFactory;
//static静态代码块只会创建一次,可用于重复代码封装以及资源占用型代码的重用
static {
String resource="mybatis-config.xml";
InputStream inputStream= null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
public static String getParameter(HttpServletRequest req,String arg){
String argv=req.getParameter(arg);
byte[] bytes=argv.getBytes(StandardCharsets.ISO_8859_1);
argv=new String(bytes,StandardCharsets.UTF_8);
return argv;
}
}
这里具体的从sqlSessionFactory中取出session的时候就必要封装了,那样封装就失去了意义,失去了连接池的意义,想想看,连接池其它的链接都闲置了,永远只用一个链接,这个链接能忙到死。。。
第二个因为会影响事务,尤其是有的需要事务自动提交,有的不需要事务自动提交。
SqlSession sqlSession=sqlSessionFactory.openSession(true);
所以这句话命运必要封装的。
那么接下来我们重新完善我的注册的servlet的doGet则如:
package com.servlet;
import com.POJO.User;
import com.mapper.UserMapper;
import com.utils.SessionFactoryUtil;
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 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;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
@WebServlet("/registerServlet")
public class HttpServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
SqlSessionFactory sqlSessionFactory=SessionFactoryUtil.getSqlSessionFactory();
User user=new User();
String username=SessionFactoryUtil.getParameter(req,"username");
String password=req.getParameter("password");
user.setUsername(username);
user.setPassword(password);
SqlSession sqlSession=sqlSessionFactory.openSession(true);
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
if(userMapper.selectByUsername(username)==null){
userMapper.add(user);
sqlSession.close();
resp.getWriter().write("注册成功!");
}
else{
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("用户名已存在!");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
关键字词:SqlSessionFactory,工具类,代码,复用,性能