MyBatis操作数据库及全局配置文件
一、MyBatis简介
1、MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。
2、MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
3、MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
4、为什么要使用MyBatis
-
- MyBatis是一个半自动化的持久化层框架。
- 对开发人员而言,核心sql还是需要自己优化
- sql和java编码分开,功能边界清晰,一个专注业务、 一个专注数据。
- JDBC:
- SQL夹在Java代码块里,耦合度高导致硬编码内伤
- 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
- Hibernate和JPA
- 长难复杂SQL,对于Hibernate而言处理也不容易
- 内部自动生产的SQL,不容易做特殊优化。
- 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。 导致数据库性能下降。
- MyBatis是一个半自动化的持久化层框架。
二、MyBatis操作数据库
1、创建MyBatis全局配置文件:mybatis-config.xml
-
- MyBatis 的全局配置文件包含了影响MyBatis行为的设置(settings)和属性(properties)信息、如包含数据库连接池信息,事务管理器信息等系统运行环境信息。指导着MyBatis进行工作
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//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.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
<mappers>
<mapper resource="EmployeeMapper.xml" />
</mappers>
</configuration>
2、创建SQL映射文件:EmployeeMapper.xml
-
- 映射文件的作用就相当于是定义Dao接口的实现类如何 工作。这也是我们使用MyBatis时编写的最多的文件,保存了每一个sql语句的映射信息
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.EmployeeMapper">
<!--
namespace:名称空间;指定为接口的全类名
id:唯一标识
resultType:返回值类型
#{id}:从传递过来的参数中取出id值
接口:public Employee getEmpById(Integer id);
-->
<select id="selectEmployee" resultType="bean.Employee">
select id,last_name lastName,email,gender from tbl_employee where id = #{id}
</select>
</mapper>
3、实现方式一
-
- 根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象,有数据源一些运行环境信息
- sql映射文件;配置了每一个sql,以及sql的封装规则等
- 将sql映射文件注册在全局配置文件中
- 写代码:
- 根据全局配置文件得到SqlSessionFactory
- 使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查,一个sqlSession就是代表和数据库的一次会话,用完关闭
- 使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的
@Test
public void test1() throws IOException {
//1、根据全局配置文件,利用SqlSessionFactoryBuilder创建SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2、使用SqlSessionFactory获取sqlSession对象。一个SqlSession对象代表和数据库的一次会话
SqlSession openSession = sqlSessionFactory.openSession();
try {
//3、使用SqlSession根据sql的唯一标志进行操作
Employee employee = openSession.selectOne("dao.EmployeeMapper.selectEmployee", 1);
System.out.println(employee);
} finally {
openSession.close();
}
}
4、实现方式二:使用SqlSession获取映射器进行操作
@Test
public void test1() throws IOException {
//1、根据全局配置文件,利用SqlSessionFactoryBuilder创建SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2、使用SqlSessionFactory获取sqlSession对象。一个SqlSession对象代表和数据库的一次会话
SqlSession openSession = sqlSessionFactory.openSession();
try {
//3、获取接口的实现类对象。会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee employee = mapper.getEmpById(1);
System.out.println(mapper.getClass());
System.out.println(employee);
} finally {
openSession.close();
}
}
5、SqlSession的注意事项
-
- SqlSession 的实例不是线程安全的,因此是不能 被共享的。
- SqlSession每次使用完成后需要正确关闭,这个 关闭操作是必须的
- SqlSession可以直接调用方法的id进行数据库操 作,但是我们一般还是推荐使用SqlSession获取 到Dao接口的代理类,执行代理对象的方法,可以更安全的进行类型检查操作
三、MyBatis-全局配置文件
1、properties属性
第一步:新建dbconfig.properties配置文件,内容如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123456
orcl.driver=oracle.jdbc.OracleDriver
orcl.url=jdbc:oracle:thin:@localhost:1521:orcl
orcl.username=scott
orcl.password=123456
第二步:在mybatis-config.xml表中配置如下标签:表示从配置文件中读取数据
<properties resource="dbconfig.properties"></properties>
第三步:设置变量值
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
注意点:
如果属性在不只一个地方进行了配置,那么MyBatis将按照下面的顺序来加载:
– 在properties元素体内指定的属性首先被读取
– 然后根据properties元素中的resource属性读取类路径下属性文件或根据url属性指定的路径读取属性文件,并覆盖已读取的同名属性
– 最后读取作为方法参数传递的属性,并覆盖已读取的同名属
2、settings设置:它们会改变 MyBatis 的运行时行为
3、environments环境
<environments default="dev_mysql"> //default指定使用某种环境。可以达到快速切换环境
<environment id="dev_mysql">
<transactionManager type="JDBC"></transactionManager>
<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>
<environment id="dev_oracle">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${orcl.driver}" />
<property name="url" value="${orcl.url}" />
<property name="username" value="${orcl.username}" />
<property name="password" value="${orcl.password}" />
</dataSource>
</environment>
</environments>
-
- MyBatis可以配置多种环境,比如开发、测试和生产环境需要有不同的配置
- 每种环境使用一个environment标签进行配置并指定唯一标识符
- 可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境
- id:指定当前环境的唯一标识
- transactionManager type:JDBC | MANAGED | 自定义
- JDBC:使用了JDBC的提交和回滚设置,依赖于从数据源得到的连接来管理事务范围。 实现的JdbcTransactionFactor接口
- MANAGED:不提交或回滚一个连接、让容器来管理事务的整个生命周期(比如JEE应用服务器的上下文)。实现的ManagedTransactionFactory接口
- 自定义:实现TransactionFactory接口,type=全类名/别名
- dataSource type: UNPOOLED | POOLED | JNDI | 自定义
- UNPOOLED:不使用连接池, UnpooledDataSourceFactory
- POOLED:使用连接池, PooledDataSourceFactory
- JNDI:在EJB 或应用服务器这类容器中查找指定的数据源
- 自定义:实现DataSourceFactory接口,定义数据源的获取方式。
- 注:实际开发中我们使用Spring管理数据源,并进行 事务控制的配置来覆盖上述配置
4、databaseIdProvider环境
<!--databaseIdProvider:支持多数据库厂商的;
type="DB_VENDOR":使用MyBatis提供的VendorDatabaseIdProvider解析数据库厂商标识(驱动getDatabaseProductName()),mybatis就能根据数据库厂商标识来执行不同的sql;
MySQL,Oracle,SQL Server,xxxx
-->
<databaseIdProvider type="DB_VENDOR">
<!-- 为不同的数据库厂商起别名 -->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
5、mapper映射:将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中
mapper:注册一个sql映射
1、注册配置文件
resource:引用类路径下的sql映射文件,例如:mybatis/mapper/EmployeeMapper.xml
url:引用网路路径或者磁盘路径下的sql映射文件,例如:file:///D:/mappers/AuthorMapper.xml
2、注册接口
class:引用(注册)接口,
1、有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
2、没有sql映射文件,所有的sql都是利用注解写在接口上;
推荐:
比较重要的,复杂的Dao接口我们来写sql映射文件
不重要,简单的Dao接口为了开发快速可以使用注解;
<mappers>
<mapper resource="mybatis/mapper/EmployeeMapper.xml"/>
<mapper url="file:///D:/mappers/AuthorMapper.xml"/>
<mapper class="com.zhufeng.mybatis.dao.EmployeeMapperAnnotation"/>
<!-- 批量注册: --> 这种方式要求SQL映射文件名必须和接口名相同并且在同一目录下
<package name="com.zhufeng.mybatis.dao"/>
</mappers>