当前位置: 首页 > news >正文

营销型网站建设沈阳洛阳市河阳建设工程有限公司网站

营销型网站建设沈阳,洛阳市河阳建设工程有限公司网站,j建设银行查数据的网站,wordpress 预览图MyBatis源码学习环境下载 文章目录1、工作原理1.1 初始化1.1.1 系统启动的时候#xff0c;加载解析全局配置文件和相应的映射文件1.1.2 建造者模式帮助我们解决复杂对象的创建#xff1a;1.2 处理SQL请求的流程1.2.1 通过sqlSession中提供的API方法来操作数据库1.2.2 获取接口…MyBatis源码学习环境下载 文章目录1、工作原理1.1 初始化1.1.1 系统启动的时候加载解析全局配置文件和相应的映射文件1.1.2 建造者模式帮助我们解决复杂对象的创建1.2 处理SQL请求的流程1.2.1 通过sqlSession中提供的API方法来操作数据库1.2.2 获取接口的代码对象-得到的其实是 通过JDBC代理模式获取的一个代理对象1.2.3 处理完请求之后需要关闭会话SqlSession1.3 底层1.3.1 原理图1.3.2 源码结构2、MyBatis中的缓存2.1 缓存的作用2.2 缓存的设计2.2.1 架构设计2.2.2 一级缓存和二级缓存一级缓存session级别默认开启开启二级缓存2.2.3 缓存的处理顺序2.2.3.1 先在二级缓存中查找2.2.3.2 Executor.query()先走一级缓存查询一级缓存也没有的话则进行DB查询3、如何扩展MyBatis中的缓存3.1 架构理解3.2 实际开发3.2.1 自定义三级缓存4、MyBatis中的涉及的设计模式4.1 从整体架构设计分析4.1.1 基础模块cache缓存模块装饰器模式logging日志模块适配器模式、策略模式、代理模式reflection反射模块工程模式、装饰器模式datasource数据源工程模式transaction事务模块工厂模式SqlSessionFactorySqlSessionFactoryBuilder建造者模式5、谈谈你对SqlSessionFactory的理解6、谈谈你读SqlSession的理解6.1 SqlSession6.2 SqlSession的安全问题6.2.1 非线程安全6.2.2 Spring中是如何解决DefaultSqlSession的数据安全问题7、谈谈你对MyBatis的理解8、谈谈MyBatis中分页的理解8.1 谈谈分页的理解8.2 分页的实现8.2.1 逻辑分页RowBounds8.2.2 物理分页拦截器实现执行分页语句的组装9、谈谈MyBatis中的插件原理9.1 插件设计的目的9.2 实现原理9.2.1 创建自定义Java类通过Interceptor注解来定义相关的方法签名9.2.2 在对应的配置文件中通过plugin来注册自定义的拦截器9.2.3 拦截器的作用10、不同Mapper中的id是否可以相同11、谈谈对MyBatis架构设计的理解11.1 接口层11.2 核心层11.3 基础模块12、谈谈对传统JDBC开发的不足13、MyBatis中数据源模块的设计连接池工作原理14、MyBatis中事务模块的设计14.1 事务的理解ACID14.2 MyBatis中的事务14.2.1 事务的配置14.2.2 事务接口的定义定义了事务的基本行为14.2.3 在MyBatis中的事务管理有两个选择14.2.4 如何设置事务管理的方式14.2.5 在MyBatis中执行DML操作事务的处理逻辑15、谈谈你对Mapper接口的设计理解15.1 接口的对应的规则15.2 接口的设计原理15.3 代理对象执行的逻辑的本质还是会执行SqlSession中相关的DML操作的方法15.4 为何要多包一层代理对象16、谈谈你对Reflector模块的理解17、MyBatis的类型转换模块18、整合MyBatis18.1 单纯Spring整合MyBatis18.2 SpringBoot整合MyBatis1、工作原理 1.1 初始化 1.1.1 系统启动的时候加载解析全局配置文件和相应的映射文件 // 1.获取配置文件 InputStream in Resources.getResourceAsStream(mybatis-config.xml);全局配置文件mybatis-config.xml 映射文件mapper/*.xml // 2.加载解析配置文件并获取 SqlSessionFactory 对象 // SqlSessionFactory 的实例我们没有通过 DefaulSqlSessionFactory 直接来获取 // 而是通过一个 Builder 对象来建造的 // SqlSessionFactory 生产 SqlSession 对象的 SqlSessionFactory 应该是单例 // 全局配置文件和映射文件 也只需要在 系统启动的时候完成加载操作 // 通过建造者模式来 构建复杂的对象 1.完成配置文件的加载解析 2.完成 SqlSessionFactory 的创建 SqlSessionFactory factory new SqlSessionFactoryBuilder().build(in);加载解析的相关信息存储在SqlSessionFactory对象的Configuration属性里 1.1.2 建造者模式帮助我们解决复杂对象的创建 完成配置文件的加载解析完成 SqlSessionFactory 的创建 1.2 处理SQL请求的流程 通过工厂得到SqlSession对象 // 3.根据 SqlSessionFactory 对象获取 SqlSession 对象 SqlSession sqlSession factory.openSession();1.2.1 通过sqlSession中提供的API方法来操作数据库 // 4.通过sqlSession中提供的API方法来操作数据库 ListUser list sqlSession.selectList(com.boge.mapper.UserMapper.selectUserList);1.2.2 获取接口的代码对象-得到的其实是 通过JDBC代理模式获取的一个代理对象 // 获取接口的代码对象-得到的其实是 通过JDBC代理模式获取的一个代理对象 UserMapper mapper sqlSession.getMapper(UserMapper.class);1.2.3 处理完请求之后需要关闭会话SqlSession //5.关闭会话 sqlSession.close();//关闭session 清空一级缓存1.3 底层 全局配置文件的加载解析Configuration 映射文件的加载解析Configuration.mappedStatements /*** MappedStatement 映射** KEY${namespace}.${id}*/protected final MapString, MappedStatement mappedStatements new StrictMap(Mapped Statements collection);生产了DefaultSqlsession实例对象完成了Executor对象的创建以及二级缓存CachingExecutor的装饰同时完成了插件逻辑的植入。 selectOne()二级缓存-一级缓存-数据库插入 // 1. 读取配置文件读成字节输入流注意现在还没解析InputStream resourceAsStream Resources.getResourceAsStream(sqlMapConfig.xml);// 2. 解析配置文件封装Configuration对象 创建DefaultSqlSessionFactory对象SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(resourceAsStream);// 3. 生产了DefaultSqlsession实例对象 设置了事务不自动提交 完成了executor对象的创建SqlSession sqlSession sqlSessionFactory.openSession();// 4.(1)根据statementid来从Configuration中map集合中获取到了指定的MappedStatement对象//(2)将查询任务委派了executor执行器User user sqlSession.selectOne(com.lagou.mapper.IUserMapper.findById,1);System.out.println(user);User user2 sqlSession.selectOne(com.lagou.mapper.IUserMapper.findById,1);System.out.println(user2);// 5.释放资源sqlSession.close();1.3.1 原理图 1.3.2 源码结构 2、MyBatis中的缓存 2.1 缓存的作用 降低数据源的访问频率从而提高数据源的处理能力提高服务器的响应速度。 2.2 缓存的设计 2.2.1 架构设计 通过装饰者模式对Cache接口的工作做增强 装饰者作用BlockingCache阻塞的 Cache 实现类FifoCache基于先进先出的淘汰机制的 Cache 实现类LoggingCache支持打印日志的 Cache 实现类LruCache基于最少使用的淘汰机制的 Cache 实现类ScheduledCache定时清空整个容器的 Cache 实现类SerializedCache支持序列化值的 Cache 实现类SoftCache软引用缓存装饰器SynchronizedCache同步的 Cache 实现类TransactionalCache支持事务的 Cache 实现类主要用于二级缓存中WeakCache弱引用缓存装饰器 2.2.2 一级缓存和二级缓存 一级缓存session级别默认开启 !-- STATEMENT级别的缓存使一级缓存只针对当前执行的这一statement有效 -- setting namelocalCacheScope valueSTATEMENT/二级缓存SqlSessionFactory级别工厂/进程级别 开启二级缓存 在mybatis配置文件中配置cacheEnabled为true !-- 控制全局二级缓存默认ture-- setting namecacheEnabled valuetrue/ !-- 延迟加载的全局开关。开启时所有关联对象都会延迟加载。默认false -- setting namelazyLoadingEnabled valuetrue/在映射文件中添加cache标签可以在cache标签中更细致的增加配置 !--二级缓存开启-- cache /命名空间下的所有标签放开二级缓存 可以通过在标签中添加 useCachefalse 指定api不走二级缓存 mybatis-config.xml 2.2.3 缓存的处理顺序 获取mapper映射文件中cache标签里的配置MappedStatement.getCache()如果cache配置不为空从二级缓存中查找(List) TransactionalCacheManager.getObject(cache, key);如果没有值则执行查询 Executor.query()这个查询实际也是先走一级缓存查询一级缓存也没有的话则进行DB查询先将查询到的结果放入缓存TransactionalCacheManager.putObject(cache, key, list)再返回结果 2.2.3.1 先在二级缓存中查找 原因找到概率更高性能角度。 一级缓存二级缓存作用域SqlSession级别SqlSessionFactory级别找到概率5%90%Overridepublic E ListE query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql)throws SQLException {// 从 MappedStatement 中获取 Cache注意这里的 Cache 是从MappedStatement中获取的// 也就是我们上面解析Mapper中cache/标签中创建的它保存在Configration中// 我们在初始化解析xml时分析过每一个MappedStatement都有一个Cache对象就是这里Cache cache ms.getCache();// 如果配置文件中没有配置 cache则 cache 为空if (cache ! null) {//如果需要刷新缓存的话就刷新flushCachetrueflushCacheIfRequired(ms);if (ms.isUseCache() resultHandler null) {// 暂时忽略存储过程相关ensureNoOutParams(ms, boundSql);SuppressWarnings(unchecked)// 从二级缓存中获取结果ListE list (ListE) tcm.getObject(cache, key);if (list null) {// 如果没有值则执行查询这个查询实际也是先走一级缓存查询一级缓存也没有的话则进行DB查询list delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);// 缓存查询结果tcm.putObject(cache, key, list); // issue #578 and #116}// 如果存在则直接返回结果return list;}}// 不使用缓存则从数据库中查询(会查一级缓存)return delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);}2.2.3.2 Executor.query()先走一级缓存查询一级缓存也没有的话则进行DB查询 /*** 记录嵌套查询的层级*/protected int queryStack;/*** 本地缓存即一级缓存*/protected PerpetualCache localCache;SuppressWarnings(unchecked)Overridepublic E ListE query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {ErrorContext.instance().resource(ms.getResource()).activity(executing a query).object(ms.getId());// 已经关闭则抛出 ExecutorException 异常if (closed) {throw new ExecutorException(Executor was closed.);}// 清空本地缓存如果 queryStack 为零并且要求清空本地缓存。if (queryStack 0 ms.isFlushCacheRequired()) {clearLocalCache();}ListE list;try {// queryStack 1queryStack;// 从一级缓存中获取查询结果list resultHandler null ? (ListE) localCache.getObject(key) : null;// 获取到则进行处理if (list ! null) {handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);// 获得不到则从数据库中查询} else {list queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);}} finally {// queryStack - 1queryStack--;}if (queryStack 0) {// 执行延迟加载for (DeferredLoad deferredLoad : deferredLoads) {deferredLoad.load();}// issue #601// 清空 deferredLoadsdeferredLoads.clear();// 如果缓存级别是 LocalCacheScope.STATEMENT 则进行清理if (configuration.getLocalCacheScope() LocalCacheScope.STATEMENT) {// issue #482clearLocalCache();}}return list;} 3、如何扩展MyBatis中的缓存 3.1 架构理解 3.2 实际开发 /*** 永不过期的 Cache 实现类基于 HashMap 实现类** author Clinton Begin*/ public class PerpetualCache implements Cache {/*** 缓存容器*/private MapObject, Object cache new HashMap();Overridepublic void putObject(Object key, Object value) {cache.put(key, value);} }3.2.1 自定义三级缓存 创建Cache接口的实现重写putObject和getObject方法 在mapper映射文件中的cache标签里增加type属性关联自定义的Cache接口的实现 cache typeorg.mybatis.caches.ehcache.EhcacheCache /如果未添加type会默认读取 PERETUAL 二级缓存 4、MyBatis中的涉及的设计模式 4.1 从整体架构设计分析 4.1.1 基础模块 cache缓存模块装饰器模式 Cache接口 定义了缓存的基本行为 PerpetualCache基于Cache实现针对于缓存的功能 1.缓存数据淘汰2.缓存数据的存放机制3.缓存数据添加是否同步【阻塞】4.缓存对象是否同步处理…做了增强处理–代理模式 以及很多装饰类灵活增强出适用于不同业务场景的Cache实现 logging日志模块适配器模式、策略模式、代理模式 帮助我们适配不同的日志框架 Log接口针对不同日志框架有不同的实现类做增强处理 reflection反射模块工程模式、装饰器模式 datasource数据源工程模式 transaction事务模块工厂模式 SqlSessionFactorySqlSessionFactoryBuilder建造者模式 5、谈谈你对SqlSessionFactory的理解 目的创建SqlSession对象单例在应用程序服务中只保存唯一的一份SqlSessionFactory对象的创建是通过SqlSessionFactoryBuilder同时也完成了全局配置文件Configuration和相关映射文件Mapper的加载和解析操作。涉及到了工厂模式和建造者模式 /*** 构造 SqlSessionFactory 对象** param reader Reader 对象* param environment 环境* param properties Properties 变量* return SqlSessionFactory 对象*/SuppressWarnings(Duplicates)public SqlSessionFactory build(Reader reader, String environment, Properties properties) {try {// 创建 XMLConfigBuilder 对象XMLConfigBuilder parser new XMLConfigBuilder(reader, environment, properties);// 执行 XML 解析// 创建 DefaultSqlSessionFactory 对象return build(parser.parse());} catch (Exception e) {throw ExceptionFactory.wrapException(Error building SqlSession., e);} finally {ErrorContext.instance().reset();try {reader.close();} catch (IOException e) {// Intentionally ignore. Prefer previous error.}}}/*** 1.我们最初调用的build*/public SqlSessionFactory build(InputStream inputStream) {//调用了重载方法return build(inputStream, null, null);}/*** 解析 XML** 具体 MyBatis 有哪些 XML 标签参见 《XML 映射配置文件》http://www.mybatis.org/mybatis-3/zh/configuration.html** param root 根节点*/private void parseConfiguration(XNode root) {try {//issue #117 read properties first// 解析 properties / 标签propertiesElement(root.evalNode(properties));// 解析 settings / 标签Properties settings settingsAsProperties(root.evalNode(settings));// 加载自定义的 VFS 实现类loadCustomVfs(settings);// 解析 typeAliases / 标签typeAliasesElement(root.evalNode(typeAliases));// 解析 plugins / 标签pluginElement(root.evalNode(plugins));// 解析 objectFactory / 标签objectFactoryElement(root.evalNode(objectFactory));// 解析 objectWrapperFactory / 标签objectWrapperFactoryElement(root.evalNode(objectWrapperFactory));// 解析 reflectorFactory / 标签reflectorFactoryElement(root.evalNode(reflectorFactory));// 赋值 settings / 到 Configuration 属性settingsElement(settings);// read it after objectFactory and objectWrapperFactory issue #631// 解析 environments / 标签environmentsElement(root.evalNode(environments));// 解析 databaseIdProvider / 标签databaseIdProviderElement(root.evalNode(databaseIdProvider));// 解析 typeHandlers / 标签typeHandlerElement(root.evalNode(typeHandlers));// 解析 mappers / 标签mapperElement(root.evalNode(mappers));} catch (Exception e) {throw new BuilderException(Error parsing SQL Mapper Configuration. Cause: e, e);}}6、谈谈你读SqlSession的理解 6.1 SqlSession 作用通过相关API来实现对应的数据的操作 SqlSession对象的获取需要通SqlSessionFactory来实现 作用域是会话级别当一个新的会话到来的时候需要新建一个SqlSession对象当一个会话结束后需要关闭相关会话资源 处理请求的方式 1.通过相关crud的API直接处理 2.通过getMapperxx.xml来获取相关mapper接口的代理对象来处理 6.2 SqlSession的安全问题 6.2.1 非线程安全 6.2.2 Spring中是如何解决DefaultSqlSession的数据安全问题 DefaultSqlSession是非线程安全的也就意味着我们不能把DefaultSqlSession声明在成员变量中。每个线程都应该有自己的SqlSession实例。最佳作用域是请求或方法作用域决不能将SqlSession实例引用放在一个类的静态域甚至一个类的实例变量也不行。应该将SqlSession放在一个和HTTP请求相似的作用域中每次请求打开一个SqlSession返回一个响应后就关闭他关闭操作放在finally块中。 Spring中提供了SqlSessionTemplate来实现SqlSession的相关定义。其中每一个方法都通过SqlSessionProxy来操作这是一个动态代理对象。在动态代理对象中通过方法级别的DefaultSqlSession来实现相关的数据库操作。 7、谈谈你对MyBatis的理解 使用频率最高的ORM框架、持久层框架提供了非常方便的API实现CRUD支持灵活的缓存处理方案一级缓存、二级缓存、三级缓存支持相关的延迟数据加载处理还提供了非常多的灵活标签来实现复杂的业务处理if forech where trim set bind…相比Hibernate全自动化会更加灵活 8、谈谈MyBatis中分页的理解 8.1 谈谈分页的理解 数据库层面SQL MySQLLIMIT Oraclerowid 8.2 分页的实现 8.2.1 逻辑分页RowBounds 8.2.2 物理分页拦截器实现执行分页语句的组装 9、谈谈MyBatis中的插件原理 9.1 插件设计的目的 方便开发人员实现对MyBatis功能的增强 设计中MyBatis允许映射语句执行过程中的某一点进行拦截调用允许使用插件拦截的方法包括 9.2 实现原理 9.2.1 创建自定义Java类通过Interceptor注解来定义相关的方法签名 9.2.2 在对应的配置文件中通过plugin来注册自定义的拦截器 pluginsplugin interceptorcom.github.pagehelper.PageHelperproperty namedialect valuemysql//plugin/plugins9.2.3 拦截器的作用 检查执行的SQL对执行SQL的参数做处理对查询的结果做装饰处理对查询SQL做分表处理 10、不同Mapper中的id是否可以相同 可以相同每一个映射文件的namespace都会设置为对应的mapper接口的全类路径名称 保证了每个Mapper映射文件的namespace是唯一的。 11、谈谈对MyBatis架构设计的理解 11.1 接口层 面向开发者提供相关API 11.2 核心层 核心功能的实现增删改查操作 11.3 基础模块 支撑核心层来完成核心的功能 12、谈谈对传统JDBC开发的不足 JDBCMyBatis资源频繁的创建和释放数据库的连接对象造成系统资源的浪费通过全局配置文件设置相关的数据连接池sql维护sql语句直接写在了代码中维护成本高动态性要求较高sql语句写在Mapper映射文件中的标签里参数向SQL中传递参数麻烦where条件不一定占位符和参数需要一一对应自动完成Java对象和SQL中参数的映射结果集映射麻烦需要循环封装SQL本身的变化会导致解析的难度通过ResultHandler自动将结果集映射到Java对象拓展不支持事务、缓存、延迟加载等功能提供了相关实现性能运行性能更高开发效率更高 13、MyBatis中数据源模块的设计 完成相关标签的解析存储在configuration中 private void environmentsElement(XNode context) throws Exception {if (context ! null) {// environment 属性非空从 default 属性获得if (environment null) {environment context.getStringAttribute(default);}// 遍历 XNode 节点for (XNode child : context.getChildren()) {// 判断 environment 是否匹配String id child.getStringAttribute(id);if (isSpecifiedEnvironment(id)) {// 解析 transactionManager / 标签返回 TransactionFactory 对象TransactionFactory txFactory transactionManagerElement(child.evalNode(transactionManager));// 解析 dataSource / 标签返回 DataSourceFactory 对象DataSourceFactory dsFactory dataSourceElement(child.evalNode(dataSource));DataSource dataSource dsFactory.getDataSource();// 创建 Environment.Builder 对象Environment.Builder environmentBuilder new Environment.Builder(id).transactionFactory(txFactory).dataSource(dataSource);// 构造 Environment 对象并设置到 configuration 中configuration.setEnvironment(environmentBuilder.build());}}}}UnpooledDataSource非数据库连接池的实现PooledDataSource数据库连接池的实现从连接池中获取连接对象如果有空闲连接直接返回活跃连接数是否超过了最大连接数是否有连接超时的连接数据库连接池关闭连接如果空闲连接没有超过最大连接数那么就返回空闲队列中。否则关闭真实的连接。 连接池工作原理 14、MyBatis中事务模块的设计 14.1 事务的理解ACID 14.2 MyBatis中的事务 14.2.1 事务的配置 14.2.2 事务接口的定义定义了事务的基本行为 14.2.3 在MyBatis中的事务管理有两个选择 JDBC在MyBatis中自己处理事务的管理 Managed在MyBatis中没有处理任何的事务操作这种情况下事务的处理会交给Spring容器来管理 14.2.4 如何设置事务管理的方式 14.2.5 在MyBatis中执行DML操作事务的处理逻辑 SqlSession.commit() 15、谈谈你对Mapper接口的设计理解 15.1 接口的对应的规则 名称需要对应 15.2 接口的设计原理 代理模式的使用 创建动态代理对象 15.3 代理对象执行的逻辑的本质还是会执行SqlSession中相关的DML操作的方法 15.4 为何要多包一层代理对象 每调用一个mapper接口都需要在命名空间中指向接口路径 16、谈谈你对Reflector模块的理解 Reflector是MyBatis中提供的一个针对反射封装简化的模块简化反射的相关操作。表结构的数据和Java对象中数据的映射不可避免的会存在非常多的反射操作。Reflector是一个独立的模块可以把这个模块单独抽取出来直接使用的。反射器每个 Reflector 对应一个类。 反射模块的具体设计 17、MyBatis的类型转换模块 MyBatis是如何解决Java中的类型和数据库中的字段类型的映射 类型处理器 写Java类型 -- JDBC类型 读JDBC类型 -- Java类型 SQL操作读 写 本质上执行的JDBC操作 String sql SELECT id,user_name,phone from user where id ? and user_name ?; ps conn.prepareStatement(sql); ps.setInt(1,2); ps.setString(2,张三);TypeHandler -- BaseTypeHandler — 具体的TypeHandler 18、整合MyBatis 18.1 单纯Spring整合MyBatis 添加mybatis-spring依赖 !-- mybatis 中间件 --dependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion1.2.2/version/dependency在spring配置文件spring-context.xml中添加数据源信息和sqlSessionFactory将sqlSessionFactory注入容器 !-- 数据源配置, 使用 BoneCP 数据库连接池 --bean iddataSource classcom.alibaba.druid.pool.DruidDataSource init-methodinit destroy-methodclose!-- 数据源驱动类可不写Druid默认会自动根据URL识别DriverClass --property namedriverClassName value${jdbc.driver} /!-- 基本属性 url、user、password --property nameurl value${jdbc.url} /property nameusername value${jdbc.username} /property namepassword value${jdbc.password} /!-- 配置初始化大小、最小、最大 --property nameinitialSize value${jdbc.pool.init} /property nameminIdle value${jdbc.pool.minIdle} /property namemaxActive value${jdbc.pool.maxActive} /!-- 配置获取连接等待超时的时间 --property namemaxWait value300000 /!-- 配置间隔多久才进行一次检测检测需要关闭的空闲连接单位是毫秒 --property nametimeBetweenEvictionRunsMillis value60000 /!-- 配置一个连接在池中最小生存的时间单位是毫秒 --property nameminEvictableIdleTimeMillis value300000 //bean!-- MyBatis begin --bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean!--关联数据源--property namedataSource refdataSource/!--添加别名设置--property nametypeAliasesPackage valuecom.hlframe/property nametypeAliasesSuperType valuecom.hlframe.common.persistence.BaseEntity/!--映射文件和接口文件不在同一个目录下的时候配置映射文件位置--property namemapperLocations valueclasspath:/mappings/**/*.xml/!--关联MyBatis的配置文件--property nameconfigLocation valueclasspath:/mybatis-config.xml/property/bean18.2 SpringBoot整合MyBatis 添加mybatis-plus-boot-starter依赖 !--mybatis-plus--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion${mybatis-plus.version}/versionscopeprovided /scope/dependency将sqlSessionFactory注入容器
http://www.sczhlp.com/news/174501/

相关文章:

  • 科技网站备案山西响应式网页建设报价
  • 大学做视频网站设计网页游戏平台网站
  • 九江做网站的公司所有网站收录入口
  • 软件网站模版品牌网站如何建设
  • 棋牌网站开发需要多少钱怎么建立视频网站
  • 电商网站开发视频品牌网站设计步骤
  • 营销网站怎么做seo技巧课程
  • 网站的建设与应用搜索引擎优化介绍
  • 哪些网站做夜场女孩多百度网页游戏中心
  • 做一个网站要注意什么东西做资源分享网站怎么样
  • 崇州市微信端网站建南京搜索引擎推广优化
  • 物流三方网站怎么做商标logo设计生成器免费
  • 搭建租号网的网站正品手表网站
  • 静态网站的好处淘宝网站怎么做适配
  • 福建省住房城乡和城乡建设厅网站深圳市住房建设局网站
  • 济南建站公司网站广告设计与制作专业学校
  • 那有名网站是php做的嘉兴seo外包平台
  • 房山网站建设优化seo深圳市建设
  • 珠海网站建设怎么样茶网站建设宗旨
  • 哪个网站上做ppt比较好看的利用软件做许多网站违法吗
  • 网站制作和优化wordpress整站密码访问
  • 网站开发与设计实训报告安徽建设局网站
  • vm ubuntu22安装docker
  • 有没有免费的网站空间企业做网站需要提交的资料表格
  • 做的网站龙岩网站改版较好的公司
  • 专业营销型网站建设网站建设业务员
  • 建设部网站进不去wordpress子页面
  • 南屏网站建设Wordpress 百度云存储
  • 代做网站公司哪家好设计工作室官网
  • wordpress站外搜索网站开发合同答案