【MyBatis】核心配置文件,三大对象的作用域,#{}和${}的区别

简介: 【MyBatis】核心配置文件,三大对象的作用域,#{}和${}的区别

1. environment环境:

  • 一般一个环境environment会对应一个SqlSessionFactory对象
  • sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"),"另一个环境的id");
// 数据库环境配置在这个标签里
// 这里的default表示默认使用的环境
<environments default="">
    // 一般一个环境environment会对应一个SqlSessionFactory对象
    <environment id="">
    </environment>
    // 这是mybatis的另一个环境, 连接的数据库是另外一个数据库
    <environment id="">
    </environment>
</environments>
// @test
public static void main(String[] args) {
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    // 获取默认的环境
    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 通过环境id来使用指定的环境
    SqlSessionFactory sqlSessionFactory1 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"),"另一个环境的id");
    SqlSession sqlSession1 = sqlSessionFactory1.openSession();
}

2. 事务管理器:

  • 核心配置文件的transactionManager标签中的type只能选 JDBC / MANAGED (不区分大小写)
  • 作用是配置事务管理器, 指定mybatis具体使用什么方式去管理事务.
  • JDBC: 使用原生的jdbc代码来管理事务.如下:
conn.setAuotCommit(false);
...业务处理...
conn.commit();
  • MANAGED: mybatis不再负责事务的管理, 将事务交给其他的容器来管理.
Transaction接口, 有俩个实现类(JdbcTransaction/ManagedTransaction)
如果type="jdbc", 那么底层会实例化JDBCTransaction对象
如果type="managed", 那么底层会实例化ManagedTransaction对象

3. 对数据源的分析:

  • 核心配置文件中的dataSource标签中的dataSource被称为数据源
  • dataSource作用是什么, 为程序提供Connection对象
  • 但凡是给程序提供connection对象的都叫做数据源
  • 数据源实际上是一套规范, JDK中有这套规范: javax.sql.DataSource.
  • 我们自己也可以编写数据源组件, 只要实现javax.sql.DataSource接口就行了, 实现接口中的所有方法
  • 数据库连接池是提供连接对象的, 所以数据库连接池就是一个数据源
  • 常见的数据源组件有哪些(常见的数据库连接池有哪些): 阿里巴巴的德鲁伊连接池, c3p0...
  • type属性可以用来指定数据源的类型, 就是指定具体使用什么方式来获取Connection对象
  • type属性有三个值: unpooled, pooled, jndi
  • unpooled: 不使用数据库连接池技术, 每一次请求过来之后, 都是创建新的Connection对象.
  • pooled: 使用mybatis自己实现的数据库连接池
  • jndi: 集成其他第三方的数据库连接池
  • 不同的配置, 所需要的属性都不一样.参考下图:

4. properties标签的配置和使用:

4.1 方式一:

  • 在核心配置文件中配置properties
  • Properties类是一个Map集合, key和value都是String类型的
  • 注意使用${}
// Properties类是一个Map集合, key和value都是String类型的
<properties>
     <property name="jdbc.driver" value="..."/>
     <property name="jdbc.url" value="..."/>
     <property name="jdbc.username" value="..."/>
     <property name="jdbc.password" value="..."/>
</properties>
<environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
        <property name="driver" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </dataSource>
</environment>

4.2 方式二:

  • 写一个properties为后缀的文件
  • 这种方式更好
// jdbc.properties文件
jdbc.driver=...
jdbc.url=...
jdbc.username=...
jdbc.password=...
// mybatis-config.xml
<properties resource=""jdbc.properties"/>
<environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
        <property name="driver" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </dataSource>
</environment>

5. 三大对象的作用域:

5.1 SqlSessionFactoryBuilder:

  • 这个类可以被实例化, 一旦创建了SqlSessionFactory就不再需要它了
  • 所以SqlSessionFactoryBuilder的作用就是创建SqlSessionFactory

5.2 SqlSessionFactory:

  • SqlSessionFactory一旦创建就应该在应用运行期间一直存在
  • 不要重复创建SqlSessionFactory对象, 建议放在静态代码块中
  • 一个数据库对应一个SqlSessionFactory对象
  • Mybatis的核心配置文件, 没有必要重复解析, 只需要在服务器启动的时候解析一次就行

5.3 SqlSession:

  • 一个线程对应一个SqlSession对象, 因为一个线程对应一个事务
  • SqlSession的实例不是线程安全的

6. #{}和${}的区别:

  • #{}占位符
1. 先进行sql语句的编译, 再给占位符传值
2. 底层是PreparedStatement实现
3. 可以防止sql注入, 不知道用户输入的信息是啥, 所以优先使用#{}.
  • ${}占位符
1. 先进行sql语句拼接, 然后再编译sql语句
2. 底层是Statement实现 
3. 存在sql注入现象, 只有在需要进行sql语句关键字拼接的情况下才会用到
4. 如果传入的是关键字(asc/desc), 那就需要使用${}才行, 因为#{}是以值的形式放到sql语句中
5. 拼接表名的时候需要使用${}


相关文章
|
1月前
|
XML Java 数据库连接
mybatis环境搭建步骤(含配置文件代码)
mybatis环境搭建步骤(含配置文件代码)
|
1月前
|
SQL Java 数据库连接
hibernate和mybatis的区别
hibernate和mybatis的区别
|
22天前
|
XML Java 数据库连接
MyBatis入门——MyBatis XML配置文件(3)
MyBatis入门——MyBatis XML配置文件(3)
25 5
|
1月前
|
缓存 Java 数据库连接
【MyBatis】主配置文件
【MyBatis】主配置文件
36 0
|
6天前
|
SQL XML Java
蓝易云 - ibatis与mybatis的区别
总的来说,MyBatis在功能性和易用性上都优于iBatis,是iBatis的改进版。
6 2
|
1月前
|
XML Java 数据库连接
【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......
【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......
99 0
|
5天前
|
SQL Java 数据库连接
【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别
【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别
12 0
|
1月前
|
SQL Java 数据库连接
Mybatis快速入门,Mybatis的核心配置文件
Mybatis快速入门,Mybatis的核心配置文件
28 1
|
1月前
|
SQL Java 数据库连接
深度解析MyBatis核心:探寻其核心对象的精妙设计
深度解析MyBatis核心:探寻其核心对象的精妙设计
46 1
深度解析MyBatis核心:探寻其核心对象的精妙设计
|
1月前
|
SQL Java 数据库连接
15:MyBatis对象关系与映射结构-Java Spring
15:MyBatis对象关系与映射结构-Java Spring
47 4