environment
环境
在介绍environment前,还有一个environments标签,这个标签中可以含有多个environment标签
<!--environments标签中可以有多个environment标签-->
<!--一个环境对应一个数据库 连接的数据库是p_mybatis-->
<!--一个数据库会对应一个SqlSessionFactory对象-->
<environments default="p_mybatis_TwoDB">
<!--一个环境对应一个数据库 连接的数据库是p_mybatis-->
<!--一个数据库会对应一个SqlSessionFactory对象-->
<environment id="p_mybatisDB">
………………
</environment>
<!--第二个环境-->
<environment id="p_mybatis_TwoDB">
………………
</environment>
</environments>
其中default这个属性的值为environment标签的id,代表的是使用对应id的环境,在Java程序中未指定环境id时,默认使用dafault所代表的环境
transactionManager
事务管理
<!--environments标签中可以有多个environment标签-->
<!--一个环境对应一个数据库 连接的数据库是p_mybatis-->
<!--一个数据库会对应一个SqlSessionFactory对象-->
<environments default="p_mybatis_TwoDB">
<!--一个环境对应一个数据库 连接的数据库是p_mybatis-->
<!--一个数据库会对应一个SqlSessionFactory对象-->
<environment id="p_mybatisDB">
<transactionManager type="JDBC"/>
</environment>
<!--第二个环境-->
<environment id="p_mybatis_TwoDB">
………………
</environment>
</environments>
在mybatis-config.xml文件中,可以通过以下的配置进行mybatis的事务管理
< transactionManager type=“JDBC” />
transactionManager标签中的type属性可以是
- JDBC(jdbc) JDBC事务管理器
mybatis框架自己管理事务,自己采用原生的JDBC代码去管理事务:
conn.setAutoCommit(false); 开启事务。
....业务处理...
conn.commit(); 手动提交事务
使用JDBC事务管理器的话,底层创建的事务管理器对象:JdbcTransaction对象。
如果你编写的代码是下面的代码:
SqlSession sqlSession = sqlSessionFactory.openSession(true);
表示没有开启事务。因为这种方式压根不会执行:
conn.setAutoCommit(false);
在JDBC事务中,没有执行conn.setAutoCommit(false);
那么autoCommit
就是true。
如果autoCommit
是true
,就表示没有开启事务。只要执行任意一条DML语句就提交一次。
2. MANAGED(managed) MANAGED事务管理器
mybatis不再负责事务的管理了。事务管理交给其它容器来负责。例如:spring。
- 我不管事务了,你来负责吧。
- 对于我们当前的单纯的只有mybatis的情况下,如果配置为:MANAGED
- 那么事务这块是没人管的。没有人管理事务表示事务压根没有开启。
- 没有人管理事务就是没有事务。
dataSource
数据源
<environment id="p_mybatisDB">
<transactionManager type="JDBC"/>
<!--UPOOLED:不使用连接池技术,每次请求过后重新创建连接
POOLED: 使用mybatis自带的数据库连接池
JNDI:使用第三方的数据库连接池 如:德鲁伊德 C3p0 ……-->
<dataSource type="POOLED">
…………
</dataSource>
</environment>
dataSource标签的type有三种值
- UPOOLED:不使用连接池技术,每次请求过后重新创建连接
- POOLED: 使用mybatis自带的数据库连接池
- JNDI:使用第三方提供的数据库连接池,如:C3p0、德鲁伊德……
properties
mybatis提供了更加灵活的配置,连接数据库的信息可以单独写到⼀个属性资源⽂件中,假设在类的根路径下创建jdbc.properties⽂件,
配置如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/p_mybatis
jdbc.username=root
jdbc.password=hyp
在mybatis-config.xml文件中进行配置
<!--将数据库连接池配置文件引入-->
<properties resource="jdbc.properties"></properties>
这样一来就可以将dataSource标签中的信息使用properties配置文件中的键值对进行代替,方便数据源的管理
<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>
mapper
mapper是mappers的子标签,mappers下可以有多个mapper标签
mapper标签⽤来指定SQL映射⽂件的路径,包含多种指定⽅式,这⾥先主要看其中两种:
- 从类的根路径下开始加载【常用】
<mappers>
<!--sql映射⽂件创建好之后,需要将该⽂件路径配置到这⾥-->
<!--执行XXXMapper.xml文件的路径,-->
<!--resource属性会自动从类的根目录下开始查找资源,
而XXMapper.xml文件刚好在resource目录下,所以不用在这里加任何东西 -->
<mapper resource="XXXMapper.xml"/>
</mappers>
如果是这样写的话,必须保证类的根下有XXXMapper.xml
⽂件
如果类的根路径下有⼀个包叫做test,CarMapper.xml如果放在test包下的话,这个配置应该是这样写:
<mapper resource="test/XXXMapper.xml"/>
- 从电脑本地磁盘加载
<mapper url="file:///d:/CarMapper.xml"/>