Mybatis学习笔记.docx

上传人:b****2 文档编号:578865 上传时间:2023-04-29 格式:DOCX 页数:22 大小:633.71KB
下载 相关 举报
Mybatis学习笔记.docx_第1页
第1页 / 共22页
Mybatis学习笔记.docx_第2页
第2页 / 共22页
Mybatis学习笔记.docx_第3页
第3页 / 共22页
Mybatis学习笔记.docx_第4页
第4页 / 共22页
Mybatis学习笔记.docx_第5页
第5页 / 共22页
Mybatis学习笔记.docx_第6页
第6页 / 共22页
Mybatis学习笔记.docx_第7页
第7页 / 共22页
Mybatis学习笔记.docx_第8页
第8页 / 共22页
Mybatis学习笔记.docx_第9页
第9页 / 共22页
Mybatis学习笔记.docx_第10页
第10页 / 共22页
Mybatis学习笔记.docx_第11页
第11页 / 共22页
Mybatis学习笔记.docx_第12页
第12页 / 共22页
Mybatis学习笔记.docx_第13页
第13页 / 共22页
Mybatis学习笔记.docx_第14页
第14页 / 共22页
Mybatis学习笔记.docx_第15页
第15页 / 共22页
Mybatis学习笔记.docx_第16页
第16页 / 共22页
Mybatis学习笔记.docx_第17页
第17页 / 共22页
Mybatis学习笔记.docx_第18页
第18页 / 共22页
Mybatis学习笔记.docx_第19页
第19页 / 共22页
Mybatis学习笔记.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Mybatis学习笔记.docx

《Mybatis学习笔记.docx》由会员分享,可在线阅读,更多相关《Mybatis学习笔记.docx(22页珍藏版)》请在冰点文库上搜索。

Mybatis学习笔记.docx

Mybatis学习笔记

MyBatis入门

MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。

MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。

MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(PlanOldJavaObjects,普通的Java对象)映射成数据库中的记录。

●SqlSessionFactory:

每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。

即创建SqlSessionFactory对象时一般使用单例模式。

而SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得。

一旦创建了SqlSessionFactory之后,SqlSessionFactoryBuilder就不需要存在了,所以一般使用匿名对象。

SqlSessionFactoryBuilder对象可以从XML配置文件,或从Configuration类的习惯准备的实例中构建SqlSessionFactory对象。

●SqlSession:

每个线程都应该有自己的SqlSession实例,不能够共享,是非线程安全的。

●Session:

关闭很重要,应该确保使用finally块来关闭它。

Mybatis的基本配置文件:

配置核心配置文件Configuration.xml:

该配置文件中可以得到SqlSessionFactoryBuilder对象,从而得到SqlSessionFactory对象:

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN"

"http:

//mybatis.org/dtd/mybatis-3-config.dtd">

配置PersonMapper.xml文件:

该文件与Configuration.xml相关联,并由其调用。

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN"

"http:

//mybatis.org/dtd/mybatis-3-mapper.dtd">

id="selectPersonById"resultType="com.afei.Person">

select*frompersonwhereid=#{id}

获得SqlSessionFactory对象:

通过加载Configuration.xml和jdbc.properties两个文件得到:

Readerreader=

Resources.getResourceAsReader("resources/Configuration.xml");

InputStreaminStream=

newFileInputStream(newFile("src/jdbc.properties"));

Propertiesprops=newProperties();

props.load(inStream);

SqlSessionFactoryfactory=

newSqlSessionFactoryBuilder().build(reader,props);

Mybaits配置文件详解:

Configuraion.xml文档的高层级结构:

在IDE中得提示信息:

Element:

configuration

ContentModel:

(properties?

settings?

typeAliases?

typeHandlers?

objectFactory?

objectWrapperFactory?

plugins?

environments?

mappers?

properties属性:

多个地方出现同一个属性的不同值时,它们的加载顺序是:

最高优先级的属性是那些作为方法参数的,然后是资源/url属性,最后是properties元素中指定的属性。

settings设置:

它包含的是极其重要的调整,它们会修改MyBatis在运行时的行为方式,如下表格描述:

typeAliases类型别名:

普通Java类型的内建别名:

typeHandlers类型处理器:

1 默认类型处理器:

2 自定义类型处理器:

publicclassMyTypeHandlerimplementsTypeHandler{

@Override

publicvoidsetParameter(PreparedStatementps,inti,Objectparameter,JdbcTypejdbcType)throwsSQLException{

ps.setString(i,(String)parameter);

}

@Override

publicObjectgetResult(ResultSetrs,StringcolumnName)

throwsSQLException{

returnrs.getString(columnName);

}

@Override

publicObjectgetResult(CallableStatementcs,intcolumnIndex)

throwsSQLException{

returncs.getString(columnIndex);

}

}

注意:

使用这样的自定义类型处理器将会覆盖已经存在的处理Java的String类型属性和

VARCHAR参数及结果的类型处理器。

MyBatis不会审视数据库元信息来决定使用哪种类

型,所以你必须在参数和结果映射中指定那是VARCHAR类型的字段,来绑定到正确的

类型处理器上。

这是因为MyBatis直到语句被执行都不知道数据类型的这个现实导致的。

所以Configuration.xml配置文件中还需要如下一段信息:

javaType="String"jdbcType="VARCHAR">

objectFactory对象工厂:

MyBatis每次创建结果对象新的实例时,它使用一个ObjectFactory实例来完成。

如果想自定义ObjectFactory,只需要继承DefaultObjectFactory,然后在Configuration.xml配置如下信息即可:

Plugins插件:

MyBatis允许你在某一点拦截已映射语句执行的调用。

@Intercepts({@Signature(type=Executor.class,method="update",

args={MappedStatement.class,Object.class})})

publicclassMyPluginsimplementsInterceptor{

......

}

MyPlugins插件将会拦截在Executor实例中所有的“update”方法调用,它也是负责低层次映射语句执行的内部对象。

谨慎使用!

environments环境:

可以配置多种环境,但你只能为每个SqlSessionFactory实例选择一个。

同时一个数据库只能够对应一个SqlSessionFactory实例。

我们可以通过如下的程序语句确定调用哪个SqlSessionFactory实例,即确定调用哪个数据库:

Stringenv="myDevelopment";

SqlSessionFactoryfactory=

newSqlSessionFactoryBuilder().build(reader,env,props);

变量env的值就是所需要的环境的配置的ID,如果.build(......)这个方法中没有参数env,那么会默认加载与default相匹配的那个环境的配置。

这种情况下默认环境一定要与其中一个环境ID想匹配,否则会抛出异常。

......

......

Environment的层级结构如IDE工具提示所示:

Element:

environment

ContentModel:

(transactionManager,dataSource)

transactionManager

在MyBatis中有两种事务管理器类型,也就是type=”[JDBC|MANAGED]”:

dataSource

详见MyBatis3UserGuideSimplifiedChinese.pdf官方文档。

mappers映射器:

其作用是告诉mybatis去哪里找映射文件。

所有的细节和Mybatis真正强大之处就在映射文件里。

XML映射文件

映射文件的层级结构IDE工具提示所示:

Element:

mapper

ContentModel:

(cache-ref|cache|resultMap*|

parameterMap*|sql*|insert*|update*|delete*|select*)+

SQL映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):

1 cache-配置给定命名空间的缓存。

2 cache-ref–从其他命名空间引用缓存配置。

3 resultMap–最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来

加载你的对象。

4 parameterMap–deprecated已经被废弃了!

老式风格的参数映射。

内联参数

是首选,这个元素可能在将来被移除。

这里不会记录。

5 sql–可以重用的SQL块,也可以被其他语句引用。

6 insert–映射插入语句

7 update–映射更新语句

8 delete–映射删除语句

9 select–映射查询语句

Select、insert、update、delete:

四个元素的共同属性和特定属性及其描述信息表:

属性

描述

id

在命名空间中唯一的标识符,可以被用来引用这条语句。

parameterType

将会传入这条语句的参数类的完全限定名或别名。

parameterMap

Deprecated。

这是引用外部parameterMap的方法。

使用内联参数映射和parameterType属性。

flushCache

将其设置为true,不论语句什么时候被调用,都会导致缓存被清空。

默认值:

false。

useCache

将其设置为true,将会导致本条语句的结果被缓存。

默认值:

true。

timeout

这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。

默认不设置(驱动自行处理)。

statementType

STATEMENT,PREPARED或CALLABLE的一种。

这会让MyBatis使用选择使用Statement,PreparedStatement或CallableStatement默认值:

PREPARED。

fetchSize

这是暗示驱动程序每次批量返回的结果行数。

默认不设置(驱动自行处理)。

(SELECT特有)

resultSetType

FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一种。

默认是不设置(驱动自行处理)。

(SELECT特有)

resultType

从这条语句中返回的期望类型的类的完全限定名或别名。

注意集合情形,那应该是集合可以包含的类型,而不能是集合本身。

使用resultType或resultMap,但不能同时使用。

(SELECT特有)

resultMap

命名引用外部的resultMap。

返回map是MyBatis最具力量的特性,对其有一个很好的理解的话,许多复杂映射的情形就能被解决了。

使用resultMap或resultType,但不能同时使用。

(SELECT特有)

useGeneratedKeys

这会告诉MyBatis使用JDBC的getGeneratedKeys方法来取出由数据(比如:

像MySQL和SQLServer这样的数据库管理系统的自动递增字段)内部生成的主键。

默认值:

false。

(INSERT特有)

keyProperty

标记一个属性,MyBatis会通过getGeneratedKeys或者通过insert语句的selectKey子元素设置它的值。

默认:

不设置。

(INSERT特有)

特别警告:

在使用select元素时,如果想查询某一个表中的所有记录,例如查询所有Person时,

需要将Person类实现Serializable,否则会平抛出异常。

同时还需要注意的是select元

素的属性resultType的值应该是Person类型,而不是list或者arraylist类型。

sql:

这个元素可以被用来定义可重用的SQL代码段,可以包含在其他SQL语句中。

比如:

id,sex,age,username,password;那么select语句就可以这样简写:

selectfromperson;

SQL语句中的参数:

Ø参数可以指定一个确定的数据类型:

#{id,javaType=int,jdbcType=NUMERIC}。

Ø自定义类型处理器,你可以指定一个确定的类型处理器类(或别名),比如:

#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}。

Ø确定数值范围:

#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}。

ØSQL语句中插入一个不可变的字符串,比如:

ORDERBY${columnName}。

但是这种做法不安全。

这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

resultMap

resultMap元素是MyBatis中最重要最强大的元素。

主要用法形式:

id="selectPersonById"resultMap="PersonType">

select*frompersonwhereid=#{id}

高级结果映射(重点):

高级结果映射属性总览:

●constructor–类在实例化时,用来注入结果到构造方法中。

⏹idArg–ID参数;标记结果作为ID可以帮助提高整体效能;

⏹arg–注入到构造方法的一个普通结果;

●id–一个ID结果;标记结果作为ID可以帮助提高整体效能;

●result–注入到字段或JavaBean属性的普通结果;

●association–一个复杂的类型关联;许多结果将包成这种类型;

⏹嵌入结果映射–结果映射自身的关联,或者参考一个;

●collection–复杂类型的集;

⏹嵌入结果映射–结果映射自身的集,或者参考一个;

●discriminator–使用结果值来决定使用哪个结果映射;

⏹case–基于某些值的结果映射;

v嵌入结果映射–这种情形结果也映射它本身,因此可以包含很多相同的元素,或

者它可以参照一个外部的结果映射。

详解各个结果映射属性:

id,result:

两者都是结果映射最基本内容。

id和result都映射一个单独列的值到简单数据类型(字符串,整型,双精度浮点数,日期等)的单独属性或字段。

唯一不同是id表示的结果将是当比较对象实例时用到的标识属性,它们都有一些属性:

属性

描述

property

映射到列结果的字段或属性,如果匹配的是存在的,和给定名称相同的JavaBean的属性,那么就会使用。

可以这样映射一些东西:

“username”,或者映射到一些复杂的东西:

“address.street.number”。

column

来自数据库的列名,或其重命名。

这和通常传递给

resultSet.getString(columnName)方法的字符串是相同的。

javaType

一个Java类的完全限定名,或其别名。

jdbcType

如果你直接使用JDBC编程,你需要指定这个类型-但仅仅对可能为空的值。

typeHandler

默认的类型处理器。

使用这个属性,你可以覆盖默认的类型处理器。

constructor:

其用法如下:

这种方式与如下的构造方法方式注入是对应的:

publicBlog(intblog_id,Stringblog_name){

this.blog_id=blog_id;

this.blog_name=blog_name;

}

association:

关联表示的是“有一个”的关系,如下的用法是指Blog中有一个Post,实现方式有两种:

关连查询的两种方式:

1 嵌套结果(使用嵌套结果映射来处理重复的联合结果的子集):

ofType="author"resultMap="author_infos"/>

ofType="post"resultMap="post_infos"/>

......

......

非常重要:

在嵌套结果映射中id元素扮演了非常重要的角色。

应该通常指定一个或多个属性,它们可以用来唯一标识结果。

实际上就是如果你离开她了,但是有一个严重的性能问题时MyBatis仍然可以工作。

选择的属性越少越好,它们可以唯一地标识结果。

主键

就是一个显而易见的选择(尽管是联合主键)。

2 嵌套查询(通过执行另外一个SQL映射语句来返回预期的复杂类型):

column="blog_author_id"select="selectAuthorById"/>

association元素拥有的属性:

其中property、column、javaType、jdbcType、typeHandler的意义和id、sele

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2