目录
一、MyBatis
1.简介
-
MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。
-
MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
-
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。
-
MyBatis是一个半自动化的持久化层框架。
2.为什么要使用
-
JDBC
-
SQL夹在Java代码块中,耦合度高导致硬编码。
-
维护不易且实际开发中sql是有变化的。
-
-
Hibernate和JPA
-
长难复杂的SQL,对于Hibernate而言处理也不容易。
-
内部自动生产的SQL,不容易做特殊优化。
-
基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。
-
3.下载地址
https://github.com/mybatis/mybatis-3/
4.MyBatis操作数据库流程
-
引入mysql-connector-java-5.1.37-bin.jar和mybatis-3.4.6.jar
-
创建MyBatis全局配置文件
-
创建SQL映射文件
-
根据全局配置文件,利用SqlSessionFactoryBuilder创建SqlSessionFactory
-
使用SqlSessionFactory获取sqlSession对象。一个sqlSession对象代表和数据库的一次会话
-
使用SqlSession进行增删改操作
5.接口式编程简单案例
创建tb1_employee数据库表
-
创建sql表对应的实体类Employee
public class Employee { private int id; private String name; private String gender; private String email; public Employee() { } public Employee(int id, String name, String gender, String email) { this.id = id; this.name = name; this.gender = gender; this.email = email; } //... }
-
创建操作Employee表的接口类
package com.itheima.dao; import com.itheima.bean.Employee; public interface EmployeeMapper { public Employee getEmpById(Integer integer); }
-
创建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="conf/EmployeeMapper.xml" /> </mappers> </configuration>
-
创建SQL映射文件EmployeeMapper.xml
<?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="com.itheima.dao.EmployeeMapper"> <!-- namespace:名称空间;指定为接口的全类名 id:唯一标识 resultType:返回值类型 #{id}:从传递过来的参数中取出id值 public Employee getEmpById(Integer id); --> <select id="getEmpById" resultType="com.itheima.bean.Employee"> select id,name,email,gender from tb1_employee where id = #{id} </select> </mapper>
-
得到SqlSession进行查询操作
private static SqlSessionFactory getSqlSessionFactory() throws IOException {
//1.根据xml配置文件创建一个SqlSessionFactory对象
String resource = "conf/mybatis-config.xml";
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(resourceAsStream);
}
@Test
public void test01() throws IOException {
//1.获取SqlSessionFactory
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//2.获取sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.获取接口的实现类对象
//会为接口创建一个动态代理对象
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee emp = mapper.getEmpById(1);
System.out.println(emp);
sqlSession.close();
}
6.小结
-
SqlSession的实例不是线程安全的,因此不能被共享。
-
SqlSession每次使用完成后需要正确关闭。
-
SqlSession可以直接调用方法的id进行数据库操作,但是我们一般还是推荐使用SqlSession获取到Dao接口的代理类,执行代理对象的方法,可以更安全的进行类型检查操作。
二、MyBatis-全局配置文件
1.properties属性
<!--
1、mybatis可以使用properties来引入外部properties配置文件的内容;
resource:引入类路径下的资源
url:引入网络路径或者磁盘路径下的资源
-->
<properties resource="dbconfig.properties"></properties>
<environments default="dev_mysql">
<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>
dbconfig.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123456
2.settings设置
-
setting会改变MyBatis的运行时行为。
name:设置项名
value:设置项取值
3.typeAliases别名处理器
-
可以为Java类型设置一个短的名字,方便我们引用某个类
-
类很多的情况下,可以批量设置别名,给这个包下的而每一个类创建一个默认的别名,就是类名小写
-
也可以使用@Alisa注解为其制定一个别名
typeAliases> <!-- typeAlias:为某个java类型起别名 type:指定要起别名的全类名,默认别名就是类名小写 alias:指定新的别名 --> <typeAlias type="com.itheima.bean.Employee" alias="employee"></typeAlias> <!-- package:为某个包下的所有类及其子包批量起别名(类名小写) 批量起别名的情况下,可以会造成某个包下的子包下有类名冲突, 可以使用@Alias(value="指定别名")注解指定新的别名 --> <package name="com.itheima.bean"/> </typeAliases>
4.environments环境
-
MyBatis可以配置多种环境,比如开发、测试和生产环境对应的不同配置
-
每种环境使用一个environment标签进行配置并制定唯一标识符
-
可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境
<!--
id:指定当前环境的唯一标识
transactionManager:事务管理器
type:事务管理器的类型
JDBC(JdbcTransactionFactory)
MANAGED(ManagedTransactionFactory)
自定义事务管理器:实现TransactionFactory接口.type指定为全类名
dataSource:数据源
type:数据源类型
UNPOOLED(UnpooledDataSourceFactory)
POOLED(PooledDataSourceFactory)
JNDI(JndiDataSourceFactory)
自定义数据源:实现DataSourceFactory接口,type是全类名
-->
<environments default="dev_mysql">
<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>
5.databaseIdProvider环境
-
MyBatis可以根据不同的数据库厂商执行不同的语句
<!--
type="DB_VENDOR":
使用MyBatis提供的VendorDatabaseIdProvider解析数据库厂商标识。也可以实现DatabaseIdProvider接口来自定义。
property
name:数据库厂商标识
value:为标识起一个别名,方便SQL语句使用databaseId属性引用
-->
<databaseIdProvider type="DB_VENDOR">
<!-- 为不同的数据库厂商起别名 -->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
<!--
1.如果没有配置databaseIdProvide标签,那么databaseId=null
2.如果配置了,使用标签配置的name去匹配数据库信息,匹配上设置databaseId=指定的值,否则依旧为null
3.如果databaseId不为null,它只会找到配置databaseId的sql语句
4.MyBatis会加载不带databaseId的属性和带有匹配当前数据库databaseId属性的所有语句。如果同时找到带有databaseId和不带databaseId的相同语句,则后者被舍弃
-->
<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
select * from tbl_employee where id = #{id}
</select>
<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee"
databaseId="mysql">
select * from tbl_employee where id = #{id}
</select>
<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee"
databaseId="oracle">
select * from tbl_employee where id = #{id}
</select>
6.mapper映射
-
mapper逐个注册SQL映射文件
<mappers>
<mapper resource="conf/EmployeeMapper.xml" />
</mappers>
-
批量注册
<!--
mapper:注册一个sql映射
注册配置文件
resource:引用类路径下的sql映射文件
mybatis/mapper/EmployeeMapper.xml
url:引用网路路径或者磁盘路径下的sql映射文件
file:///var/mappers/AuthorMapper.xml
注册接口
class:引用(注册)接口,
1、有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
2、没有sql映射文件,所有的sql都是利用注解写在接口上;
推荐:
比较重要的,复杂的Dao接口我们来写sql映射文件
不重要,简单的Dao接口为了开发快速可以使用注解;
-->
<mappers>
<package name="com.atguigu.mybatis.dao"/>
</mappers>