设为首页 收藏本站
查看: 686|回复: 0

[经验分享] mybatis学习笔记(七)

[复制链接]
发表于 2016-11-25 07:40:21 | 显示全部楼层 |阅读模式
Java API

SqlSessions

使用MyBatis的主要Java接口就是SqlSession。尽管你可以使用这个接口执行命令,获取映射器和管理事务。

SqlSessions是由SqlSessionFactory实例创建的。SqlSessionFactory对象包含创建SqlSession实例的所有方法。而SqlSessionFactory本身是由SqlSessionFactoryBuilder创建的,它可以从XML配置,注解或手动配置Java来创建SqlSessionFactory。

SqlSessionFactoryBuilder

SqlSessionFactoryBuilder有五个build()方法,每一种都允许你从不同的资源中创建一个SqlSession实例。

SqlSessionFactory build(Reader reader)

SqlSessionFactory build(Reader reader, String environment)

SqlSessionFactory build(Reader reader, Properties properties)

SqlSessionFactory build(Reader reader, String env, Properties props)

SqlSessionFactory build(Configuration config)

第一种方法是最常用的,它使用了一个参照了XML文档或上面讨论过的更特定的SqlMapConfig.xml文件的Reader实例。

可选的参数是environment和properties。

Environment决定加载哪种环境,包括数据源和事务管理器。比如:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">

<dataSource type="POOLED">

</environment>
<environment id="production">
<transactionManager type="EXTERNAL">

<dataSource type="JNDI">

</environment>
</environments>如果你调用了一个使用environment参数的build方法,那么MyBatis将会使用configuration对象来配置这个environment。当然,如果你指定了一个不合法的environment,你会得到错误提示。如果你调用了其中之一没有environment参数的build方法,那么就使用默认的environment(在上面的示例中就会指定为default=”development”)。

如果你调用了使用properties实例的方法,那么MyBatis就会加载那些properties(属性配置文件),并你在你配置中可使用它们。那些属性可以用${propName}语法形式多次用在配置文件中。

如果一个属性存在于这些位置,那么MyBatis将会按找下面的顺序来加载它们:

(1)在properties元素体中指定的属性首先被读取,

(2)从properties元素的类路径resource或url指定的属性第二个被读取,可以覆盖已经指定的重复属性,

(3)作为方法参数传递的属性最后被读取,可以覆盖已经从properties元素体和resource/url属性中加载的任意重复属性。

因此,最高优先级的属性是通过方法参数传递的,之后是resource/url属性指定的,最后是在properties元素体中指定的属性。

这里给出一个从SqlMapConfig.xml文件创建SqlSessionFactory的示例:
String resource = "org/mybatis/builder/MapperConfig.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(reader);Resources类正如其名,会帮助你从类路径下,文件系统或一个web URL加载资源文件。

URL getResourceURL(String resource)

URL getResourceURL(ClassLoader loader, String resource)

InputStream getResourceAsStream(String resource)

InputStream getResourceAsStream(ClassLoader loader, String resource)

Properties getResourceAsProperties(String resource)

Properties getResourceAsProperties(ClassLoader loader, String resource)

Reader getResourceAsReader(String resource)

Reader getResourceAsReader(ClassLoader loader, String resource)

File getResourceAsFile(String resource)

File getResourceAsFile(ClassLoader loader, String resource)

InputStream getUrlAsStream(String urlString)

Reader getUrlAsReader(String urlString)

Properties getUrlAsProperties(String urlString)

Class classForName(String className)


最后一个build方法使用了一个Configuration实例。configuration类包含你可能需要了解SqlSessionFactory实例的所有内容。Configuration类对于配置的自查很有用,包含查找和操作SQL映射(不推荐使用,因为应用正接收请求)。


例子:
DataSource dataSource = BaseDataTest.createBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.setLazyLoadingEnabled(true);
configuration.setEnhancementEnabled(true);
configuration.getTypeAliasRegistry().registerAlias(Blog.class);
configuration.getTypeAliasRegistry().registerAlias(Post.class);
configuration.getTypeAliasRegistry().registerAlias(Author.class);
configuration.addMapper(BoundBlogMapper.class);
configuration.addMapper(BoundAuthorMapper.class);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(configuration);


现在你有一个SqlSessionFactory,可以用来创建SqlSession实例。

SqlSessionFactory

SqlSessionFactory有六个方法可以用来创建SqlSession实例。

Transaction(事务):你想为session使用事务或者使用自动提交(通常意味着很多数据库和/或JDBC驱动没有事务)

Connection(连接):你想MyBatis获得来自配置的数据源的连接还是提供你自己定义的连接

Execution(执行):你想MyBatis复用预处理语句和/或批量更新语句(包括插入和删除)


默认的openSession()方法没有参数,它会创建有如下特性的SqlSession:

(1)将会开启一个事务(也就是不自动提交)范围

(2)连接对象会从由活动环境配置的数据源实例中得到。

(3)事务隔离级别将会使用驱动或数据源的默认设置。

(4)预处理语句不会被复用,也不会批量处理更新。

。MyBatis为事务隔离级别调用使用一个Java枚举包装器,称为TransactionIsolationLevel,否则它们按预期的方式来工作,并有JDBC支持的5级

(NONE,READ_UNCOMMITTED,READ_COMMITTED,REPEATABLE_READ,SERIALIZABLE)


还有一个可能对你来说是新见到的参数,就是ExecutorType。这个枚举类型定义了3个值:

ExecutorType.SIMPLE

这个执行器类型不做特殊的事情。它为每个语句的执行创建一个新的预处理语句。

ExecutorType.REUSE

这个执行器类型会复用预处理语句。

ExecutorType.BATCH

这个执行器会批量执行所有更新语句,如果SELECT在它们中间执行还会标定它们是必须的,来保证一个简单并易于理解的行为。

注意:在SqlSessionFactory中还有一个方法我们没有提及,就是getConfiguration()。这个方法会返回一个Configuration实例,在运行时你可以使用它来自检MyBatis的配置。

SqlSession

SqlSession实例在MyBatis中是非常强大的一个类。

语句执行方法

这些方法被用来执行定义在SQL映射的XML文件中的SELECT,INSERT,UPDATE和DELETE语句。它们都会自行解释,每一句都使用语句的ID属性和参数对象,参数可以是原生类型(自动装箱或包装类),JavaBean,POJO或Map。

Object selectOne(String statement, Object parameter)

List selectList(String statement, Object parameter)

int insert(String statement, Object parameter)

int update(String statement, Object parameter)

int delete(String statement, Object parameter)

List selectList(String statement, Object parameter, RowBounds rowBounds)

void select(String statement, Object parameter, ResultHandler handler)

void select(String statement, Object parameter, RowBounds rowBounds,ResultHandler handler)

selectOne和selectList的不同仅仅是selectOne必须返回一个对象。如果多余一个,或者没有返回(或返回了null),那么就会抛出异常。如果你不知道需要多少对象,使用selectList。如果你想检查一个对象是否存在,那么最好返回统计数(0或1)。

RowBounds参数会告诉MyBatis略过指定数量的记录,还有限制返回结果的数量。RowBounds类有一个构造方法来接收offset和limit,否则是不可改变的。

int offset = 100;

int limit = 25;

RowBounds rowBounds = new RowBounds(offset, limit);

不同的驱动会实现这方面的不同级别的效率。对于最佳的表现,使用结果集类型的SCROLL_SENSITIVE或SCROLL_INSENSITIVE(或句话说:不是FORWARD_ONLY)。

ResultHandler参数允许你按你喜欢的方式处理每一行。你可以将它添加到List中,创建Map,Set或抛出每个结果而不是只保留总计。你可以使用ResultHandler做很多漂亮的事,那就是MyBatis内部创建结果集列表。

它的接口很简单。
package org.mybatis.executor.result;
public interface ResultHandler {
void handleResult(ResultContext context);
}ResultContext参数给你访问结果对象本身的方法,大量结果对象被创建,你可以使用布尔返回值的stop()方法来停止MyBatis加载更多的结果。

事务控制方法

控制事务范围有四个方法。当然,如果你已经选择了自动提交或你正在使用外部事务管理器,这就没有任何效果了。

void commit()

void commit(boolean force)

void rollback()

void rollback(boolean force)

默认情况下MyBatis不会自动提交事务,除非它侦测到有插入,更新或删除操作改变了数据库。如果你已经做出了一些改变而没有使用这些方法,那么你可以传递true到commit和rollback方法来保证它会被提交(注意,你不能在自动提交模式下强制session,或者使用了外部事务管理器时)。很多时候你不用调用rollback(),因为如果你没有调用commit时MyBatis会替你完成。然而,如果你需要更多对多提交和回滚都可能的session的细粒度控制,你可以使用回滚选择来使它成为可能。

清理Session级的缓存

void clearCache()

SqlSession实例有一个本地缓存在执行update,commit,rollback和close时被清理。要明确地关闭它(获取打算做更多的工作),你可以调用clearCache()。

确保SqlSession被关闭

void close()

你必须保证的最重要的事情是你要关闭所打开的任何session。保证做到这点的最佳方式是下面的工作模式:
SqlSession session = sqlSessionFactory.openSession();
try {
// 下面3行pseudocod来做一些工作
session.insert(…);
session.update(…);
session.delete(…);
session.commit();
} finally {
session.close();
}
  
  使用映射器

<T> T getMapper(Class<T> type)

一个更通用的方式来执行映射语句是使用映射器类。一个映射器类就是一个简单的接口,其中的方法定义匹配于SqlSession方法。
public interface AuthorMapper {
// (Author) selectOne(“selectAuthor”,5);
Author selectAuthor(int id);
// (List<Author>) selectList(“selectAuthors”)
List<Author> selectAuthors();
// insert(“insertAuthor”, author)
void insertAuthor(Author author);
// updateAuthor(“updateAuhor”, author)
void updateAuthor(Author author);
// delete(“deleteAuthor”,5)
void deleteAuthor(int id);
}


总之,每个映射器方法签名应该匹配相关联的SqlSession方法,而没有字符串参数ID。相反,方法名必须匹配映射语句的ID。

此外,返回类型必须匹配期望的结果类型。所有常用的类型都是支持的,包括:原生类型,Map,POJO和JavaBean。

映射器接口不需要去实现任何接口或扩展任何类。只要方法前面可以被用来唯一标识对应的映射语句就可以了。

映射器接口可以扩展其他接口。当使用XML来构建映射器接口时要保证在合适的命名空间中有语句。而且,唯一的限制就是你不能在两个继承关系的接口中有相同的方法签名(这也是不好的想法)。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-305113-1-1.html 上篇帖子: Mybatis 、ibatis 、spring 系统配置 下篇帖子: Mybatis延迟加载机制
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表