MyBatis
- 1.ORM:Object --Relationship – Mapping 对象关系映射,是一种思想,是指把数据库中的每一行数据用对象的形式表现出来
2.JPA : Java – Persistence --API java持久化接口,是JavaEE关于ORM思想的一套标准接口,仅仅事一套接口,不是具体的实现
3.MyBatis:是一个实现了JPA规范的用来连接数据库并对其进行增删改查操作的开源框架(就和传 统的JDBC一样,就是个连接数据库的东西),其实,他底层就是一个JDBC封装的组件
*4.MyBatis虽然实现了JPA但是它并不是一个完完全全的ORM组件,而是一个基于SQL开发的半ORM组件
5.而Hibernate是一个完完全全的ORM组件,它是完全基于对象来操作数据库中的记录,并不和MyBatis一样是一个假把式
MyBatis概念:
MyBatis 的前身是 Apache 社区的一个开源项目 iBatis,于2010年更名为 MyBatis。MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集,使得开发人员更加关注 SQL 本身和业务逻辑,不用再去花费时间关注整个复杂的 JDBC 操作过程。
以下为 MyBatis 的结构图:
MyBatis的优点
----封装了 JDBC 大部分操作,减少开发人员工作量;
----相比一些自动化的 ORM 框架,“半自动化”使得开发人员可以自由的编写 SQL 语句,灵活度更高;
----Java 代码与 SQL 语句分离,降低维护难度;
----自动映射结果集,减少重复的编码工作;
----开源社区十分活跃,文档齐全,学习成本不高。
MyBatis开发环境的搭建
mybatis-3.4.1.jar
mysql-connector-java-5.1.24.jar
druid-1.1.5.jar(阿里的数据库连接池)
Mybatis框架----在pom.xml中添加配置文件
Mybatis的核心是—一个SqlSessionFactory的实例
xml文件配置:
1.创建映射器–mapper (这些映射器的xml映射文件包含了SQL代码和映射定义信息)
2.xml的头部声明,用来验证xml 文档的正确性
3.envionment元素图中包含了事务管理和连接池的配置
从SqlSessionFactory中获取SqlSession
SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句
SqlSession sqlSession = MyBatisUtils.getSqlSession();---自己封装的结合了javaweb知识点
正确描述每个语句的参数和返回值的接口
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
生命周期***
SqlSessionFactoryBuilder-–实例的最佳作用域(就是局部方法变量)
这个类可以被实例化,使用和丢弃,一旦创建了SqlSessionFactory,就不再需要它了
SqlSessionFactory----最佳作用域是应用作用域
SqlSessionFactory一旦被创建就在应用的运行期间一直存在,没有任何理由丢弃他或重新创建另一个实例
SqlSession ----最佳作用域是请求或方法作用域
每个线程都应该有它自己的SqlSession实例
SqlSession实例的不是线程安全的,因此不能被共享的
映射器实例----最佳作用域是方法作用域,
映射器是一些由你创建的,绑定你映射的语句的接口,映射器的实例是从SqlSession中获得的
映射器实例应该在调用它们的方法中被请求,用过之后即可丢弃
XML映射文件----SQL映射文件
1.cache–对给定命名空间的缓存配置
2.cache-ref–对其他命名空间缓存配置的引用
3.resultMap—是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象
4.sql–可被其他语句引用的可重用语句块
5.insert—映射插入语句
6.update–映射更新语句
7.delete-映射删除语句
8.select–映射查询语句
<select id="listEmp" resultMap="empMap">
select <include refid="allColumn"></include> from e_emp;
</select>
1.—这个语句被称为 listEmp 返回一个empMap类型的对象
这就告诉 MyBatis 创建一个预处理语句(PreparedStatement)参数,在 JDBC 中,这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句
select元素的属性:
1.id-----在命名空间中唯一的标识符,可以被用来引用这条语句
2.resultType ----从这条语句中返回的期望类型的类的完全限定名或别名。如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身
3.resultMap ----外部resultMap的命名引用。结果集的映射是MyBatis最强大的特性
insert、update、delete的元素属性
1.id—命名空间中的唯一标识符,可被用来代表这条语句
Sql语句—用来定义可重用的SQL代码段,可以被包含在其他语句中。可以(在加载的时候)被静态地设置参数。
<sql id="allColumn">
emp_id,name,age,sex,salary,dept_id
</sql>
字符串替换----
#{}格式的语法会导致MyBatis创建一个PreparedStatement参数占位符并安全地设置参数(就像**使用?**一样)
resultMap结果映射
—constructor 用于在实例化类时,注入结果到构造方法中
ఠ idArg --Id参数
ఠ arg–将被注入到构造方法地一个普通结果
–result 注入到字段或JavaBean属性地普通结果
—association 一个复杂类型地关联;许多结果集被包装成这种类型 (嵌套结果映射)
<association property="dept" javaType="Dept">
<id column="did" property="deptId"/>
<result column="dname" property="dname"/>
<result column="location" property="location"/>
</association>
解析:
<!--association:表示进行关联查询单条记录-->
<!--property:表示关联查询的结果储存在dept中-->
<!--javaType:dept属性中类型的路径-->
----collection 一个负载类型地集合(潜逃结果映射)
Id和Result的属性
property —映射到列结果的字段或属性
column ---- 数据库的列名。或者时列的别名
javaType --一个java的完全限定名,或一个类型别名
jdbcType ----JDBC类型
association关联
colletction集合
util包—MyBatisUtils类
public static final boolean DEFAULT_AUTO_COMMIT = true;
private static final SqlSessionFactory factory = new SqlSessionFactoryBuild.build(MyBatisUtils.class.getClassLoader().getResourceAsStream("mybatis.xml"));**------getClassLoader获取类加载器 ;getResourceAsStream 获取资源流**
public static SqlSession getSqlSession(boolean autoCommit) {
return factory.openssion(autoCommit);---默认自动提交数据
}
public static SqlSessssion getSqlSession(){
return factory.openssion(DEFAULT_AUTO_COMMIT );
}
resourse—com/moqi/mapper----EmpMapper.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.moqi.mapper.EmpMapper">
<resultMap id="empMap" type="Emp">
<id column="emp_id" property="empId"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="sex" property="sex"/>
<result column="salary" property="salary"/>
<result column="dept_id" property="deptId"/>
</resultMap>
<resultMap id="empDeptMap" type="Emp">
<id column="emp_id" property="empId"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="sex" property="sex"/>
<result column="salary" property="salary"/>
<result column="did" property="deptId"/>
<association property="dept" javaType="Dept">
<id column="did" property="deptId"/>
<result column="dname" property="dname"/>
<result column="location" property="location"/>
</association>
</resultMap>
<select id="listEmp" resultMap="empMap">
select <include refid="allColumn"></include> from e_emp;
</select>
<select id="listEmpDept" resultMap="empDeptMap">
select emp_id,name,age,sex,salary,b.dept_id did,dname,location from e_emp b left join e_dept d on b.dept_id = d.dept_id
</select>
<sql id="allColumn">
emp_id,name,age,sex,salary,dept_id
</sql>
<insert id="savaEmp">
insert into e_emp (name,age,sex,salary,dept_id) values (#{name},#{age},#{sex},#{salary},#{deptId})
</insert>
<delete id="deleteEmpById">
delete from e_emp where emp_id = #{id}
</delete>
<select id="getEmpById" resultMap="empDeptMap">
select emp_id,name,age,sex,salary,b.dept_id did,dname,location
from e_emp b left join e_dept d on b.dept_id = d.dept_id where emp_id = #{id}
</select>
<update id="updateEmp">
update e_emp set name = #{name},age = #{age},sex = #{sex},salary = #{salary},dept_id = #{deptId} where emp_id = #{empId}
</update>
</mapper>
entity----Emp类
package com.moqi.entity;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class Emp {
private Integer empId;
private String name;
private Integer age;
private String sex;
private BigDecimal salary;
private Integer deptId;
private Dept dept;
}
mapper—EmpMapper接口
package com.moqi.mapper;
import com.moqi.entity.Emp;
import java.util.List;
public interface EmpMapper {
//目的:配置接口
//查询数据
List<Emp> listEmp();
List<Emp> listEmpDept();
int savaEmp(Emp emp);
int deleteEmpById(Integer id);
Emp getEmpById(Integer id);
int updateEmp(Emp emp);
}
service—EmpService接口跟EmpMapper接口内容一样
service—impl包—EmpServiceImpl类继承EmpService接口
package com.moqi.service.impl;
import com.moqi.entity.Emp;
import com.moqi.mapper.EmpMapper;
import com.moqi.service.EmpService;
import com.moqi.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class EmpServiceImpl implements EmpService {
@Override
public List<Emp> listEmp() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
List<Emp> empList = empMapper.listEmp();
sqlSession.close();
return empList;
}
@Override
public List<Emp> listEmpDept() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
List<Emp> empList = empMapper.listEmpDept();
sqlSession.close();
return empList;
}
@Override
public int savaEmp(Emp emp) {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
int row = empMapper.savaEmp(emp);
sqlSession.close();
return row;
}
@Override
public int deleteEmpById(Integer id) {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
int row = empMapper.deleteEmpById(id);
sqlSession.close();
return row;
}
@Override
public Emp getEmpById(Integer id) {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = empMapper.getEmpById(id);
sqlSession.close();
return emp;
}
@Override
public int updateEmp(Emp emp) {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
int row = empMapper.updateEmp(emp);
sqlSession.close();
return row;
}
}