mybatis的环境搭建以及问题

1、mybatis中3个重要的类或者接口

1)SqlSessionFactoryBuilder类

用它来创建工厂对象,它重载了9次build()方法,我们常用build(inputstream)来创建工厂.

该类通常在项目中以单例的形式存在。

API列表:

build(Reader reader)

build(InputStream inputStream)

build(InputStream inputStream, String environment)

2)SqlSessionFactory接口

用它来创建对指定数据库的一个连接对象,即sqlsession。

它重载了8次openSession()方法,这些方法都可以用来产生sqlsession连接对象。

该类通常在项目中以单例的形式存在。

API列表:

openSession()                                   默认非自动提交事务

openSession(boolean autoCommit)                 指定true或者false提交事务

openSession(Connection connection);             通过一个JDBC连接对象构建sqlsession

openSession(TransactionIsolationLevel level);   指定事务隔离级别

getConfiguration()方法                            返回Configuration对象

4)SqlSession接口

用它可以执行增删改查的命令,还可以用它获取mapper接口,还可以管理JDBC事务(例如手动或者自动提交、回滚)。

一句话,它代表了一次跟数据库的连接会话,跟JDBC中的Connection对象相似。另外,事务就是一个不可分割的原子性的业务行为,即要么都成功,要么都失败。

该类通常在项目中以多例的形式存在,并且要注意线程安全问题,不能声明为实例变量,否则一个线程关闭了sqlsession会导致其他线程无法使用。

API列表:

insert()

delete()

update

selectXXX()系列

commit()

rollback()

close()

getMapper()

clearCache()

flushStatements()

getConnection()     返回JDBC的一个Connection对象

getConfiguration()  返回Configuration对象

2、和配置相关的类

1)Configuration类

用它封装mybatis-config.xml和mapper.xml里面所有的信息,另外还给出了一些默认配置,例如:

safeRowBoundsEnabled = false;

safeResultHandlerEnabled = true;

mapUnderscoreToCamelCase = false;

lazyLoadingEnabled = false;

aggressiveLazyLoading = true;

multipleResultSetsEnabled = true;

useGeneratedKeys = false;

useColumnLabel = true;

cacheEnabled = true;

defaultStatementTimeout

resultMaps

keyGenerators

有关事务设置的........

JDBC

MANAGED

有关连接池设置的........

JNDI

POOLED

UNPOOLED

有关缓存设置的........

PERPETUAL

FIFO

LRU

SOFT

WEAK

..........等等。



API列表:

属性的get/set方法

addMapper(Class<T> type)        向配置对象中添加指定的mapper接口到MapperRegistry中

addMappers(String packageName)  向配置对象中添加指定包下的mapper接口到MapperRegistry中



包含的一些重要的工具类:

MapperRegistry

TypeAliasRegistry

TypeHandlerRegistry

CacheRefResolver

ResultMapResolver

JdbcTransactionFactory

ManagedTransactionFactory

JndiDataSourceFactory

PooledDataSourceFactory

UnpooledDataSourceFactory

ParameterHandler

ResultSetHandler

StatementHandler

SimpleExecutor

BatchExecutor

ReuseExecutor

CachingExecutor

InterceptorChain

Transaction

JdbcType

Environment

MappedStatement

举例:config.getMappedStatement("selectByNameAndClass").getTimeout()获得id为“selectByNameAndClass”对应的SQL设置中的timeout的值。

可见,Configuration类封装了整个项目中所有的xml配置信息,包括mybatis-config.xml和mapper.xml,这些信息都是在项目启动的时候就读进去的,运行时由于配置错误,会导致看似不相关的SQL执行失败。



映射详情:

<parameterMap>标签会被解析为ParameterMap对象,其每个子元素会被解析为ParameterMapping对象。

<resultMap>标签会被解析为ResultMap对象,其每个子元素会被解析为ResultMapping对象。

每一个<select>、<insert>、<update>、<delete>标签均会被解析为MappedStatement对象,标签内的sql会被解析为BoundSql对象。

2、认识mybatis-config.xml配置文件

1)<properties>标签,读取properties类型的配置文件

2)<typeAliases>为类指定别名,以便在其他地方引用,例如在mapper.xml里面引用。

有两种方式为类取别名:

第一,单个取:<typeAlias alias="Address" type="dashuju.mybatis.pojo.Address"/>

第二,批量取:<package name="dashuju.mybatis.pojo"/>

3)environments和environment标签

配置程序的运行环境,例如生产环境、测试环境等。

如何切换运行环境?更改<environments default="test">中的default值即可。

4)transactionManager标签

指定事务的管理方式,每一种方式都有对应的处理类,type的值有如下两个,不分大小写,不能写错否则报找不到对应的类:

JDBC

MANAGED

5)dataSource标签

连接池类型,type的值有如下三个,每一种方式都有对应的处理类,不分大小写,不能写错否则报找不到对应的类:

POOLED:会从连接池取一个连接,用完后再放回连接池,见日志

UNPOOLED:会每次产生一个新连接,用完后直接关闭,见日志

JNDI:需要容器支持,配置方式跟上述两种方式不同,见源码JndiDataSourceFactory类,建立一个properties文件,并且包含如下键:

data_source=xxxxxxx

env.xxx=xxxxxxx

initial_context=xxxxxxx

6)property标签

<property name="driver" value="${driver}" />

<property name="url" value="${url}" />

<property name="username" value="${username}" />

<property name="password" value="${password}" />

注意name的值区分大小写并且不能改变,变量的引用是${}格式,不是#{}

7)mappers标签

加载映射文件,有3种方式:

第一,<mapper resource="dashuju/mybatis/mapper/StudentMapper.xml" />

第二,<mapper class="dashuju.mybatis.mapper.StudentMapper"/> 

第三,<package name="dashuju.mybatis.mapper"/>

第一种方式XXXmapper.xml的文件名称可以跟mapper接口的文件名称不一致,即只要能找到该xml就可以。

第二、第三种由于扫描的是类,所以要求xml和mapper名称要一致,否则运行mapper接口方法时报找不到方法的异常。

3.xxxMapper.xml配置文件

1)namespace命名空间

namespace是用于绑定Dao接口的,即面向接口编程,它的值是mapper接口的完全限定名也可以是任意取的名称。

绑定后,mapper接口中的方法就可以与xml映射文件中的SQL语句的ID一一对应。

例如dashuju.mybatis.mapper.StudentMapper。

2)缓存移除机制eviction的值:

PERPETUAL

FIFO

LRU

SOFT

WEAK

4、mybatis中的常量,见源码DynamicContext类、DefaultSqlSession类

_parameter

_databaseId

list

array

5、mybatis中的数据类型对照表,见源码TypeAliasRegistry类

string—String

byte—Byte

long—Long

short—Short

int—Integer

integer—Integer

double—Double

float—Float

boolean—Boolean

byte[]—Byte[]

long[]—Long[]

short[]—Short[]

int[]—Integer[]

integer[]—Integer[]

double[]—Double[]

float[]—Float[]

boolean[]—Boolean[]

_byte—byte

_long—long

_short—short

_int—int

_integer—int

_double—double

_float—float

_boolean—boolean

_byte[]—byte[]

_long[]—long[]

_short[]—short[]

_int[]—int[]

_integer[]—int[]

_double[]—double[]

_float[]—float[]

_boolean[]—boolean[]

date—Date

decimal—BigDecimal

bigdecimal—BigDecimal

object—Object

date[]—Date[]

decimal[]—BigDecimal[]

bigdecimal[]—BigDecimal[]

object[]—Object[]

map—Map

hashmap—HashMap

list—List

arraylist—ArrayList

collection—Collection

iterator—Iterator

ResultSet—ResultSet

6、标签

sql

include

foreach

where

if

一、SQL映射文件基础


file
  1. resultType="Student"和resultMap="ResultMapStudent"的区别和注意事项:

1)区别,后者会走resulmap并且会执行assiction等语句

2)resultType即使返回是list也是可以处理的

3)Student是别名

二、主键生成


file

三、参数传递

file

四、高级映射


file

ResultMap主要解决:

1)属性值和列名不一致

2)一对一、一对多、多对多

通常,使用ResultType即可,不要滥用ResultMap


file

五、cache元素


file

六、动态SQL


file

七、resultMap元素


file

八、Collection元素


file

九、#和$的使用


file

获取更多资源请关注微信公众号:AKA程序王

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容