MyBatis

1 篇文章 0 订阅
1 篇文章 0 订阅

MyBatis

  1. 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;
    }


}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值