<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/powernode"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="CarMapper.xml"/></mappers>
</configuration>
-
configuration
:根标签,表示配置信息。 -
environments
:环境(多个),以“s”结尾表示复数,也就是说mybatis的环境可以配置多个数据源。- default属性:表示默认使用的是哪个环境,default后面填写的是environment的id。default的值只需要和environment的id值一致即可。
-
environment
:具体的环境配置(主要包括:事务管理器的配置 + 数据源的配置)- id:给当前环境一个唯一标识,该标识用在environments的default后面,用来指定默认环境的选择。
-
transactionManager
:配置事务管理器- type属性:指定事务管理器具体使用什么方式,可选值包括两个
JDBC
:使用JDBC原生的事务管理机制。底层原理:事务开启conn.setAutoCommit(false); …处理业务…事务提交conn.commit();MANAGED
:交给其它容器来管理事务,比如WebLogic、JBOSS等。如果没有管理事务的容器,则没有事务。没有事务的含义:只要执行一条DML语句,则提交一次。
- type属性:指定事务管理器具体使用什么方式,可选值包括两个
-
dataSource
:指定数据源- type属性:用来指定具体使用的数据库连接池的策略,可选值包括三个
-
UNPOOLED
:采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。- property可以是:
- driver 这是 JDBC 驱动的 Java 类全限定名。
- url 这是数据库的 JDBC URL 地址。
- username 登录数据库的用户名。
- password 登录数据库的密码。
- defaultTransactionIsolationLevel 默认的连接事务隔离级别。
- defaultNetworkTimeout 等待数据库操作完成的默认网络超时时间(单位:毫秒)
- property可以是:
-
POOLED
:采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现。- property可以是(除了包含UNPOOLED中之外)
- poolMaximumActiveConnections 在任意时间可存在的活动(正在使用)连接数量,默认值:10
- poolMaximumIdleConnections 任意时间可能存在的空闲连接数。
- 其它…
- property可以是(除了包含UNPOOLED中之外)
-
JNDI
:采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样。如果不是web或者maven的war工程,JNDI是不能使用的。- property可以是(最多只包含以下两个属性):
- initial_context 这个属性用来在 InitialContext 中寻找上下文(即,initialContext.lookup(initial_context))这是个可选属性,如果忽略,那么将会直接从 InitialContext 中寻找 data_source 属性。
- data_source 这是引用数据源实例位置的上下文路径。提供了 initial_context 配置时会在其返回的上下文中进行查找,没有提供时则直接在 InitialContext 中查找。
- property可以是(最多只包含以下两个属性):
-
- type属性:用来指定具体使用的数据库连接池的策略,可选值包括三个
-
mappers
:SQL映射文件的配置方式包括四种:- resource:从类路径中加载
- url:从指定的全限定资源路径中加载
- class:使用映射器接口实现类的完全限定类名
- package:将包内的映射器接口实现全部注册为映射器
一、environment
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--默认使用开发环境--><!--<environments default="dev">--><!--默认使用生产环境--><environments default="production"><!--开发环境--><environment id="dev"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/powernode"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment><!--生产环境--><environment id="production"><transactionManager type="JDBC" /><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="CarMapper.xml"/></mappers>
</configuration>
CarMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="car"><insert id="insertCar">insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})</insert>
</mapper>
Test.java
public class Test {@Testpublic void testEnvironment() throws Exception{// 准备数据Car car = new Car();car.setCarNum("133");car.setBrand("丰田霸道");car.setGuidePrice(50.3);car.setProduceTime("2020-01-10");car.setCarType("燃油车");// 一个数据库对应一个SqlSessionFactory对象// 两个数据库对应两个SqlSessionFactory对象,以此类推SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();// 使用默认数据库SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));SqlSession sqlSession = sqlSessionFactory.openSession(true);int count = sqlSession.insert("insertCar", car);System.out.println("插入了几条记录:" + count);// 使用指定数据库SqlSessionFactory sqlSessionFactory1 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "dev");SqlSession sqlSession1 = sqlSessionFactory1.openSession(true);int count1 = sqlSession1.insert("insertCar", car);System.out.println("插入了几条记录:" + count1);}
}
二、transactionManager
mybatis-config2.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="dev"><environment id="dev"><transactionManager type="MANAGED"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/powernode"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="CarMapper.xml"/></mappers>
</configuration>
Test.java
@Test
public void Test() throws Exception{// 准备数据Car car = new Car();car.setCarNum("133");car.setBrand("丰田霸道");car.setGuidePrice(50.3);car.setProduceTime("2020-01-10");car.setCarType("燃油车");// 获取SqlSessionFactory对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config2.xml"));// 获取SqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession();// 执行SQLint count = sqlSession.insert("insertCar", car);System.out.println("插入了几条记录:" + count);
}
当事务管理器是:JDBC
- 采用JDBC的原生事务机制:
○ 开启事务:conn.setAutoCommit(false);
○ 处理业务…
○ 提交事务:conn.commit();
当事务管理器是:MANAGED
- 交给容器去管理事务,但目前使用的是本地程序,没有容器的支持,
当mybatis找不到容器的支持时:没有事务
。也就是说只要执行一条DML语句,则提交一次。
三、dataSource
mybatis-config3.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="dev"><environment id="dev"><transactionManager type="JDBC"/><dataSource type="UNPOOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/powernode"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="CarMapper.xml"/></mappers>
</configuration>
Test.java
@Test
public void testDataSource() throws Exception{// 准备数据Car car = new Car();car.setCarNum("133");car.setBrand("丰田霸道");car.setGuidePrice(50.3);car.setProduceTime("2020-01-10");car.setCarType("燃油车");// 获取SqlSessionFactory对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config3.xml"));// 获取SqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession(true);// 执行SQLint count = sqlSession.insert("insertCar", car);System.out.println("插入了几条记录:" + count);// 关闭会话sqlSession.close();
}
当type是UNPOOLED,控制台输出:
修改配置文件mybatis-config3.xml中的配置:
<dataSource type="POOLED">
Java测试程序不需要修改,直接执行,看控制台输出:
通过测试得出:UNPOOLED不会使用连接池,每一次都会新建JDBC连接对象。POOLED会使用数据库连接池。【这个连接池是mybatis自己实现的。】
这种再重点说一下type="POOLED"的时候,它的属性有哪些?
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="dev"><environment id="dev"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/powernode"/><property name="username" value="root"/><property name="password" value="root"/><!--最大连接数--><property name="poolMaximumActiveConnections" value="3"/><!--这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直失败且不打印日志),默认值:20000 毫秒(即 20 秒)。--><property name="poolTimeToWait" value="20000"/><!--强行回归池的时间--><property name="poolMaximumCheckoutTime" value="20000"/><!--最多空闲数量--><property name="poolMaximumIdleConnections" value="1"/></dataSource></environment></environments><mappers><mapper resource="CarMapper.xml"/></mappers>
</configuration>
poolMaximumActiveConnections
:最大的活动的连接数量。默认值10
poolMaximumIdleConnections
:最大的空闲连接数量。默认值5
poolMaximumCheckoutTime
:强行回归池的时间。默认值20秒。
poolTimeToWait
:当无法获取到空闲连接时,每隔20秒打印一次日志,避免因代码配置有误,导致傻等。(时长是可以配置的)
当然,还有其他属性。对于连接池来说,以上几个属性比较重要。
JNDI的方式:表示对接JNDI服务器中的连接池。这种方式给了我们可以使用第三方连接池的接口。如果想使用dbcp、c3p0、druid(德鲁伊)等,需要使用这种方式。
四、properties
mybatis提供了更加灵活的配置,连接数据库的信息可以单独写到一个属性资源文件中,假设在类的根路径下创建jdbc.properties文件,配置如下:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/数据库名称
jdbc.username=root
jdbc.password=123456
在mybatis核心配置文件中引入并使用:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--引入外部属性资源文件--><properties resource="jdbc.properties"/><environments default="dev"><environment id="dev"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--${key}使用--><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></environments><mappers><mapper resource="CarMapper.xml"/></mappers>
</configuration>
properties两个属性:
resource
:这个属性从类的根路径下开始加载。【常用的。】url
:从指定的url加载,假设文件放在d:/jdbc.properties,这个url可以写成:file:///d:/jdbc.properties。注意是三个斜杠哦。
注意:如果不知道mybatis-config.xml文件中标签的编写顺序的话,可以有两种方式知道它的顺序:
● 第一种方式:查看dtd约束文件。
● 第二种方式:通过idea的报错提示信息。【一般采用这种方式】
五、typeAliases
resultType属性用来指定查询结果集的封装类型,这个名字太长,可以起别名吗?可以。
在mybatis-config.xml文件中使用typeAliases标签来起别名,包括两种方式:
第一种方式:typeAlias
<typeAliases><typeAlias type="com.powernode.mybatis.pojo.Car" alias="Car"/>
</typeAliases>
- 首先要注意typeAliases标签的放置位置,如果不清楚的话,可以看看错误提示信息。
- typeAliases标签中的typeAlias可以写多个。
- typeAlias:
- type属性:指定给哪个类起别名
- alias属性:别名。
- alias属性不是必须的,如果缺省的话,type属性指定的类型名的
简类名(就是去掉包名的类名)
作为别名。 - alias是大小写不敏感的。也就是说假设alias=“Car”,再用的时候,可以CAR,也可以car,也可以Car,都行。
- alias属性不是必须的,如果缺省的话,type属性指定的类型名的
第二种方式:package
如果一个包下的类太多,每个类都要起别名,会导致typeAlias标签配置较多,所以mybatis用提供package的配置方式,只需要指定包名,该包下的所有类都自动起别名,别名就是简类名。并且别名不区分大小写。
<typeAliases><package name="com.powernode.mybatis.pojo"/>
</typeAliases>
六、mappers
resource
这种方式是从类路径中加载配置文件,所以这种方式要求SQL映射文件必须放在resources目录下或其子目录下。
<mappers><mapper resource="org/mybatis/builder/AuthorMapper.xml"/><mapper resource="org/mybatis/builder/BlogMapper.xml"/><mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
url
这种方式显然使用了绝对路径的方式,这种配置对SQL映射文件存放的位置没有要求,随意。
<mappers><mapper url="file:///var/mappers/AuthorMapper.xml"/><mapper url="file:///var/mappers/BlogMapper.xml"/><mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
class
如果使用这种方式必须满足以下条件:
- SQL映射文件和mapper接口放在同一个目录下。
- SQL映射文件的名字也必须和mapper接口名一致。
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers><mapper class="org.mybatis.builder.AuthorMapper"/><mapper class="org.mybatis.builder.BlogMapper"/><mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
注意:将XxxMapper.xml文件移动到和mapper接口同一个目录下:
- 在resources目录下新建:com/powernode/mybatis/mapper【这里千万要注意:
不能这样新建 com.powernode.mybatis.mapper
】 - 将XxxMapper.xml文件移动到mapper目录下
package
如果class较多,可以使用这种package的方式,但前提条件和上一种方式一样。
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers><package name="com.powernode.mybatis.mapper"/>
</mappers>