h5企业网站源码下载,自己做seo网站推广,wordpress wp_trim_words,五年级上册语文优化设计答案提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录 谈谈MyBatis的启动过程具体的操作过程如下#xff1a;实现测试类,并测试SqlSessionFactorySqlSession SqlSession有数据安全问题?在MyBatis中#xff0c;SqlSess… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 谈谈MyBatis的启动过程具体的操作过程如下实现测试类,并测试SqlSessionFactorySqlSession SqlSession有数据安全问题?在MyBatis中SqlSession是一个线程不安全的对象 主要原因如下如何解决这个问题Spring整合MyBatis的解决方案 拦截器1 拦截器的定义2 拦截器的应用实际的应用分页SQL检查。黑白名单。分库分表等 谈谈MyBatis的启动过程 Test
public void start() throws Exception{// 1. 加载全局配置文件InputStream in Resources.getResourceAsStream(mybatis-config.xml);// 2.获取SqlSessionFactory// DefaultSqlSessionFactorySqlSessionFactory factory new SqlSessionFactoryBuilder().build(in);// 3.获取SqlSession对象 DefaultSqlSession Executor-- SimpleExecutor -- CachingExecutor -- 插件的逻辑植入SqlSession sqlSession factory.openSession();// 4.通过sqlSession的API接口实现数据库操作ListUser list sqlSession.selectList(com.bobo.vip.mapper.UserMapper.selectUserById,2);for (User user : list) {System.out.println(user);}// 关闭会话sqlSession.close();
}具体的操作过程如下
加载配置文件MyBatis的配置文件是一个XML文件包含了数据库连接信息、映射文件的位置等配置信息。在启动过程中MyBatis会读取并解析这个配置文件。创建SqlSessionFactory对象SqlSessionFactory是MyBatis的核心对象用于创建SqlSession对象。在启动过程中MyBatis会根据配置文件中的信息创建一个SqlSessionFactory对象。工厂模式 建造者模式创建SqlSession对象SqlSession是MyBatis的会话对象用于执行数据库操作。在启动过程中MyBatis会根据SqlSessionFactory对象创建一个SqlSession对象。加载映射文件映射文件是MyBatis的另一个重要配置用于定义SQL语句与Java方法之间的映射关系。在启动过程中MyBatis会根据配置文件中的信息加载映射文件。Mapper文件中的namespaceid初始化Mapper接口Mapper接口是用于执行SQL语句的Java接口在启动过程中MyBatis会根据映射文件中的信息动态生成Mapper接口的实现类。完成启动启动过程完成后就可以使用SqlSession对象执行数据库操作了。
实现测试类,并测试
//1.读取mybatis的核心配置文件(mybatis-config.xml) //2.通过配置信息获取一个SqlSessionFactory工厂对象 //3.通过工厂获取一个SqlSession对象 //4.通过namespaceid找到要执行的sql语句并执行sql语句 //5.输出结果 也就是 SqlSessionFactory对象的构建和 SqlSession对象创建的核心过程。已经具体的数据库操作的请求是如何实现的。这块也是面试官比较感兴趣的内容。
SqlSessionFactory全局配置文件的加载解析和映射文件的加载解析SqlSession相关的核心Executor和拦截器的实例化Executor处理具体的请求涉及到缓存处理。分页扩展以及Sql解析和参数解析等 https://mybatis.net.cn/getting-started.html SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在没有任何理由丢弃它或重新创建另一个实例。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到最简单的就是使用单例模式或者静态单例模式。
SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的因此是不能被共享的所以它的最佳的作用域是请求或方法作用域。绝对不能将 SqlSession 实例的引用放在一个类的静态域甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中比如 Servlet 框架中的 HttpSession。如果你现在正在使用一种 Web 框架考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说每次收到HTTP 请求就可以打开一个 SqlSession返回一个响应后就关闭它。这个关闭操作很重要为了确保每次都能执行关闭操作你应该把这个关闭操作放到 finally 块中。
下面的示例就是一个确保 SqlSession 关闭的标准模式
try (SqlSession session sqlSessionFactory.openSession()) {// 你的应用逻辑代码
}在所有代码中都遵循这种使用模式可以保证所有数据库资源都能被正确地关闭。
SqlSession有数据安全问题? 在MyBatis中SqlSession是一个线程不安全的对象 主要原因如下
SqlSession的底层实现是基于JDBC的Connection对象而Connection对象是非线程安全的因此SqlSession也是非线程安全的。SqlSession中包含了数据库连接和事务相关的操作如果多个线程共享同一个SqlSession实例可能会导致数据的 不一致性或者 事务的混乱。SqlSession中的 缓存机制也是基于当前线程的如果多个线程共享同一个SqlSession实例可能会导致缓存的数据混乱或者不一致。
如何解决这个问题
为了保证数据的安全性和一致性通常建议在每个线程中使用独立的SqlSession实例可以通过工厂模式创建新的SqlSession对象或者使用MyBatis提供的线程安全的SqlSessionFactory实例来创建SqlSession。另外可以使用ThreadLocal来保证每个线程中使用的SqlSession对象是唯一的。
Spring整合MyBatis的解决方案 在Spring中可以通过使用SqlSessionTemplate来解决SqlSession数据不安全的问题 SqlSessionTemplate是MyBatis-Spring提供的一个实现了 SqlSession接口的类它会自动管理SqlSession的生命周期并保证每个线程都有自己的SqlSession实例。使用SqlSessionTemplate时只需要将其配置为Spring的Bean并注入到需要使用SqlSession的地方即可Spring会自动为每个线程提供一个独立的SqlSession实例。 拦截器
1 拦截器的定义
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下MyBatis 允许使用插件来拦截的方法调用包括 https://mybatis.net.cn/configuration.html#plugins MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下MyBatis 允许使用插件来拦截的方法调用包括
Executor(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)ParameterHandler(getParameterObject, setParameters)ResultSetHandler(handleResultSets, handleOutputParameters)StatementHandler(prepare, parameterize, batch, update, query)
这些类中方法的细节可以通过查看每个方法的签名来发现或者直接查看 MyBatis 发行包中的源代码。 如果你想做的不仅仅是监控方法的调用那么你最好相当了解要重写的方法的行为。 因为在试图修改或重写已有方法的行为时很可能会破坏 MyBatis 的核心模块。 这些都是更底层的类和方法所以使用插件的时候要特别当心。
2 拦截器的应用
MyBatis拦截器是MyBatis提供的一种插件机制可以在SQL执行过程中拦截SQL语句并进行相关操作。
拦截器可以用于实现一些通用的功能如日志记录、权限校验、性能监控等。它可以拦截SQL的执行、参数的设置、结果的处理等环节。
要实现一个拦截器需要实现MyBatis提供的Interceptor接口并重写其中的方法。Interceptor接口中定义了3个方法
intercept拦截方法用于在SQL执行前后进行一些操作。在该方法中可以通过Invocation.proceed()方法调用下一个拦截器或执行目标方法。plugin用于包装目标对象返回一个代理对象。可以通过该方法为目标对象生成一个代理对象以便拦截对目标对象的方法调用。setProperties用于设置拦截器的属性。可以通过该方法获取配置文件中的属性并进行相应的初始化操作。 拦截器在MyBatis的配置文件中进行配置可以通过标签将拦截器添加到MyBatis的拦截链中。使用拦截器可以方便地扩展MyBatis的功能实现一些通用的需求并且可以灵活地控制拦截器的顺序。
使用的步骤
先定义
// ExamplePlugin.java
Intercepts({Signature(type Executor.class,method update,args {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {private Properties properties new Properties();public Object intercept(Invocation invocation) throws Throwable {// implement pre processing if needObject returnObject invocation.proceed();// implement post processing if needreturn returnObject;}public void setProperties(Properties properties) {this.properties properties;}
}再注册
!-- mybatis-config.xml --
pluginsplugin interceptororg.mybatis.example.ExamplePluginproperty namesomeProperty value100//plugin
/plugins上面的插件将会拦截在 Executor 实例中所有的 “update” 方法调用 这里的 Executor 是负责执行底层映射语句的内部对象。 实际的应用分页SQL检查。黑白名单。分库分表等