MyBatis的原理及应用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis的原理及应用相关的知识,希望对你有一定的参考价值。
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); }
以上是关于MyBatis的原理及应用的主要内容,如果未能解决你的问题,请参考以下文章