请关注“知了堂学习社区”,地址:http://www.zhiliaotang.com/portal.php
- MyBatis是一个ORM框架
ORM:对象关系映射(Object Relation Mapping)。用于实现面向对象编程语言里不同类型数据之间的转换。把表映射成实体类,把表中的字段映射成实体类中的属性(POJO)
常见的ORM开源框架:mybatis,hibernate
Mybatis和hibernate的不同:更加关注原生sql的编写来实现CRUD的操作
Mybatis采用功能强大的基于OGNL的表达式来消除其他元素。#{..}
- 持久层框架
- 持久化:将数据信息永久保存,数据库,文件系统
- 持久层:实现将数据实现持久化操作的框架,就是取代JDBC(将数据保存在数据库中)
- 持久层框架:mybatis、hibernate
- 是一个不完成的ORM框架
- ORM:object-relation-mapping:对象关系映射
- 表—类,对象—记录,列—-属性
- 在代码中操作对象的方式,实现对数据库中表的操作
- 代码中只考虑映射对象,不考虑表相关的信息
- hibernate是一个完成的ORM框架
- mybatis:完整的应该是对象映射成关系,关系映射成对象,但是mybatis只完成了单边
- 对sql存储过程,动态sql的处理进行了封装
- 取代了JDBC,减少了代码量
- 是从iBatis发展而来,apache项目下,接着在goolecode,现在在github下
- Apache
- 服务器,跨平台,安全性
- ASF:开源项目基金会
- Tomcat
- Ibatis
- hadoop–大数据
- lucence–检索
- Googlecode
- 开源项目托管
- GitHub
- 开源项目托管
mybatis的环境配置
导入mybatis的包,mybatis-3.2.8.jar
- 导入mysql的驱动包,MySQL-connector-java-5.1.24.jar
- 导入表的实体类:普通的JavaBean,JavaBean的属性需要对应数据库表中的字段
- 编写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>
<properties resource="jdbc.properties"></properties>
<typeAliases>
<package name="com.zhiliaotang.mybatis.model"/>
</typeAliases>
<!-- 配置开发模式, 添加数据库信息, 开启事务模式 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/zhiliaotang/mybatis/mapper/UserMapper.xml"/>
<mapper resource="com/zhiliaotang/mybatis/mapper/TeacherMapper.xml"/>
<mapper resource="com/zhiliaotang/mybatis/mapper/StudentMapper.xml"/>
<mapper class="com.zhiliaotang.mybatis.dao.StudentDao"/>
</mappers>
</configuration>
- 编写jdbc.propertis
mysql.driver = com.mysql.jdbc.Driver
mysql.url = jdbc:mysql://localhost:3306/music
mysql.username = root
mysql.password = 123456
`
- 编写映射文件(***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="com.zhiliaotang.mybatis.mapper.UserMapper">
<!-- 数据库中 表的字段和实体类中的属性的对应 -->
<resultMap type="cloneUser" id="baseResultMap">
<id column="user_id" property="userId"/>
<result column="user_name" property="userName"/>
<result column="user_mail" property="userMail"/>
<result column="user_gender" property="userGender"/>
<result column="user_pwd" property="userPwd"/>
</resultMap>
<!-- 属性的数据类型 -->
<parameterMap type="cloneUser" id="baseParameterMap">
<parameter property="userId" javaType="java.lang.Integer"/>
<parameter property="userName" javaType="java.lang.String"/>
<parameter property="userMail" javaType="java.lang.String"/>
<parameter property="userGender" javaType="java.lang.String"/>
<parameter property="userPwd" javaType="java.lang.String"/>
</parameterMap>
<select id="userinfo" resultType="User">
select * from users where user_id = 5
</select>
<select id="userinfoById" resultType="User" parameterType="java.lang.Integer">
select * from users where user_id = #{user_id}
</select>
<select id="userinfoByName" resultType="User" parameterType="user">
select * from users where user_id = #{user_id} and user_name=#{user_name}
</select>
<select id="cloneuserinfo" resultMap="baseResultMap">
select * from users where user_id = 5
</select>
<select id="cloneuserinfoByName" resultMap="baseResultMap" parameterMap="baseParameterMap">
select * from users where user_id = #{user_id}
</select>
</Mapper>
- 通过测试来完成数据库CRUD操作
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.Test;
import com.zhiliaotang.mybatis.dao.StudentDao;
import com.zhiliaotang.mybatis.model.Student;
import com.zhiliaotang.mybatis.model.Teacher;
import com.zhiliaotang.mybatis.model.User;
import com.zhiliaotang.mybatis.model.cloneUser;
public class TestMybatis {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static{
try {
reader = Resources.getResourceAsReader("config.xml");
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}
@Test
public void test1(){
// CRUD
// 获取SqlSession对象
// 执行映射文件中SQL语句(映射文件是哪个?)
// 返回结果
SqlSession sqlSession = sqlSessionFactory.openSession();
String sql = "com.zhiliaotang.mybatis.mapper.UserMapper.userinfo";
User user = sqlSession.selectOne(sql);
System.out.println(user.getUser_id()+" "+user.getUser_pwd()+" "+user.getUser_name()+" "+user.getUser_mail()+" "+user.getUser_gender());
sqlSession.close();
}
}
总结:
- 读取配置文件(得到sql语句)
- 核心配置文件:JDBC的联系
- 映射配置文件:得到sql
- 底层JDBC
- 结果集的反射:在映射配置文件有存在映射类
- ObjectFactory:class类的实例,反向create一个实例出来,通过其他的反射方式,那些结果集的列的值就是实例的属性
- sqlSessionfactory.Builder :
- 通过mybatis的可信配置文件创建sqlsessionfactory;
- 根据不同的环境,创建不同的;
- 是一个类
- sqlsessionFactory:接口
- 一个sqlSessionFactory对应一个数据库,
- Factory一定是单例的
- POOLED:factory中连接是可以重用的
- UNPOOLED:每次使用都是创建一个新的连接
- JNDI:与框架容器整合的时间,数据连接配置项的共用
- SqlSession:接口
- 每一次真正执行sql操作是的连接,相关于JDBC的connection
- 非线程安全
- 事务
- Request作用域
- 执行器:最终让executor做查询
- mapper示例
- 接口代理的形式
- Session.getMapper(class 示例)
- Dao层接口:定义了一系列的方法
- mybatis通过getMapper生成了Dao的代理(装饰者)
- 真正实现dao方法的是代理
- 映射文件方式和代理方式
- 代理方式最终是使用映射文件方式的实现
- 代理方式最终是使用映射文件方式的实现
mybatis是一个ORM框架,是一个取代JDBC的框架,通过读取配置文件,创建JDBC的连接,通过反射映射结果
mybatis的架构:
我们使用的接口层,做增删改查,会用到参数的解析,sql的解析,然后开始执行sql,得到结果进行结果映射,而支撑整个SQL解析,需要数据库的事务,数据库的连接,还有配置加载和缓存处理。