mybatis
文章平均质量分 80
带你学习mybatis
拾光师
瞧一瞧,看一看,好吃还不贵。量大管饱
多年java开发经验,现征战于互联网广告行业
分享各种java相关知识,每周至少五更
展开
-
SSM集成简单配置
包含三个配置文件,分别对应控制层,业务逻辑service层和事务控制层。applicationContext-*.xml配置。springmvc.xml的配置。原创 2024-06-24 10:11:13 · 274 阅读 · 0 评论 -
带你学习Mybatis之mybatis的sql节点
mybatis的mapper映射文件中的sql节点在初始化时会被解析成MappedStatement对象,其中sql语句会被解析为SqlSource对象,sql语句中定义的动态sql节点、文本节点等则由SqlNode接口的相应实现类表示。DynamicSqlSource、ProviderSqlSource、RawSqlSource、StaticSqlSource,每个所负责的不同。DynamicSqlSource负责处理动态sql语句,会将处理后的sql语句封装为StaticSqlSource返回。原创 2024-06-23 15:22:02 · 166 阅读 · 0 评论 -
带你学习Mybatis之缓存
对于每一个 namespace 都会创建一个缓存的实例,Cache 实现类的构造方法都必须传入一个 String 类型的ID,Mybatis自身的实现类都使用 namespace 作为 ID。LoggingCache在Cache的基础上提供了日志功能,通过hits和request字段记录了Cache的命中次数和访问次数。FifoCache是先进先出版本的装饰器如果缓存项的个数达到上限,会将缓存中最先入队的缓存项删除。mybatis中包含一级缓存和二级缓存,在本质上是一样的,使用的都是Cache接口的实现。原创 2024-06-21 09:58:44 · 311 阅读 · 0 评论 -
带你学习Mybatis之MappedStatement
MappedStatement是保存mapper.xml的一个节点(select|insert|delete|update),包括许多配置的sql、sql的id、缓存信息、resultMap、parameterType、resultType、languageDriver等重要配置内容。mybatis之MappedStatement。原创 2024-06-22 17:03:52 · 262 阅读 · 1 评论 -
带你学习Mybatis之拦截器
Executor中的update()、query()、flushStatements()、commit()、rollback()、getTransaction()、close()、isClose()方法,拦截执行器的方法。StatementHandler中的prepare()、parameterize()、batch()、update()、query()方法,拦截sql语句的构建。通过动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,当执行所拦截的方法时,就会进入拦截方法。原创 2024-06-20 10:05:12 · 990 阅读 · 0 评论 -
带你学习Mybatis之KeyGenerator主键生成
Jdbc3KeyGenerator用于取回数据库生成的自增id,对应于mybatis-config.xml配置文件的useGenerateKeys全局配置以及映射配置文件中SQL节点中的useGenerateKeys属性。默认情况下,mybatis的insert语句不会返回自动生成的主键,而是返回插入的条数,如果需要获取到产生的自增主键,可以使用KeyGenerator接口。节点的SQL语句,该语句会获取insert语句所需要的主键。讲mybatis主键生成之前,先说一下原生的主键回填吧。原创 2024-06-19 10:08:56 · 302 阅读 · 0 评论 -
带你学习Mybatis之ResultSetHandler结果集处理
当真正要使用延迟加载的属性时,会通过代理对象执行数据库加载操作,得到真正的数据。Javassist是一个开源的生成java字节码的类库,其主要优点在于简单、快速,直接使用Javassist提供的API就可以动态的修改类的结构,或是动态的生成类。CGLIB采用字节码技术实现动态代理功能,原理是通过字节码技术为目标类生成子类,并在子类中采用方法拦截的方式拦截所有父类方法的调用,从而实现代理的功能。延迟加载使用动态代理实现的,由于映射的结果对象都为普通的类,没有使用接口,所以无法使用JDK代理。原创 2024-06-18 10:11:51 · 379 阅读 · 0 评论 -
带你学习Mybatis之类型转换
JDBC的数据类型和Java的数据类型不完全对应,所以在PreparedStatement为SQL语句绑定参数时,需要从Java类型转成JDBC类型,从结果集获取到数据要把JDBC的类型转换成Java的类型,mybatis使用的是TypeHandler类型处理器来完成这两种转换的。Mybatis提供了BaseTypeHandler抽象类,在实现自定义的TypeHandler时,只需要去继承BaseTypeHandler即可,该抽象类实现了TypeHandler接口,继承了TypeReference抽象类。原创 2024-06-17 10:13:37 · 400 阅读 · 1 评论 -
带你学习Mybatis之Sql绑定
实现了InvocationHandler接口,是接口的代理类,主要看invoke()方法,如果是接口,会调用cachedInvoker()方法生成代理类MapperMethodInvoker去执行。在mybatis中定义一个接口,然后在mapper.xml文件中编写一个sql语句,在执行该接口中方法的时候就会执行该sql语句,这是怎么做到的呢?MapperMethod中封装了Mapper接口对应的方法的信息,以及对应SQL语句的信息。SqlCommandType记录了SQL语句的类型。原创 2024-06-16 19:20:16 · 362 阅读 · 2 评论 -
带你学习Mybatis之ParameterHandler参数处理
ParameterHandler是参数处理器,mybatis通过ParameterHandler对预编译sql中参数进行设置,如果有配置typeHandler,自然会对注册的typeHandler对参数进行处理。mybatis只为ParameterHandler提供了一个唯一的实现类DefaultParameterHandler。ParameterHandler参数处理。原创 2024-06-15 21:51:40 · 209 阅读 · 0 评论 -
带你学习Mybatis之StatementHandler数据库交互
StatementHandler接口是mybatis的核心接口之一,StatementHandler接口中功能很多,进行预编译并且调用ParameterHandler的setParameters()方法设置参数,创建Statement对象,通过ParameterHandler为SQL语句绑定实参,执行select、insert、update、delete等多种类型的SQL语句,批量执行SQL语句,通过ResultSetHandler将结果集映射成结果对象。在BoundSql中记录的SQL语句中可能包含"?原创 2024-06-14 10:02:15 · 288 阅读 · 2 评论 -
带你学习Mybatis之执行器Executor
在一次会话中,应用程序可能会在短时间内,如一次事务内,反复执行完全相同的查询语句,如果不对数据进行缓存,那么每次查询都会执行一次数据库查询操作,而多次完全相同的、时间间隔较短的查询语句得到的结果集极有可能完全相同,会造成数据库资源的浪费。Executor定义了数据库操作的基本方法,SqlSession接口中的功能都是基于Executor接口实现的,真正执行java和数据库交互的类,负责维护一级缓存和二级缓存,并提供事务管理的相关操作,会将数据库相关操作委托给StatementHandler完成。原创 2024-06-13 10:02:53 · 1051 阅读 · 0 评论 -
带你学习Mybatis之别名设置
在写SQL语句或者在写结果集时,会遇到表名、列名、类的全名太长的情况,Mybatis专门提供了一个标签来设置别名。对于别名注册的方法为registerAliases,有几个重载方法。上面讲述了别名的用处以及配置,Mybatis怎么管理的别名呢?TypeAliasRegistry中包含了对别名的注册和解析。使用的TypeAliasRegistry来进行注册和管理的。首先对于一些基本的类型,Mybatis已经默认设置了别名了。别名解析的方法为resolveAlias。也可以使用注解进行配置别名。原创 2024-06-12 09:59:53 · 494 阅读 · 0 评论 -
带你学习Mybatis之SqlSession
DefaultSqlSession中的insert()、update()、delete()方法最后通过调用DefaultSqlSession.update(String,Object)方法,从而调用Executor.update(MappedStatement, Object)方法完成数据库的修改操作。SqlSession是mybatis的核心接口,SqlSessionFactory负责创建SqlSession对象,包含多个openSession()方法的重载。原创 2024-06-11 10:33:38 · 409 阅读 · 0 评论 -
带你学习Mybatis之DataSource数据源
当程序需要使用数据库连接时,从池中获取连接;所有的数据源组件都实现了javax.sql.DataSource接口,Mybatis实现了两个接口实现,分别为PooledDataSource和UnpooledDataSource,使用不同的DataSourceFactory接口实现创建不同类型的DataSource。数据库连接的创建是非常耗时的,数据库能够建立的连接数也是有限的,像上述UnpooledDataSource中这种每次都会创建连接的方式是存在弊端的,很多系统都是使用数据库连接池。原创 2024-06-10 21:59:35 · 808 阅读 · 0 评论 -
带你学习Mybatis之mybatis构成
一条 SQL 的请求过程首先会经过 Executor 执行器,它主要负责管理创建 StatementHandler 对象,然后由 StatementHandler 对象进行数据库的连接以及生成 Statement 对象,并解析 SQL 参数, ParameterHandler 对象负责把 Mapper 方法中的参数映射到 XML 中的 SQL 语句中,最后由ResultSetHandler进行 SQL 结果集的处理工作。核心处理层包括:配置解析、配置映射、SQL解析、SQL执行、结果集映射、插件等。原创 2024-06-09 23:13:10 · 201 阅读 · 1 评论 -
带你学习Mybatis之逆向工程
可以针对单表自动生成MyBatis执行所需要的代码,包括:Mapper.java,Mapper.xml,实体类,这样可以减少重复代码的编写。idea中的默认是相对于工作空间的路径,需要改一下edit Configurations中的Working directory为。当然最好是配置一下Templates,这样就不需要每一个进行修改了。原创 2024-06-08 17:48:11 · 478 阅读 · 0 评论 -
带你学习Mybatis之mybatis实现分页
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的逻辑分页,而非物理分页。如果想要实现物理分页,则可以在sql内直接书写带有物理分页的参数来完成,也可以使用分页插件来完成物理分页。分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。这种方式是从一开始获取Statement的时候就开始改写原始sql。可以发现成功的进行分页。原创 2024-06-07 10:14:34 · 854 阅读 · 0 评论 -
带你学习Mybatis之使用注解方式
对于向xml配置中那样使用动态SQL,可以使用@SelectProvider、@DeleteProvider、@InsertProvider、@UpdateProvider来完成。由于使用@Results注解需要重复的写很多相同的配置,所以可以在xml中配置resultMap,然后使用@ResultMap注解引用。有些人习惯于用映射文件xml方式配置,有些人习惯于使用注解的方式来编写映射语句,这里来说明一下注解的使用方式。当然这种方式不太方便,可以使用xml方式配置resultMap,以便重复使用。原创 2024-06-06 10:09:02 · 330 阅读 · 0 评论 -
带你学习Mybatis之mybatis整合spring
其实除了MapperScannerConfigurer之外,spring还提供了一个MapperFactoryBean,但是每一个Mapper都需要配置,太麻烦了,这里就直接分析MapperScannerConfigurer,先看一下结构,实现了BeanDefinitionRegistryPostProcessor、InitializingBean、ApplicationContextAware、BeanNameAware。MapperScannerConfigurer扫描mapper。原创 2024-06-05 09:58:35 · 237 阅读 · 0 评论 -
带你学习Mybatis之mybatis缓存机制
的(或者说是namespace级别的),一个namespace对应一个二级缓存,不同namespace查出的数据会放在不同的map中,namespace级别的缓存,可以跨sqlSession进行共享。的缓存,默认开启,在同一次数据库会话期间查询到的数据会放在本地缓存中,以后获取相同的数据,只需要从缓存中取,没必要查数据库,减少数据库的访问,在commit时,会清空sqlSession的缓存。默认情况下,只有一级缓存开启(sqlSession级别的缓存,也称本地缓存)原创 2024-06-04 09:54:08 · 275 阅读 · 0 评论 -
带你学习Mybatis之动态sql
choose与when和otherwise组合使用,根据when标签中的test条件是否成立来进行分支选择,相当于switch-case,只会进入一个分支,如果有一个成立,则choose结束,如果when都不满足,则拼接otherwise标签中的sql。在写sql语句时如果使用语句拼接,根据不同的参数组织不同的语句,经常出现少或多一个and,缺少空格,最后出现逗号等问题,mybatis通过动态sql来解决这些问题。也可能会出现这种情况,最后一条if判断不成立,导致最后多出来一个,,此时sql语句就变成了。原创 2024-06-03 10:07:50 · 254 阅读 · 2 评论 -
带你学习Mybatis之mybatis基本配置及执行
程序会先加载mybatis-config.xml配置文件,根据配置文件内容创建SqlSessionFactory对象,然后通过SqlSessionFactory创建SqlSession对象,SqlSession接口中定义了执行SQL语句所需的各种方法,通过SqlSession对象执行配置文件中的定义的SQL语句,完成相应的数据操作,最后通过SqlSession提交事务,关闭SqlSession对象。另一个配置文件是mapper.xml,这是实体与表的映射文件,定义了映射规则以及一些SQL语句。原创 2024-06-02 11:38:34 · 404 阅读 · 0 评论 -
带你学习Mybatis之Mybatis映射文件
补全预编译语句,调用PreparedStatement的set方法来赋值,有效的防止Sql语句注入,这种取值是编译好SQL语句再取值。很多情况下使用map作为返回是可以支持的,但是map不是一个很好的领域模型,在获取到数据库结果之后,还需要再去人工的从map中取值给业务需要的字段去赋值,是一件痛苦而繁琐的事情。使用PO进行接收结果集时,考虑到数据库中的列名可能与po中的字段名不一致,需要为每个字段起别名,sql写起来就变长了很多。{}直接替换成变量的值,不做任何转换,这种是取值以后再去编译SQL语句。原创 2024-06-01 20:31:56 · 971 阅读 · 0 评论 -
带你学习Mybatis之Mybatis全局配置文件
如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。mybatis可以配置多个环境,可以连接多个数据源,每一个数据源分为两部分:一个是数据源的配置,一个是数据库事务的配置,但是每个SqlSessionFactory实例只可以选择一种环境,如在开发环境、测试环境、生产环境等所用的配置可能不同,如果想要连接两个数据库,则需要创建两个SqlSessionFactory实例。mybatis中有很多默认的配置,可以使用settings来进行mybatis的自定义设置,覆盖掉mybatis中的默认配置。原创 2024-05-31 15:42:52 · 864 阅读 · 1 评论 -
带你学习Mybatis之Mybatis简介
Mybatis需要大量的编写SQL语句,对sql语句需要有一定的功底,且由于sql语句依赖于数据库,所以数据库移植性差,不能随意更换数据库;Hibernate的过度封装,造成了使用不灵活,很多时候还是需要在hibernate中执行sql语句,导致sql和代码耦合,而mybatis则将代码和sql语句分离开。Hibernate的功能并不比Mybatis少,但是学习成本太大,需要深入研究Hibernate才可以很好的使用Hibernate中所提供的各种自定义配置。MyBatis 是一款优秀的。原创 2024-05-30 09:58:17 · 376 阅读 · 0 评论