- MyBatis是什么?
- MyBatis是一个持久化层框架,他与Hibernate的作用类似,当时与Hibernate大大不同.
- 在开发中直接与数据库交互的操作就是持久化层,但是传统的sql语句,耦合度太高代码重复度过大,虽然Hibernate可以做到全自动封装JDBC的操作,但是Hibernate的sql语句都是为自动生成的,这就导致无法进行sql语句的维护,虽然Hibernate提供有HQL操作,但是相对于MyBatis来说更加的复杂
- 所以MyBatis属于一个半自动持久化层框架,MyBatis将sql语句交给开发人员编写,而其他的预编译,参数赋值,封装结果等等操作,都自动完成.
MyBatis下载
• 下载地址:• https://github.com/mybatis/mybatis-3
HelloWorld
- 使用MySQL数据库创建一个employee数据表
- 创建一个Employee.java程序类
public class Employee {
private Integer id;
private String ename;
private Integer age;
private String job;
}
- 创建MyBatis全局配置文件:mybatis-config.xml
- 这里面需要配置数据库连接信息
- ${driver}:连接数据库驱动程序
- ${url}:连接路径
- ${user}:连接用户名
- #{password}:用户密码
<?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/mybatisdb"/>
<property name="username" value="root"/>
<property name="password" value="mysqladmin"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="config/BlogMapper.xml"/>
</mappers>
</configuration>
- 定义BlogMapper.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="mao.shu.mybatis.entity">
<select id="employee" resultType="mao.shu.mybatis.entity.Employee">
select id,ename,age,job from employee where id = #{id}
</select>
</mapper>
- 定义测试类
public class EmployeeTest {
@Test
public void test() throws IOException {
String resource = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
//第一个字符串参数为 sql映射文件中 namespace+select的ID值
//第二个为数据表中的要查询数据的主键字段
Employee emp = session.selectOne("mao.shu.mybatis.entity.employee",1);
System.out.println(emp);
}
}
接口式编程
-
虽然直接使用SqlSession类的方法可以取得对应的数据,但是使用该方法需要暴露数据的配置文件中的namespace和id值作为字符串参数传入,这增加了书写错误的概率.
-
更好的方式为:MyBatis的新版本的方式,创建一个Java类的接口,在接口中定义操作数据库的方法,而不需要定义接口的子类,由MyBatis创建代理类对象完成接口的实现.我们在查询数据的时候,只需要传入Java类接口的类型即可
-
示例:创建Employee类的操作接口—EmployeeMapper
package mao.shu.mybatis.dao;
import mao.shu.mybatis.entity.Employee;
public interface EmployeeMapper {
/**
* 定义查询的方法
* @param id
* @return
*/
public Employee getEmp(Integer id);
}
- 修改sql映射文件,将<mapper>标签中的namespace属性改为接口的全类名
- 将每个<select>标签的id值改为定义的查询方法名称
<mapper namespace="mao.shu.mybatis.dao.EmployeeMapper">
<select id="getEmp" resultType="mao.shu.mybatis.entity.Employee">
select id,ename,age,job from employee where id = #{id}
</select>
</mapper>
- 测试方法:
@Test
public voie testInterface(){
EmployeeMapper employeeMapper = this.session.getMapper(EmployeeMapper.class);
Employee employee = employeeMapper.getEmp(1);
System.out.println(employee);
}
小结
- 接口式编程
- 以前的做法是每一个DAO接口对应一个DAOIMPL实现类
- 而使用mybatis之后编写的接口不是需要编写实现类,而是由MyBatis来生成一个代理对象
MyBatis的重要配置文件
- 全局配置文件:
- 全局配置文件中包含数据库连接池信息,事物管理器’
- sql映射文件:保存了每一个sql语句的映射信息.