MyBatis是一个基于Java的持久层ORM关系映射框架,是一种支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。它避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。
MyBatis 使用简单的 XML 或注解来配置和映射基本体,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
MyBatis原理
1.MyBatis应用程序Configuration对象根据XML配置文件或注解创建SqlSessionFactory工厂,获取一个SqlSession,加载SQL配置信息,生成一个个MappedStatement对象(包括传入参数映射配置、执行的sql语句、结果映射配置),并存储在内存中。
2.SQL解析,SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句
3.SQL执行,完成对数据的增删改查,得到数据库操作结果
4.结果映射将操作结果按照映射配置进行转换,转换成HashMap、JavaBean等
5.事务提交,用完之后关闭SqlSession,返回结果。
MyBatis应用
1.引入环境
mybatis-3.4.1.jar
mysql.connector-java-5.1.35-bin.jar
2. 设置主配置文件
a.设置别名 (两种方法二选一)
<typeAliases>
// 设置某一实体类的别名
<typeAlias type="com.motianjie.entity.Dept" alias="Dept"/>
// 设置某个包中的类都支持别名,该包下的类
<package name="com.motianjie.entity"/>
</typeAliases>
b.设置数据库数据源环境 可以多个(default表示默认使用的是哪个环境)
<environments default="mysqlEnvironment">
// id: 设置当前环境的身份id
<environment id="mysqlEnvironment">
//transactionManager: 设置事务管理器 type:设置用哪个事务管理器 JDBC是使用默认的事务管理自动提交
<transactionManager type="JDBC"></transactionManager>
// 数据源配置
//type:设置数据源类型 POOLED表示使用连接池策略
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/utf8?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123123"/>
</dataSource>
</environment>
</environments>
c.配置映射配置文件
<mappers>
//resource: 当前服务器下的文件路径
<mapper resource="com/motianjie/dao/deptMapper.xml"/>
</mappers>
3.配置dao层的映射配置文件(deptMapper.xml)
1.提供了sql映射配置信息,通过该配置来实现数据库表和实体类之间的映射关系
2.mapper 是整个sql映射配置文件的根元素
3.namespace: 设置命名空间 与当前项目的模块中的dao接口全限定名对应
<mapper namespace="com.chinasofti.etc.dao.DeptMapper">
//根据id查询部门信息
//select 设置查询的SQL id:该sql的标记,是一个唯一标识
//sql 文件是直接写在当前映射文件中的
//resultType 返回值类型 需要填写全限定名或者是别名
//parameterType 参数类型,个数唯一 可以是全限定名,也可以是mybatis提供的简写类型
//#{deptno} 是mybatis的表达式 #{}是占位符 deptno是传入的参数,单一个参数,mybatis会自动传递过来赋值
<select id="findDept" resultType="com.chinasofti.etc.entity.Dept" parameterType="java.lang.Integer">
select deptno,dname,loc from dept where deptno = #{deptno}
</select>
//insert 用于插入sql操作
//当执行该sql,mybatis会根据从当前传入的对象
<insert id="saveDept" parameterType="Dept">
insert into dept values(#{deptno},#{dname},#{loc})
</insert>
<update id="updateDept" parameterType="Dept">
update Dept set dname = #{dname} where deptno = #{deptno}
</update>
<delete id="deleteDept" parameterType="integer">
delete from dept where deptno = #{deptno}
</delete>
<select id="findAll" resultType="Dept">
select deptno,dname,loc from dept
</select>
// 查询一张表中的部分字段信息 或多表查询 通过返回map来实现
<select id="findMap" resultType="java.util.HashMap">
select dname,loc from dept
</select>
</mapper>
4.工具类
private static SqlSessionFactory sqlSessionFactory;
static{
try {
//通过mybatis的api读取主配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//创建造 SqlSessionFactory 工厂的对象
SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
//创建工厂
sqlSessionFactory = sessionFactoryBuilder.build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
//生产sqlSession sqlSession类与jdbc的Connection类似
public static SqlSession openSqlSession(){
return sqlSessionFactory.openSession();
}
5.测试
SqlSession session;
DeptMapper deptMapper;
@Before
public void test() {
session = MybatisUtil.openSqlSession();
//动态代理实现类
deptMapper = session.getMapper(DeptMapper.class);
}
@After
public void after(){
session.commit();
session.close();
}
@Test
public void testFindDept(){
//该代理类实现了DeptMapper里面的方法
System.out.println(deptMapper.getClass().getName());
Dept dept = deptMapper.findDept(10);
System.out.println(dept);
}