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,一经查实,立即删除!

相关文章

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

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

解决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/…

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

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

怎么更换锁定计算机的图片,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<…

xshell安装mysql步骤_mysql主从复制

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

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

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

Appium——主从控制执行

1.客户端(Eclipse)机器A&#xff0c; 服务端(appium、Genymotion)机器B 2.设置Appium&#xff0c;Server Address为192.168.17.123&#xff0c;重新启动Appium 3.在客户端机器A浏览器中输入&#xff1a;http://192.168.17.123:4723/wd/hub&#xff0c; 说明配置成功。 JAVA代码…

Python学习-03(集合,文件,编码)

上周复习&#xff1a; 列表增删改查 元祖是可读列表 字符串操作 字典是无序的&#xff0c;通过key来找值。字典可以嵌套列表和字典 本周内容&#xff1a;集合--文件---字符编码 集合引入&#xff1a; #随机生成20个小于20的数&#xff0c;输出所有的数&#xff0c;# 要求重复…

安装centos7失败认不到硬盘_CentOS7 用U盘安装卡住无法进入安装界面解决方案

使用U盘安装Centos系统找不到U盘解决方案补充&#xff1a;1、制作U盘启动盘请参考&#xff1a;使用UltraISO(软碟通)制作ubuntu U盘启动盘如果你安装centos7出现了下图这种情况不用担心&#xff0c;是因为安装centos7时找不到U盘稍等一下&#xff0c;如下图等到出现命令行时。输…

Django横向二级导航栏(鼠标悬空事件)

1 <!DOCTYPE html>2 <html lang"en" xmlns"http://www.w3.org/1999/html">3 <head>4 <meta charset"UTF-8">5 <title>{% block title %} base模板 {% endblock title%}</title>6 <style >…

浙江大学计算机学院1702班,测控1702:传道授业解惑 此间师者真情

2017年9月11日晚8:00&#xff0c;电气与信息工程学院测控技术与仪器1702班在德智学生公寓的天台上开展了一场别开生面的班主任见面交流会。测控1702班班主任文一章博士、电气院2017级本科辅导员金晶老师以及测控1702班的同学们参加了此次见面会。测控1702班班主任文一章1991年出…

关于spring 获取不到网站上的xsd的处理记录

2019独角兽企业重金招聘Python工程师标准>>> 前两天做一个项目还好好的&#xff0c;今天突然报出这个错误 cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element mvc:annotation-driven 应该是xml文件找不到相应…

蓝宝石英语怎么读_黑金和蓝宝石

这是一直以后我个人的一个理解误区&#xff0c;或者说是信息误区&#xff0c;就是这两个产品线&#xff0c;差别到底在哪里&#xff1f;以前我一直认为黑金的成分是纯天然的&#xff0c;而蓝宝石有一定的合成物质。这个信息一定是我从哪里读到的&#xff0c;由于无处求证&#…

提高你的javascript代码逼格系列之函数与数组

不知道大家有没有一种感觉&#xff0c;那就是自己写的javascript代码虽然能完全解决工作上的需要&#xff0c;但是&#xff0c;一眼望去&#xff0c;too simple&#xff01;&#xff01;&#xff01;简直就是一个傻子都能看懂的水平&#xff0c;于是&#xff0c;在工作之余&…

包打包和解析过程 unity_Unity学习—资源管理概览

本文介绍了 Unity 常用四种默认路径&#xff0c;以及 AssetDataBase、Resources、AssetBundle 和目前最新的 Addressable 四种资源管理方式文中所有 API 均以版本 2019.3 为准本文原地址&#xff1a;Unity学习—资源管理概览资源路径Application.dataPath官方文档只读&#xff…

用idea搭建SSM项目,原来这么简单

目录 前言软件环境创建项目数据库文件配置文件pom.xmllog4j.propertiesjdbc.propertiesapplicationContext.xmlspring-mvc.xmlweb.xml运行项目编写代码前言 前阵子突发奇想&#xff0c;想学习下SpringMVC的源码&#xff0c;于是打算用idea搭建一个简易的maven版SSM案例&#xf…