一:首先知道什么叫 Mybatis
MyBatis 是支持普通
SQL查询,
存储过程和高级映射的优秀
持久层框架。MyBatis 消除了几乎所有的
JDBC代码和参数的手工设置以及
结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。 用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类—-Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。 二:
执行流程:(比较抽象{拽文得大牛读得懂哈哈—} 可参照 Demo 理解)
(1)加载配置并初始化 触发条件:加载配置文件 处理过程:将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。 (2)接收调用请求 触发条件:调用Mybatis提供的API 传入参数:为SQL的ID和传入参数对象 处理过程:将请求传递给下层的请求处理层进行处理。 (3)处理操作请求 触发条件:API接口层传递请求过来 传入参数:为SQL的ID和传入参数对象 处理过程: (A)根据SQL的ID查找对应的MappedStatement对象。 (B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。 (C)获取数据库连接,根据得到的最终
SQL语句和执行传入参数到数据库执行,并得到执行结果。 (D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。 (E)释放连接资源。 (4)返回处理结果将最终的处理结果返回。 三:Demo 入门 Mybatis (本文
最主要的部分)[后期提供相应的代码] 首先看一下整个项目文件部署图:
(1)创建项目—–接着导入相关的jar 包;
(稍后提供相应的源码)
(2) 接着 创建好 相应的数据库表 (Demo的数据库名:hytc ;表名称:users)
(3) 创建相应的 entity 实体类 Users (Demo中 类的私有属性和表重的元素—-有些不同 这里大家先留意一下)
package ankermaker.top.entity; import java.util.Date; /** * * @author Ankermaker * users 表对应的实体类 */ public class Users { protected Integer id; protected String name; protected String sex; protected String edu; protected Date birth; protected String remark; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getEdu() { return edu; } public void setEdu(String edu) { this.edu = edu; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } @Override public String toString() { return "Users [id=" + id + ", name=" + name + ", sex=" + sex + ", edu=" + edu + ", birth=" + birth + ", remark=" + remark + "]"; } }
(4)接下来创建 Mybatis 的 核心配置xml文件 (命名 没有要求 ),存放与src目录下;[Demo中 以 conf.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> <!-- 为 实体映射 文件 创建别名映射 --> <typeAliases> <package name="ankermaker.top.entity"/><!--这个 包下面的 所有 实体类 别名 自动 创建 --> </typeAliases> <environments default="development"><!-- 环境池 配置 :default 属性值 默认环境名称 --> <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/hytc" /><!-- 老陈写法:jdbc:mysql:///hytc --> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <mappers> <mapper resource="ankermaker/top/mappers/Usersmapper.xml"/> </mappers> </configuration>
(5)接下来创建 mapper 映射操作xml文件 (这个文件的作用:简单的说:所有对表的增删改查操作 的sql 语句和 该文件映射的借口类中的方法 在给文件中注册体现;执行查询的方法有多种,通过 映射文件创建映射借口,用户调用Mapper接口中的方法,执行相应的sql语句 并返回查询结果!大家在测试之后 可以仔细的感受该文件的作用!!!)
Demo中的Mapper 映射操作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="ankermaker.top.mappers.Usersmapper"><!-- 映射接口类的 路径!!! --> <!-- 实体类 中 与表名字 不同 使用 resultMap 来创建 别名映射!--> <resultMap type="users" id="userMap"> <id column="u_id" property="id" jdbcType="INTEGER"/> <result column="u_name" property="name"/> <result column="u_sex" property="sex"/> </resultMap> <!-- 查询 所有 数据 测试! --> <select id="getObjects" resultMap="userMap"> <!-- 直接引用 上面的 resultMap --> select u_id,u_name,u_sex from users </select> </mapper>
(6)接下来创建 mapper映射文件的 映射接口类:接口类名和映射操作xml文件 名一样!!都为:Usersmapper
package ankermaker.top.mappers; import java.util.List; import ankermaker.top.entity.Users; public interface Usersmapper { /** * 查询所有用户的信息 * * @return */ public List<Users> getObjects();//测试 数据库获取所有的 记录 方法; }
(7)接了下就是测试 数据库操作的时候了 创建 测试类,
package ankermaker.top.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import ankermaker.top.entity.Users; import ankermaker.top.mappers.Usersmapper; public class AppText { private SqlSessionFactory sessionFactory; private static SqlSession session; private Usersmapper mapper; @Before public void setup() { String resource = "conf.xml"; InputStream is = null; try { is = Resources.getResourceAsStream(resource); sessionFactory = new SqlSessionFactoryBuilder().build(is); session = sessionFactory.openSession(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void getObjects() { // 分页查询 // 获取 映射 借口 对象 ; mapper = session.getMapper(Usersmapper.class); List<Users> list = mapper.getObjects(); for (Users u : list) { System.out.println(u + "测试成功"); } } @After public void result() { if (sessionFactory != null) { sessionFactory = null; } if (session != null) { session = null; } } }
使用 junit test 测试 getObjects方法;
四:问题分析:论ResultMap 的作用!
大家看Usersmapper.xml 中的resultMap标签的使用!
<resultMap id=”userMap” type=”users”>
<id jdbcType=”INTEGER” property=”id” column=”u_id”/>
<result property=”name” column=”u_name”/>
<result property=”sex” column=”u_sex”/>
</resultMap>
….
select u_id,u_name,u_sex from users
由于实体中的私有属性和表中的列名不一致所以要使用 ResultMap 这个标签让他们之间产生映射,Demo中不能展现的很清楚大家可以在测试 按条件查询的时候,会发现resultMap 的用处!
五:项目部署完成 但总感觉这篇写的没有什么思路希望大家看不明白了谅解,大家学习即可就好啦,我们大家一起进步;