赞
踩
目录
1.SqlSession和SqlSessionFactory
2.springboot,Guice框架中的SqlSessions=
4.不同的方式构建SqlSessionFactory,两大类
- 提示:mybatis的Resources 类可以读取classpath的文件
像springboot、Guice这些依赖注入的框架中的sqlsession是由框架来自动注入的,所以开发者不需要手动使用SqlSessionFactoryBuilder、SqlSessionFactory来创建 sqlsession,直接使用@autowire注入 sqlsession实例,然后使用即可
可以在xml配置文件中读入环境变量,${propName},propName就是一个环境变量
- <dataSource type="POOLED">
- <property name="driver" value="${driver}"/>
- <property name="url" value="${url}"/>
- <property name="username" value="${username}"/>
- <property name="password" value="${password}"/>
- </dataSource>
1.首先读取 xml 配置中的 <properties></properties>中的连接配置
- <properties>
- <property name="driver"value=""/>
- <property name="url"value="jdbc:sqlserver://"/>
- <property name="username"value=""/>
- <property name="password"value=""/>
- </properties>
2.然后读取从resource属性值指定的配置文件中的属性,将覆盖和上一步中重复的属性值
- <properties resource="org/mybatis/example/config.properties">
- </properties>
- SqlSessionFactory factory =
- sqlSesionFactoryBuilder.build(reader, props);
- // ... or …
- SqlSessionFactory factory =
- new SqlSessionFactoryBuilder.build(reader, environment, props)
- <environments default="development">
- <environment id="development">
- <transactionManager type="JDBC">
- ...
- <dataSource type="POOLED">
- ...
- </environment>
- <environment id="production">
- <transactionManager type="MANAGED">
- ...
- <dataSource type="JNDI">
- ...
- </environment>
- </environments>
版本要求3.4.2开始
(1)开启默认参数
- <properties resource="org/mybatis/example/config.properties">
- <!-- Enable this feature -->
- <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
- </properties>
- <dataSource type="POOLED">
- <!-- If 'username' property not present, username become 'ut_user' -->
- <property name="username" value="${username:ut_user}"/>
- </dataSource>
如果key名字是"db:username"这种带有冒号,或者变量使用了三元操作符${tableName != null ? tableName : 'global_constants'})
替换指定默认参数值的冒号:为?:
- <properties resource="org/mybatis/example/config.properties">
- <!-- Change default value of separator -->
- <property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/>
- </properties>
- <dataSource type="POOLED">
- <!-- ... -->
- <property name="username" value="${db:username?:ut_user}"/>
- </dataSource>
1. 直接使用xml
- SqlSessionFactory build(InputStream inputStream)
- SqlSessionFactory build(InputStream inputStream, String environment)
- SqlSessionFactory build(InputStream inputStream, Properties properties)
- SqlSessionFactory build(InputStream inputStream, String env, Properties props)
2. 使用configuratino类
SqlSessionFactory build(Configuration config)
- SqlSession openSession()
- SqlSession openSession(boolean autoCommit)
- SqlSession openSession(Connection connection)
- SqlSession openSession(TransactionIsolationLevel level)
- SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level)
- SqlSession openSession(ExecutorType execType)
- SqlSession openSession(ExecutorType execType, boolean autoCommit)
- SqlSession openSession(ExecutorType execType, Connection connection)
- Configuration getConfiguration();
- <T> T selectOne(String statement, Object parameter)
- <E> List<E> selectList(String statement, Object parameter)
- <T> Cursor<T> selectCursor(String statement, Object parameter)
- <K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey)
- int insert(String statement, Object parameter)
- int update(String statement, Object parameter)
- int delete(String statement, Object parameter)
5. select的cursor方法返回一个cursor对象,使用Iterator来懒加载
- try (Cursor<MyEntity> entities = session.selectCursor(statement, param)) {
- for (MyEntity entity : entities) {
- // process one entity
- }
- }
特点:
- <E> List<E> selectList (String statement, Object parameter, RowBounds rowBounds)
- <T> Cursor<T> selectCursor(String statement, Object parameter, RowBounds rowBounds)
- <K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowbounds)
- void select (String statement, Object parameter, ResultHandler<T> handler)
- void select (String statement, Object parameter, RowBounds rowBounds, ResultHandler<T> handler)
参数解释:
1. RowBounds: 可以指定要跳过的记录数量(offset),可以限制返回的记录数量(limit)
- int offset = 100;
- int limit = 25;
- RowBounds rowBounds = new RowBounds(offset, limit);
2. 对结果指定自定义处理逻辑
void select (String statement, Object parameter, RowBounds rowBounds, ResultHandler<T> handler)
- package org.apache.ibatis.session;
- public interface ResultHandler<T> {
- void handleResult(ResultContext<? extends T> context);
- }
参考:https://mybatis.org/mybatis-3/java-api.html
Sqlsession实例的下列方法可强制刷新缓存中的数据到db,必须ExecutorType的值为ExecutorType.BATCH时才有效
List<BatchResult> flushStatements()
事务管理器
mybatis默认对事务的commit方式、rollback方式
可以在方法中使用的强制commit、rollback方式,那种情况下强制commit、rollback才会生效?
Auto-commit模式下、或者使用外部事务管理器时(只有使用JDBC事务管理器时才能使用强制commit、rollback)
默认情况下,当使用mybatis的insert、update、delete方法后,mybatis检测到数据库的数据发生了change就会commit
使用框架时,看框架的事务管理注解,,
每个session都一个local caceh,相同parameter的select不会真的查询db,而是从local cache中拿
范围:session级别、语句级别:默认session级别
localCacheScope=STATEMENT
作用:
解决循环引用并加快重复的嵌套查询,具体例子?
不要修改mybatis返回数据的内容:因为默认session级别,相同parameter的会直接返回local cache中的缓存对象的引用,所以修改之后就会影响后续相同参数的查询结果
void clearCache()
- void close()
-
- try (SqlSession session = sqlSessionFactory.openSession()) {
- // following 3 lines are pseudocode for "doing some work"
- session.insert(...);
- session.update(...);
- session.delete(...);
- session.commit();
- }
好处:对于IDE、unit test更友好,不用重写编写CURD代码
【mapper的注解】
注解和xml中的配置有对象参数配置
多种类型:
1.匿名内部类
2.流式写法
3.带条件判断写法
参考:https://mybatis.org/mybatis-3/statement-builders.html
Configuration元素中的子元素必须按照下列顺序来排列,否则报错
- configuration
- properties
- settings
- typeAliases
- typeHandlers
- objectFactory
- plugins
- environments
- environment
- transactionManager
- dataSource
- databaseIdProvider
- mappers
alias指使用“别名”而不使用 java bean的全限定类名,使得写起来更简单
1. 指定别名的第一种方式:一个类一个类的指定
- <typeAliases>
- <typeAlias alias="Author" type="domain.blog.Author"/>
- <typeAlias alias="Blog" type="domain.blog.Blog"/>
- <typeAlias alias="Comment" type="domain.blog.Comment"/>
- <typeAlias alias="Post" type="domain.blog.Post"/>
- <typeAlias alias="Section" type="domain.blog.Section"/>
- <typeAlias alias="Tag" type="domain.blog.Tag"/>
- </typeAliases>
- <typeAliases>
- <package name="domain.blog"/>
- </typeAliases>
domain.blog.Author的别名时author
(2)包里的java bean上有@Alias注解,别名就是注解值
- @Alias("author")
- public class Author {
- ...
- }
typehandler的作用
实现自定义typehandler
将typehandler注册到mybatis
参考:https://mybatis.org/mybatis-3/configuration.html#properties
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。