您的位置:

java编写生成mybatis(自动生成java代码)

本文目录一览:

MyBatis解析

从命名上可以看出,这个是一个 Builder 模式的,用于创建 SqlSessionFactory 的类。SqlSessionFactoryBuilder 根据配置来构造 SqlSessionFactory。其中配置方式有两种:

mybatis-config.xml 就是我们的配置文件:

Java Config 相比较 XML 文件的方式而言,会有一些限制。比如修改了配置文件需要重新编译,注解方式没有 XML 配置项多等。所以,业界大多数情况下是选择 XML 文件的方式。但到底选择哪种方式,这个要取决与自己团队的需要。比如,项目的 SQL 语句不复杂,也不需要一些高级的 SQL 特性,那么 Java Config 则会更加简洁一点;反之,则可以选择 XML 文件的方式。

创建配置文件解析器XMLConfigBuilder

解析mybatis-config.xml里的配置为Configuration对象,Mybatis的全局配置对象。

XMLConfigBuilder#parseConfiguration解析mapper下的xml

XMLMapperBuilder#bindMapperForNamespace,根据xml里的 namespace 反射出 mapper接口 的 class,如果有mapper接口,则把该mapper接口的class添加到Configuration的mapperRegistry里。

如果该接口已经注册,则抛出已经绑定的异常。

为该接口注册MapperProxyFactory,但这里只是注册其创建MapperProxy的工厂,并不是创建MapperProxy。

如果Mapper对应的xml资源未加载,触发xml的绑定操作,将xml中的sql语句与Mapper建立关系。

addMapper方法,只是为**Mapper创建对应对应的MapperProxyFactory。

根据Mapper接口与SqlSession创建MapperProxy对象。

根据接口类获取MapperProxyFactory。

调用MapperProxyFactory的newInstance创建MapperProxy对象。

SqlSessionFactory 顾名思义,是用于生产 SqlSession 的工厂。 通过如下的方式来获取 SqlSession 实例:

SqlSession 包含了执行 SQL 的所有的方法。以下是示例:

当然,下面的方式可以做到类型安全:

MapperProxy是MapperProxyFactory使用SqlSession创建出来的。所以MapperProxy中包含SqlSession。

可以看到MapperProxy调用invoke方法,进而调用MapperMethod的execute(),这些MapperMethod就是和你要执行的命令相关,比如执行select语句,则会通过SqlSession的select()方法,最终调用到Executor的query方法。Executor会再协调另外三个核心组件。

MapperProxy:

MapperMethod:

插件的构建:

谈原理首先要知道StatementHandler,ParameterHandler,Result Handler都是代理,他们是Configuration创建,在创建过程中会调用interceptorChain.pluginAll()方法,为四大组件组装插件(再底层是通过Plugin.wrap(target,XX, new Plugin( interceptor))来来创建的)。

插件链是何时构建的:

在执行SqlSession的query或者update方法时,SqlSession会通过Configuration创建Executor代理,在创建过程中就调用interceptor的pluginAll方法组装插件。然后executor在调用doQuery()方法的时候,也会调用Configuration的newStatementHandler方法创建StatemenHandler(和上面描述的一样,这个handler就是个代理,也是通过interceptorChain的pluginAll方法构建插件)

插件如何执行:

以statementhandler的prepare方法的插件为例,正如前面所说,statementhandler是一个proxy,执行他的prepare方法,将调用invokeHandler的invoke方法,而invokeHandler就是Plugin.wrap(target, xxx, new Plugin(interceptor))中的第三个参数,所以很自然invokeHanlder的invoke的方法最终就会调用interceptor对象的intercept方法。

Mybatis的插件配置在configuration内部,初始化时,会读取这些插件,保存于Configuration对象的InterceptorChain中。

org.apache.ibatis.plugin.InterceptorChain.java源码。

上面的for循环代表了只要是插件,都会以责任链的方式逐一执行,所谓插件,其实就类似于拦截器。

插件的编写

插件必须实现org.apache.ibatis.plugin.Interceptor接口。

-intercept()方法:执行拦截内容的地方,拦截目标对象的目标方法的执行

-plugin()方法:决定是否触发intercept()方法。 作用:包装目标对象,包装就是为目标对象创建一个代理对象

-setProperties()方法:给自定义的拦截器传递xml配置的属性参数。将插件注册时的property属性设置进来

下面自定义一个拦截器:

为什么要写Annotation注解?注解都是什么含义?

Mybatis规定插件必须编写Annotation注解,是必须,而不是可选。@Intercepts注解:装载一个@Signature列表,一个@Signature其实就是一个需要拦截的方法封装。那么,一个拦截器要拦截多个方法,自然就是一个@Signature列表。

type = Executor.class, method = "query", args = { MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class }

解释:要拦截Executor接口内的query()方法,参数类型为args列表。

Plugin.wrap(target, this)是干什么的?

使用JDK的动态代理,给target对象创建一个delegate代理对象,以此来实现方法拦截和增强功能,它会回调intercept()方法。

Mybatis可以拦截哪些接口对象?

Mybatis只能拦截ParameterHandler、ResultSetHandler、StatementHandler、Executor共4个接口对象内的方法。

重新审视interceptorChain.pluginAll()方法:该方法在创建上述4个接口对象时调用,其含义为给这些接口对象注册拦截器功能,注意是注册,而不是执行拦截。

拦截器执行时机:plugin()方法注册拦截器后,那么,在执行上述4个接口对象内的具体方法时,就会自动触发拦截器的执行,也就是插件的执行。

Invocation

可以通过invocation来获取拦截的目标方法,以及执行目标方法。

分页插件原理

由于Mybatis采用的是逻辑分页,而非物理分页,那么,市场上就出现了可以实现物理分页的Mybatis的分页插件。 要实现物理分页,就需要对String sql进行拦截并增强,Mybatis通过BoundSql对象存储String sql,而BoundSql则由StatementHandler对象获取。

因此,就需要编写一个针对StatementHandler的query方法拦截器,然后获取到sql,对sql进行重写增强。

什么是mybatis框架

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

背景

MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。

每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。

用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。

特点

简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。

灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。

解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。

提供映射标签,支持对象与数据库的orm字段关系映射

提供对象关系映射标签,支持对象关系组建维护

提供xml标签,支持编写动态sql。

javaweb 怎么创建 mybatis

新建mysql数据库连接,并且创建表

创建好数据库后,建一个普通的web project,然后在项目名下,建立两个文件夹,其中src_user存放类,接口,xml,及映射文件,test_src存放测试类。

在src_user下建立包

在src_user目录下,建立一个configuration.xml(名字自设,可不一样),用来存放连接数据库的字段,以及一些映射文件。

在com.yihaomen.mybatis.model下,建立一个User.xml用来与数据库进行数据之间的联系,并且,在User.xml进行配置如下,同时,要在Configuration.xml进行User.xml的映射

进行Test.java的测试

如何编写Java的MyBatis框架中SQL语句映射部分

1..增删改查、参数、缓存

1.1

select

举例如下:

查询学员信息,一个String参数,参数标识为#{studentID},并返回一个StudentEntity类型的对象

select

id="getStudent"

parameterType="String"

resultMap="studentResultMap"

SELECT

ST.STUDENT_ID,

ST.STUDENT_NAME,

ST.STUDENT_SEX,

ST.STUDENT_BIRTHDAY,

ST.CLASS_ID

FROM

STUDENT_TBL

ST

WHERE

ST.STUDENT_ID

=

#{studentID}

/select

1.2

insert

举例如下:

插入数据,一个String参数,参数标识为#{studentID},并返回一个StudentEntity类型的对象。

insert

id="insertStudent"

parameterType="StudentEntity"

INSERT

INTO

STUDENT_TBL

(STUDENT_ID,

STUDENT_NAME,

STUDENT_SEX,

STUDENT_BIRTHDAY,

CLASS_ID)

VALUES

(#{studentID},

#{studentName},

#{studentSex},

#{studentBirthday},

#{classEntity.classID})

/insert

1.3

update

举例如下:

更新学员信息

update

id="updateStudent"

parameterType="StudentEntity"

UPDATE

STUDENT_TBL

SET

STUDENT_TBL.STUDENT_NAME

=

#{studentName},

STUDENT_TBL.STUDENT_SEX

=

#{studentSex},

STUDENT_TBL.STUDENT_BIRTHDAY

=

#{studentBirthday},

STUDENT_TBL.CLASS_ID

=

#{classEntity.classID}

WHERE

STUDENT_TBL.STUDENT_ID

=

#{studentID};

/update

1.4

delete

举例如下:

删除学员信息:

delete

id="deleteStudent"

parameterType="StudentEntity"

DELETE

FROM

STUDENT_TBL

WHERE

STUDENT_ID

=

#{studentID}

/delete

2.ResultMap

SQL映射xml文件是为了放置所有sql语句,需要定义一个workspace,正常是接口类的路径。SQL语句映射文件写好后,需要在MyBatis配置文件mappers标签中引用。

举例如下:

mappers

mapper

resource="cn/tedu/ninixie/manager/data/mappers/UserMapper.xml"

/

mapper

resource="cn/tedu/ninixie/manager/data/mappers/StudentMapper.xml"

/

mapper

resource="cn/tedu/ninixie/manager/data/mappers/ClassMapper.xml"

/

mapper

resource="cn/tedu/ninixie/manager/data/mappers/TeacherMapper.xml"

/

/mappers

当Java接口与xml文件在一个相对路径下,那么MyBaits配置文件的napper中可以不用声明。

ResultMaps的作用,就是简单的语句而不需要多余的结果映射,更多复杂的语句,除了只要一些绝对必须的语句描述关系以外,就不需要其它的了。

resultMap属性:type为java实体类;id为此resultMap的标识。

resultMap可以设置的映射:

2.1

constructor:用来将结果发射给一个实例化好的类的构造器

idArg_ID

参数:将结果集标记为ID,为了方便全局调用

arg

–反射到构造器的通常结果

2.2

id结果,将结果集标记为ID,为了方便全局调用

2.3

result:反射到JavaBean的普通结果

2.4

association:复杂类型的结合,多个结果合成的类型

2.5

collection:复杂类型结合

2.6

resultMap的集合,也可以引用到其他

2.7

discriminator:使用一个结果值为了决定使用哪个结果集。

java 怎么使用注解操作mybatis

mybatis是orm框架 java操作它就是执行sql, 貌似没有用注解的吧。 最多就是 事务控制, 可以spring AOP 找一个cut point 全局设定 或者 @Transactional 这个也要在spring文件里面配置 网上有例子。 mybatis的话 直接config文件里面 mapping一些 mapper 然后做resultMap 直接写mybatis标准的可执行sql就ok了 用sqlsessiontemplate 直接调用就好了。