Java Persistence with MyBatis 小结2

MyBatis 最关键的组成部分是 SqlSessionFactory,我们可以从中获取 SqlSession,并执行映射的 SQL 语句。SqlSessionFactory 对象可以通过基于 XML 的配置信息或者 Java API 创建。

 

1 mybatis环境,environments 配置默认的数据库环境

MyBatis 支持配置多个 dataSource 环境,可以将应用部署到不同的环境上,如 DEV(开发环境),TEST(测试换将),QA(质量评估环境),UAT(用户验收环境),PRODUCTION(生产环境),可以通过将默认 environment 值设置成想要的environment id 值。

 

2 每个environment 环境配置,需要有dataSource 和 transactionManager

dataSource 元素被用来配置数据库连接属性。典型配置如下

<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>

 

2.1 dataSource 的类型可以配置成其内置类型之一,如 UNPOOLED,POOLED,JNDI。
 如果将类型设置成 UNPOOLED,MyBatis 会为每一个数据库操作创建一个新的连接,并关闭它。该方式
适用于只有小规模数量并发用户的简单应用程序上。
 如果将属性设置成 POOLED,MyBatis 会创建一个数据库连接池,连接池中的一个连接将会被用作数据
库操作。一旦数据库操作完成,MyBatis 会将此连接返回给连接池。在开发或测试环境中,经常使用此
种方式。
 如果将类型设置成 JNDI,MyBatis 从在应用服务器向配置好的 JNDI 数据源 dataSource 获取数据库
连接。在生产环境中,优先考虑这种方式。

 

如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:

  • 在 properties 元素体内指定的属性首先被读取。
  • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
  • 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。

因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。

 

2.2 事务管理器 TransactionManager

MyBatis 支持两种类型的事务管理器: JDBC and MANAGED.

  •  JDBC 事务管理器被用作当应用程序负责管理数据库连接的生命周期(提交、回退等等)的时候。当你将TransactionManager 属性设置成 JDBC,MyBatis 内部将使用 JdbcTransactionFactory 类创建TransactionManager。例如,部署到 Apache Tomcat 的应用程序,需要应用程序自己管理事务。它依赖于从数据源得到的连接来管理事务作用域。
  •  MANAGED 事务管理器是当由应用服务器负责管理数据库连接生命周期的时候使用。当你将TransactionManager 属性设置成 MANAGED 时,MyBatis 内部使用 ManagedTransactionFactory 类创建事务管理器TransactionManager。例如,当一个JavaEE的应用程序部署在类似 JBoss,WebLogic,GlassFish 应用服务器上时,它们会使用 EJB 进行应用服务器的事务管理能力。在这些管理环境中,你可以使用 MANAGED 事务管理器。

Managed 是托管的意思,即是应用本身不去管理事务,而是把事务管理交给应用所在的服务器进行管理。

如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。

 

3 类型别名 typeAliases,

配置文件中,对于 resultType 和 parameterType 属性值,我们需要使用 JavaBean 的完全限定名。

我们可以为完全限定名取一个别名(alias),然后其需要使用完全限定名的地方使用别名,而不是到处使用完全限定名。

<typeAliases>
<typeAlias alias="Student" type="com.mybatis3.domain.Student" />
<typeAlias alias="Tutor" type="com.mybatis3.domain.Tutor" />
<package name="com.mybatis3.domain" />
</typeAliases>

另一种方式为 JavaBeans 起别名,使用注解@Alias:

@Alias("StudentAlias")
public class Student{}

注意:@Alias 注解将会覆盖配置文件中的<typeAliases>定义。

 

4 类型处理器 typeHandlers

MyBatis 是怎么知道对于 Integer 类型属性使用 setInt() 和 String 类型属性使用 setString()方法呢?
其实 MyBatis 是通过使用类型处理器(type handlers)来决定这么做的。

MyBatis 对于以下的类型使用内建的类型处理器:所有的基本数据类型、基本类型的包裹类型、byte[]、java.util.Date、java.sql.Date、java,sql.Time、java.sql.Timestamp、java 枚举类型等。所以当 MyBatis 发现属性的类型属于上述类型,他会使用对应的类型处理器将值设置到 PreparedStatement 中,同样地,当从 SQL 结果集构建 JavaBean 时,也有类似的过程。

 

对于自定义的类型,需要自己创建自定义类型处理器。

MyBatis 提供了抽象类 BaseTypeHandler<T> ,我们可以继承此类创建自定义类型处理器。

例如,假设表 STUDENTS 有一个 PHONE 字段,类型为 VARCHAR(15),而 JavaBean Student 有一个 PhoneNumber 类定义类型的 phoneNumber 属性。

有一个属性是如下的类, PhoneNumber 类

public class PhoneNumber
{
private String countryCode;
private String stateCode;
private String number;
public PhoneNumber()
{
}
public PhoneNumber(String countryCode, String stateCode, String
number)
{
this.countryCode = countryCode;
this.stateCode = stateCode;
this.number = number;
}
public PhoneNumber(String string)
{
if(string != null)
{
String[] parts = string.split("-");
if(parts.length > 0) this.countryCode = parts[0];
if(parts.length > 1) this.stateCode = parts[1];
if(parts.length > 2) this.number = parts[2];
}
}
public String getAsString()
{
return countryCode + "-" + stateCode + "-" + number;
}
// Setters and getters
}
View Code

 

而Student 定义如下

public class Student
{
private Integer id;
private String name;
private String email;
private PhoneNumber phone;
// Setters and getters
}
View Code

4.1 创建的类型处理器如下

importjava.sql.CallableStatement;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importorg.apache.ibatis.type.BaseTypeHandler;
importorg.apache.ibatis.type.JdbcType;
importcom.mybatis3.domain.PhoneNumber;
public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber>
{
@Override
public void setNonNullParameter(PreparedStatement ps, int i,
PhoneNumber parameter, JdbcType jdbcType) throws
SQLException
{
ps.setString(i, parameter.getAsString());
}
@Override
public PhoneNumber getNullableResult(ResultSet rs, String
columnName)
throws SQLException
{
return new PhoneNumber(rs.getString(columnName));
}
@Override
public PhoneNumber getNullableResult(ResultSet rs, int
columnIndex)
throws SQLException
{
return new PhoneNumber(rs.getString(columnIndex));
}
@Override
public PhoneNumber getNullableResult(CallableStatement cs, int
columnIndex)
throws SQLException
{
return new PhoneNumber(cs.getString(columnIndex));
}
}

说明:我们使用 ps.setString()和 rs.getString()方法是因为 phone 列是 VARCHAR 类型。

4.2 一旦我们实现了自定义的类型处理器,我们需要在 mybatis-config.xml 中注册它:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="application.properties" />
<typeHandlers><typeHandler handler="com.mybatis3.typehandlers.PhoneTypeHandler" />
</typeHandlers>
</configuration>

注册 PhoneTypeHandler 后, MyBatis 就能够将 Phone 类型的对象值存储到 VARCHAR 类型的列上。

 

5 SQL 映射定义 Mappers

Mapper XML 文件中包含的 SQL 映射语句将会被应用通过使用其 statementid 来执行。我们需要在 mybatis-config.xml 文件中配置 SQL Mapper 文件的位置。

<mappers><mapper resource="com/mybatis3/mappers/StudentMapper.xml" /><mapper url="file:///D:/mybatisdemo/app/mappers/TutorMapper.xml" /><mapper class="com.mybatis3.mappers.TutorMapper" /><package name="com.mybatis3.mappers" />
</mappers>

以上每一个<mapper> 标签的属性有助于从不同类型的资源中加载映射 mapper:
 resource 属性用来指定在 classpath 中的 mapper 文件。
 url 属性用来通过完全文件系统路径或者 web URL 地址来指向 mapper 文件
 class 属性用来指向一个 mapper 接口
 package 属性用来指向可以找到 Mapper 接口的包名

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《计算机应用基础》18春作业,【北语网院】18春《计算机应用基础》作业_2.pdf...

谋学网【北京语言大学】 18 春《计算机应用基础》作业 _2试卷总分 :100 得分 :100第 1 题, 操作系统是 ___ 的接口。A、用户与软件B、系统软件与应用软件C、主机与外设D、用户与计算机第 2 题, 计算机配置的内存的容量为 128MB或 128MB以上&#xff0c;其中的 128MB是指 __ 。A…

freeCodeCamp纳什维尔十月聚会回顾

by Seth Alexander塞斯亚历山大(Seth Alexander) 纳什维尔的美好时光&#xff1a;十月免费CodeCamp聚会的回顾 (Good times in Nashville: a recap of our October freeCodeCamp Meetup) On Saturday, October 7, we had our monthly freeCodeCamp Nashville meetup at Nashvi…

c#时分秒毫秒微妙_你真的清楚DateTime in C#吗?

DateTime&#xff0c;就是一个世界的大融合。日期和时间&#xff0c;在我们开发中非常重要。DateTime在C#中&#xff0c;专门用来表达和处理日期和时间。本文算是多年使用DateTime的一个总结&#xff0c;包括DateTime对象的整体应用&#xff0c;以及如何处理不同的区域、时区、…

(HY000): Cannot modify @@session.sql_log_bin inside a transaction

昨天&#xff0c;线上发生一例(HY000): Cannot modify session.sql_log_bin inside a transaction代码缺少显示的start transaction控制。。转载于:https://www.cnblogs.com/zhjh256/p/5775390.html

解决Eclipse的Team菜单中没有SVN选项的问题

刚开始自己拿一个项目&#xff0c;手练一下发觉在Eclipse的Team找不到SVN仓库&#xff0c;看了一下才发觉使用SVN向SVN服务器上传代码&#xff0c;但Eclipse默认情况下却没有SVN选项&#xff0c;刚开始也是这样的 默认只有GIT&#xff0c;如下图所示 想要解决这些问题&#xff…

怎么用计算机怎么截屏,电脑怎么截图 这几个方法操作简便且实用

在日常的生活当中我们在使用电脑的时候经常会碰一些喜欢的文字、图片无法保存的情况&#xff0c;面对这样的状况&#xff0c;我们想要将这些东西保留下来那就会用到电脑截图了&#xff0c;这个方法可以很轻松的就将我们无视无法保存的情况而将这些东西给保留下来。那么电脑要怎…

python socket 多人聊天室

参考来源&#xff08;其实我从上面复制了一点&#xff09;&#xff1a;Python 的 Socket 编程教程 http://www.oschina.net/question/12_76126Python线程指南 http://www.open-open.com/lib/view/open1345476194313.htmlPython Socket文档 https://docs.python.org/3/library/…

json数据转换成表格_电子表格会让您失望吗? 将行数据转换为JSON树很容易。

json数据转换成表格Like many of you, I often have to take the result of SQL queries and convert the rowsets to JSON data objects. Sometimes I have to do the same with CSV files from spreadsheets. The transformation process can be a hassle, though anyone can…

mxm智能教育机器人无法智能对话_零代码使用腾讯TBP打造智能对话机器人

点击观看大咖分享心疼你独自一人承担生活的苦难&#xff0c;寂寞夜里陪伴你的只剩无人倾诉的压抑和无处安放的焦虑。养个宠物&#xff0c;它却不能get到你的“宠言宠语”。找个伴侣&#xff0c;还要浪费吵架的时间和精力。回到家里&#xff0c;只能浸泡在“循环唠叨式“母爱的沐…

MyGeneration代码生成工具

使用MyGeneration 生成代码&#xff1a;转自http://www.cnblogs.com/jack-liang/archive/2011/08/18/2144066.html我们经常用数据访问层和业务逻辑层&#xff0c;用MyGeneration就可以自动生成这些代码&#xff0c;我们可以不用手动写代码了。比如数据访问层&#xff0c;我们需…

数据库部分重点内容回顾

1.什么是聚集索引? 树形结构将数据组织和存储起来,起到加速查询的效果 2.主键索引怎么添加? (1)聚集索引(主键索引)的添加方式,创建时添加 方式一: Create table t1( id int primary key, ) 方式二: Create table t1( Id int, Primary key(id) ) (2)唯一索引创建时添加: 方式…

keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect

1.这里需要输入的密码不是证书的密码执行keytool -import -keystore - file 这个命令提示需要输入密码进入jdk的bin目录&#xff0c;执行以下脚本&#xff0c;keytool -import -alias saltapi -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre…

怎么更换锁定计算机的图片,Win10系统下怎样对锁定界面的背景图片进行更换

用户在唤醒睡眠状态的win10系统时&#xff0c;最先看到就是锁定界面。在界面中&#xff0c;一般有时间日期、星期几&#xff0c;及默认的背景图片。那么&#xff0c;win10系统锁定界面中的背景图片可以修改吗&#xff1f;下面&#xff0c;小编就给大家分享Win10系统更换锁定界面…

输电线路巡检机器人PPT_“高空大师”来了!架空输电线路智能巡检机器人在宁波投运...

“鄞州区220千伏天田4480线一切正常……”17日上午&#xff0c;随着一台智能巡检机器人稳稳地停靠在铁塔边&#xff0c;标志着我省首台架空输电线路智能巡检机器人在宁波率先投入运行&#xff0c;为电网安全运行请来了一位“高空大师”。近年来&#xff0c;无人机代替电力工人巡…

HDU 6325 Problem G. Interstellar Travel(凸包)

题意: 给你n个点,第一个点一定是(0,0)&#xff0c;最后一个点纵坐标yn一定是0&#xff0c;中间的点的横坐标一定都是在(0,xn)之间的 然后从第一个点开始飞行&#xff0c;每次飞到下一个点j&#xff0c;你花费的价值就是xi*yj-xj*yi&#xff0c;并且这里每一次飞行必须满足xi<…

UIView封装动画--iOS利用系统提供方法来做关键帧动画

iOS利用系统提供方法来做关键帧动画 ios7以后才有用。 /*关键帧动画options:UIViewKeyframeAnimationOptions类型*/[UIView animateKeyframesWithDuration:5.0 delay:0 options: UIViewAnimationOptionCurveLinear| UIViewAnimationOptionCurveLinear animations:^{//第二个关键…

JavaScript —从回调到异步/等待

JavaScript is synchronous. This means that it will execute your code block by order after hoisting. Before the code executes, var and function declarations are “hoisted” to the top of their scope.JavaScript是同步的。 这意味着它将在提升后按顺序执行代码块。…

关于解决工作中的自动化环境搭建的解决方案(序)

时间&#xff1a;2015~2017 之前的自动化搭建平台&#xff1a;robotest 安装工具&#xff1a;jdk1.8,robotest 这种工具反正超级好用&#xff0c;华为方搞得工具&#xff0c;前台操作超级傻瓜。会点xpatch&#xff0c;一些东西根本不在话下。但是坑爹的就是&#xff0c;出了外包…

xshell安装mysql步骤_mysql主从复制

前期提要&#xff1a;三年前双11买的阿里云今年到期了&#xff0c;win2012的&#xff0c;上面mysql数据库里记着自己的一些记账数据&#xff0c;上一年双11买了腾讯云的&#xff0c;centos7.7, 想学学MYSQL的复制功能&#xff0c;今天趁着无BUG可撸&#xff0c;试着配置了一下&…

大专学计算机维修,《计算机维修与网络工程》大专学历班

语文、数学、计算机英语、公文写作等办公自动化指法训练、英文打字、智能拼音及高速五笔字型中文打字、windows操作、Word2003文字处理软件、Excel2003电子表格、Powerpoint2003幻灯片制作、Internet网络的上网方法、浏览、下载、电子邮件收发等。本班学习完毕&#xff0c;可独…