一、MyBatis简介
- MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
- MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.
- MyBatis是一个半自动化的持久化层框架。
对于使用JDBC
操作数据库,SQL夹在Java代码块里,耦合度高导致硬编码内伤,维护不易且实际开发需求中sql是有变化,频繁修改的情况多见。
而Hibernate
操作数据库,SQL长难且复杂,内部自动生产的SQL,不容易做特殊优化。基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降。
MyBatis
操作数据库,核心sql还是需要自己优化,sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。MyBatis将重要的步骤抽取出来可以人工顶置,其他步骤自动化,重要步骤都是写在配置文件中,也方便维护。MyBatis底层就是对原生JDBC的一个简单封装,既将java编码与SQL抽取了出来,还不会失去自动化功能,属于半自动化的持久层框架。
二、MyBatis环境搭建
创建MyBatis全局配置文件mybatis-config.xml
<?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="root"/>
</dataSource>
</environment>
</environments>
<!--注册自己编写的每一个接口的实现文件-->
<mappers>
<mapper resource="EmployeeDao.xml"/>
</mappers>
</configuration>
创建SQL映射文件EmployeeDao.xml
,映射文件的作用就相当于是定义Dao
接口的实现类如何工作。
<?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">
<!--名称空间是用来写接口的全类名的,相当于告诉MyBatis这个配置文件是配置哪个接口的-->
<mapper namespace="dao.EmployeeDao">
<!--select:用来定义一个查询操作,
id是方法名,相当于这个配置是对于某个方法的实现
resultType指定返回值类型,查询操作必须指定
-->
<select id="getEmpById" resultType="bean.Employee">
select * from employee where id = #{id}
</select>
<!--增删改不用写返回类型,返回的是影响多少行,MyBatis自动判断,如果是数字直接返回,如果是Boolen(影响0行会封装成false,否则true)-->
<update id="updateEmployee">
update employee set empname = #{empName}, gender = #{gender}, email = #{email} where id = #{id}
</update>
<delete id="deleteEmployee">
delete from employee where id = #{id}
</delete>
<insert id="insertEmployee">
insert into employee value(#{id}, #{empName}, #{gender}, #{email})
</insert>
</mapper>
测试,根据全局配置文件,利用SqlSessionFactoryBuilder
创建SqlSessionFactory
,使用SqlSessionFactory
获取sqlSession对象。一个SqlSession
对象代表和数据库的一次会话。
@Test
public void test1() throws IOException {
//1、根据全局配置文件创建出一个SQLSessionFactory
//SqlSessionFactory是SqlSession工厂,负责创建SqlSession对象
//SqlSession是sql会话,代表和数据库的一次会话
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
Employee employee = null;
SqlSession sqlSession = null;
try {
//2.获取和数据库的一次会话,类似于getConnection()方法
sqlSession = sqlSessionFactory.openSession();
//3、使用SqlSession操作数据库,获取到dao接口的实现
EmployeeDao employeeDao = sqlSession.getMapper(EmployeeDao.class);
//4、调用接口中的方法
int i = employeeDao.insertEmployee(new Employee(null, "tomcat", 1, "tomcat@qq.com"));
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
} finally {
//默认自动提交为false,所以需要手动提交
sqlSession.commit();
//关闭会话
sqlSession.close();
}
}
SqlSession
的实例不是线程安全的,因此是不能被共享的。每次使用完成后需要正确关闭,这个关闭操作是必须的。SqlSession
可以直接调用方法的id
进行数据库操作,但是最好还是使用SqlSession
获取到Dao
接口的代理类,执行代理对象的方法,可以更安全的进行类型检查操作。