当前位置:   article > 正文

mybatis基础:sqlsession、连接配置、db配置加载顺序等_dbsqlsession

dbsqlsession

目录

1.SqlSession和SqlSessionFactory

2.springboot,Guice框架中的SqlSessions=

3 properties

3.1 db的属性加载顺序

3.2 mybatis xml文件中变量指定默认参数

4.不同的方式构建SqlSessionFactory,两大类

5.创建SqlSession instances的多种方式

6.Sqlsession的CRUD方法

7. Sqlsession的高级select方法

9. 强制刷新批量插入模式下缓存中的数据到db

10.事务管理控制方法

11.local cache

12. 显式清除本地缓存

13. 确认sqlsession被关闭-try块自动关闭

14.使用mapper来CRUD

15.友好的java code拼接sql工具代码

16.mybatis-xml配置

17.Setting-db运行时的一些关键参数设置

18.typeAliases

19.typehandler


1.SqlSession和SqlSessionFactory

  1. 1. SqlSession用于CRUD
  2. 2. SqlSession使用SqlSessionFactory创建
  3. 3. SqlSessionFactory使用SqlSessionFactoryBuilder创建
  4. 4. SqlSessionFactoryBuilder可以通过读取xml配置文件创建
  • 提示:mybatis的Resources 类可以读取classpath的文件

2.springboot,Guice框架中的SqlSessions=

像springboot、Guice这些依赖注入的框架中的sqlsession是由框架来自动注入的,所以开发者不需要手动使用SqlSessionFactoryBuilder、SqlSessionFactory来创建 sqlsession,直接使用@autowire注入 sqlsession实例,然后使用即可

3 properties

可以在xml配置文件中读入环境变量,${propName},propName就是一个环境变量

  1. <dataSource type="POOLED">
  2.   <property name="driver" value="${driver}"/>
  3.   <property name="url" value="${url}"/>
  4.   <property name="username" value="${username}"/>
  5.   <property name="password" value="${password}"/>
  6. </dataSource>

3.1 db的属性加载顺序

1.首先读取 xml 配置中的 <properties></properties>中的连接配置

  1. <properties>
  2. <property name="driver"value=""/>
  3. <property name="url"value="jdbc:sqlserver://"/>
  4. <property name="username"value=""/>
  5. <property name="password"value=""/>
  6. </properties>

2.然后读取从resource属性值指定的配置文件中的属性,将覆盖和上一步中重复的属性值

  1. <properties resource="org/mybatis/example/config.properties">
  2. </properties>
3.最后读取从方法参数中传入的 连接属性, 即下列的 props 参数,覆盖上述的(1)xml < properties> < properties/>(2)resource属性值的配置文件中的重复属性
  1. SqlSessionFactory factory =
  2. sqlSesionFactoryBuilder.build(reader, props);
  3. // ... or …
  4. SqlSessionFactory factory =
  5. new SqlSessionFactoryBuilder.build(reader, environment, props)
  1. <environments default="development">
  2.   <environment id="development">
  3.     <transactionManager type="JDBC">
  4.         ...
  5.     <dataSource type="POOLED">
  6.         ...
  7.   </environment>
  8.   <environment id="production">
  9.     <transactionManager type="MANAGED">
  10.         ...
  11.     <dataSource type="JNDI">
  12.         ...
  13.   </environment>
  14. </environments>

3.2 mybatis xml文件中变量指定默认参数

版本要求3.4.2开始

(1)开启默认参数

  1. <properties resource="org/mybatis/example/config.properties">
  2.   <!-- Enable this feature -->
  3.   <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
  4. </properties>
(2)使用默认参数
  1. <dataSource type="POOLED">
  2.   <!-- If 'username' property not present, username become 'ut_user' -->
  3.   <property name="username" value="${username:ut_user}"/>
  4. </dataSource>
(3)默认参数时特殊eky名字

如果key名字是"db:username"这种带有冒号,或者变量使用了三元操作符${tableName != null ? tableName : 'global_constants'})

替换指定默认参数值的冒号:为?:

  1. <properties resource="org/mybatis/example/config.properties">
  2.   <!-- Change default value of separator -->
  3.   <property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/>
  4. </properties>
指定默认参数值时使用?:
  1. <dataSource type="POOLED">
  2.   <!-- ... -->
  3.   <property name="username" value="${db:username?:ut_user}"/>
  4. </dataSource>

4.不同的方式构建SqlSessionFactory,两大类

1. 直接使用xml

  1. SqlSessionFactory build(InputStream inputStream)
  2. SqlSessionFactory build(InputStream inputStream, String environment)
  3. SqlSessionFactory build(InputStream inputStream, Properties properties)
  4. SqlSessionFactory build(InputStream inputStream, String env, Properties props)

2. 使用configuratino类

SqlSessionFactory build(Configuration config)

 

5.创建SqlSession instances的多种方式

  1. SqlSession openSession()
  2. SqlSession openSession(boolean autoCommit)
  3. SqlSession openSession(Connection connection)
  4. SqlSession openSession(TransactionIsolationLevel level)
  5. SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level)
  6. SqlSession openSession(ExecutorType execType)
  7. SqlSession openSession(ExecutorType execType, boolean autoCommit)
  8. SqlSession openSession(ExecutorType execType, Connection connection)
  9. Configuration getConfiguration();
方法参数解释:
  1. 1.autoCommit :为true时就自动提交事务
  2. 2.Connection:传递一个Connection 实例就可以让mybatis实例使用自己提供的connectino实例
  3. 3.TransactionIsolationLevel:mybatis的隔离级别枚举类
    4.
    ExecutorType:mybatis执行语句的方式枚举
  4. mybatis的四种隔离:
  5. 1. NONE
  6. 2. READ_UNCOMMITTED
  7. 3. READ_COMMITTED
  8. 4. REPEATABLE_READ
  9. 5. SERIALIZABLE

6.SqlsessionCRUD方法

  1. 查询一个:selectOne
  2. 查询列表:selectList
  3. 按照游标查询:selectCursor
  4. 查询返回map:selectMap
  1. <T> T selectOne(String statement, Object parameter)
  2. <E> List<E> selectList(String statement, Object parameter)
  3. <T> Cursor<T> selectCursor(String statement, Object parameter)
  4. <K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey)
  5. int insert(String statement, Object parameter)
  6. int update(String statement, Object parameter)
  7. int delete(String statement, Object parameter)
查询方法解释:
  1. 1. parameter obj是什么?类型可以是a primitive (auto-boxed or wrapper), a JavaBean, a POJO or a Map
  2. 2. selectone最多只能返回一个,多了报错
  3. 3. selectList返回list,selectMap把返回值转化为map,parameter对象参数是可选的,这些方法都重载了
  4. 4. insert、update、delete方法返回值都是影响的行数

5. select的cursor方法返回一个cursor对象,使用Iterator来懒加载

  1. try (Cursor<MyEntity> entities = session.selectCursor(statement, param)) {
  2.    for (MyEntity entity : entities) {
  3.       // process one entity
  4.    }
  5. }

7. Sqlsession的高级select方法

特点:

  1. 1. 限制返回的行数范围
  2. 2. 对返回的结果提供自定义处理逻辑
    1. <E> List<E> selectList (String statement, Object parameter, RowBounds rowBounds)
    2. <T> Cursor<T> selectCursor(String statement, Object parameter, RowBounds rowBounds)
    3. <K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowbounds)
    4. void select (String statement, Object parameter, ResultHandler<T> handler)
    5. void select (String statement, Object parameter, RowBounds rowBounds, ResultHandler<T> handler)

    参数解释:

  3. 1. RowBounds: 可以指定要跳过的记录数量(offset),可以限制返回的记录数量(limit)

    1. int offset = 100;
    2. int limit = 25;
    3. RowBounds rowBounds = new RowBounds(offset, limit);

    2. 对结果指定自定义处理逻辑

void select (String statement, Object parameter, RowBounds rowBounds, ResultHandler<T> handler)
  1. package org.apache.ibatis.session;
  2. public interface ResultHandler<T> {
  3.   void handleResult(ResultContext<? extends T> context);
  4. }

参考:https://mybatis.org/mybatis-3/java-api.html

9. 强制刷新批量插入模式下缓存中的数据到db

Sqlsession实例的下列方法可强制刷新缓存中的数据到db,必须ExecutorType的值为ExecutorType.BATCH时才有效

List<BatchResult> flushStatements()

10.事务管理控制方法

事务管理器

mybatis默认对事务的commit方式、rollback方式

可以在方法中使用的强制commit、rollback方式,那种情况下强制commit、rollback才会生效?

Auto-commit模式下、或者使用外部事务管理器时(只有使用JDBC事务管理器时才能使用强制commit、rollback)

默认情况下,当使用mybatis的insert、update、delete方法后,mybatis检测到数据库的数据发生了change就会commit

使用框架时,看框架的事务管理注解,,

11.local cache

每个session都一个local caceh,相同parameter的select不会真的查询db,而是从local cache中拿

范围:session级别、语句级别:默认session级别

localCacheScope=STATEMENT

作用:

解决循环引用并加快重复的嵌套查询,具体例子?

不要修改mybatis返回数据的内容:因为默认session级别,相同parameter的会直接返回local cache中的缓存对象的引用,所以修改之后就会影响后续相同参数的查询结果

12. 显式清除本地缓存

void clearCache()

13. 确认sqlsession被关闭-try块自动关闭

  1. void close()​​​​​​​
  2. try (SqlSession session = sqlSessionFactory.openSession()) {
  3.     // following 3 lines are pseudocode for "doing some work"
  4.     session.insert(...);
  5.     session.update(...);
  6.     session.delete(...);
  7.     session.commit();
  8. }

14.使用mapper来CRUD

好处:对于IDE、unit test更友好,不用重写编写CURD代码

【mapper的注解】

注解和xml中的配置有对象参数配置

15.友好的java code拼接sql工具代码

多种类型:

1.匿名内部类

2.流式写法

3.带条件判断写法

参考:https://mybatis.org/mybatis-3/statement-builders.html

16.mybatis-xml配置

Configuration元素中的子元素必须按照下列顺序来排列,否则报错

  1. configuration
  2. properties
  3. settings
  4. typeAliases
  5. typeHandlers
  6. objectFactory
  7. plugins
  8. environments
  9. environment
  10. transactionManager
  11. dataSource
  12. databaseIdProvider
  13. mappers

17.Setting-db运行时的一些关键参数设置

18.typeAliases

alias指使用“别名”而不使用 java bean的全限定类名,使得写起来更简单

1. 指定别名的第一种方式:一个类一个类的指定

  1. <typeAliases>
  2.   <typeAlias alias="Author" type="domain.blog.Author"/>
  3.   <typeAlias alias="Blog" type="domain.blog.Blog"/>
  4.   <typeAlias alias="Comment" type="domain.blog.Comment"/>
  5.   <typeAlias alias="Post" type="domain.blog.Post"/>
  6.   <typeAlias alias="Section" type="domain.blog.Section"/>
  7.   <typeAlias alias="Tag" type="domain.blog.Tag"/>
  8. </typeAliases>
2. 指定别名的第二种方式: 直接指定一个包
  1. <typeAliases>
  2.   <package name="domain.blog"/>
  3. </typeAliases>
指定包时,每个java bean的别名如何指定?
(1)包里的java bean没有 @Alias注解
包里的类上没有 @Alias注解时, 则包里的所有这种类的别名为其首字母小写的名字,比如

domain.blog.Author的别名时author

(2)包里的java bean上有@Alias注解,别名就是注解值

  1. @Alias("author")
  2. public class Author {
  3.     ...
  4. }

19.typehandler

typehandler的作用

实现自定义typehandler

将typehandler注册到mybatis

参考:https://mybatis.org/mybatis-3/configuration.html#properties

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/158252
推荐阅读
相关标签
  

闽ICP备14008679号