mybatis

一、MyBatis概述

1、mybatis理论

  • 轻量级持久层框架,就是方便我们将数据持久化到数据库中 MyBatis本是apache的一个开源项目iBatis,
    2010年这个项目由apache software foundation 迁移到了google
    code,并且改名为MyBatis。2013年11月迁移到Github。
    持久层框架两大霸主Hibernate和Mybatis,这两个框架都是2001年诞生的,但是Mybatis是目前最优秀的持久层框架,当前市场给他们俩下了定义,小型项目用Hibernate,大型项目,都要用Mybatis
    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL
    本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
    Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
    总之,Mybatis对JDBC访问数据库的过程进行了封装,简化了JDBC代码,解决JDBC将结果集封装为Java对象的麻烦。

2、mybatis架构

在这里插入图片描述
(1)sqlMapConfig.xml是Mybatis的核心配置文件,通过其中的配置可以生成SqlSessionFactory,也就是SqlSession工厂
(2)基于SqlSessionFactory可以生成SqlSession对象
(3)SqlSession是一个既可以发送SQL去执行,并返回结果,类似于JDBC中的Connection对象,也是Mybatis中至关重要的一个对象。
(4)Executor是SqlSession底层的对象,用于执行SQL语句
(5)MapperStatement对象也是SqlSession底层的对象,用于接收输入映射(SQL语句中的参数),以及做输出映射(即将SQL查询的结果映射成相应的结果)

3、mybatis与JDBC对比

思考:在开始之前,思考下如何通过JDBC查询Emp表中的所有记录,并封装到一个List集合中返回。(演示:准备数据、导包、导入JDBC程序)
传统的JDBC的缺点:
1.使用JDBC有重复大量的代码
2.JDBC本身是没有连接池的, 会频繁的创建连接和关闭连接,效率也低
3.SQL是写死在程序中的,一旦修改SQL,必须要重新编译这个类
4.对查询的sql执行的返回结果ResultSet,需要手动处理

Mybatis的优点
1.对JDBC进行了封装,简化了JDBC的代码
2.内部就自带连接池,也可以配置其他的连接池,因此可以提高效率
3.将SQL不写死在程序中,而是写在mapper文件,修改sql不会编译类,只会修改配置文件
4.对查询SQL返回的结果,不需要遍历,而是直接通过映射,由mybatis处理,自动去解析结果,并显示,并且会自动帮助我们释放资源,创建对象
因此JDBC大部分的问题,都在Mybabtis框架中得以解决,mybatis并不是替代了jdbc,只是底层封装了优化了jdbc

二、mybatis案例

1、准备数据,创建库和表

1、创建yonghedb库、emp表,并插入若干条记录
-- 1、删除 yonghedb 数据库(如果存在)
drop database if exists yonghedb;
-- 2、创建数据库 yonghedb 数据库
create database yonghedb charset utf8;
use yonghedb; -- 选择yonghedb数据库

-- 3、在 yonghedb 库中创建 emp 表
create table emp(
	id int primary key auto_increment,
	name varchar(50),
	job varchar(50),
	salary double
);
-- 4、往 emp 表中, 插入若干条记录
insert into emp values(null, '王海涛', '程序员', 3300);
insert into emp values(null, '齐雷', '程序员', 2800);
insert into emp values(null, '刘沛霞', '程序员鼓励师', 3700);
insert into emp values(null, '陈子枢', '部门总监', 4200);
insert into emp values(null, '刘昱江', '程序员', 3000);
insert into emp values(null, '董长春', '程序员', 3500);
insert into emp values(null, '张慎政', '程序员', 2700);
insert into emp values(null, '韩少云', 'CEO', 5000);

2、创建工程,导入所需jar包、创建测试类

导入junit、mysql、mybaits等开发包,在pom.xml文件中引入相关依赖包即可

<dependencies>
	<!-- junit单元测试 -->
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.9</version>
	</dependency>
	<!-- mysql驱动 -->
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.32</version>
	</dependency>
	<!-- mybatis -->
	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis</artifactId>
		<version>3.2.8</version>
	</dependency>
	<!-- 整合log4j -->
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-log4j12</artifactId>
		<version>1.6.4</version>
	</dependency>
</dependencies>

其中mybatis-3.2.8是mybatis框架的核心包,其他则为依赖包

3、添加mybatis-config.xml文件

在src/main/resources目录下,创建mybatis-config.xml文件 (MyBatis的核心配置文件)

<?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">
<!-- MyBatis的全局配置文件 -->
<configuration>
    <!--1、配置开发环境-->
    <!--environments标签内部可以设置多个环境,比如开发的环境,测试的环境,如果需要
    使用哪个环境,就在default中,写对应的环境id即可切换-->
    <environments default="test">
        <!--environment标签内部是一个环境的信息,并且每个环境都有唯一的id-->
        <environment id="test">
            <!--1.1配置事务的管理方式:type可取值:JDBC 将事务交给JDBC管理  MANAGED 将事务交给自己管理-->
            <transactionManager type="JDBC"/>
            <!--1.2 配置数据源的连接数据,指定mybatis怎么连接数据库,包括驱动,连接URL,用户名,密码-->
            <!--dataSource 表示指定连接数据库的值是什么-->
            <!--type表示是否使用连接池,可取值:
            POOLED 表示使用连接池  UNPOOLED 表示不使用连接池 JNDI 已过时
            -->
            <dataSource type="POOLED">
                <!--name的值是固定的,不能随便起,value根据实际情况书写-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.229.80:3306/yonghedb?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="abc123"/>
            </dataSource>
        </environment>
    </environments>
    <!--2、导入专门写SQL的mapper配置文件,读取mybatis-config.xml文件,也会读取到
    EmpMapper.xml文件的内容-->
    <mappers>
        <!--resource的值是EmpMapper.xml相对路径-->
        <mapper resource="EmpMapper.xml"/>
    </mappers>

</configuration>

4、添加EmpMapper.xml文件文件

同样在resources目录下创建

<?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">
<!--专门写SQL
     当前的文件名是EmpMapper.xml,一般情况下,都是和涉及到的表进行联系的,每个
     文件中有一个namespace属性,其中的值是一个项目中都是唯一的,目的就是为了定位
     当前的mapper.xml文件,后期这个值是用来关联接口的
-->
<mapper namespace="EmpMapper">
    <!--查询emp表中所有的员工信息-->
    <!--sql分为增删改查四种,每种都对应了一组标签,增insert删delete 改 update 查select
    每条sql都应该有id值,并且一个mapper.xml中,id值不能重复
    查询sql相较于修改sql有一点注意事项:
        查询是有结果的,但是传统的JDBC获取结果集特别的繁琐
        所以mybatis帮助我们解决了这个问题,可以自动得将结果封装到实体中,需要提前准备一下几步:
          1、先创建一个和Emp表有映射关系的实体类Emp
          2、手动为查询sql绑定结果的映射类,使用resultType属性
             使用resultType属性,值是要映射的实体类的全路径
             当调用该查询sql时,会自动将结果映射到实体类中,底层会根据查询的多条记录,创建多个对应对象,每个对象会自动调用
             set方法,将对应的字段值存储到对应的属性中
    -->
    <select id="findAll" resultType="com.weq.pojo.Emp">
        select * from emp
    </select>
</mapper>

5、编写Emp实体类

注意:在当前实例中,Emp类中的属性和数据库表的字段名称必须一致,否则将会无法将结果集封装到Java对象中。
实现Emp类: 提供私有属性以及对应的getter方法、setter方法,并重写toString方法

package com.weq.pojo;
//和数据库的Emp表进行映射的类
public class Emp {
    /*
    * 声明属性,需要和表中的字段一一映射
    * 属性名和字段名要一一对应
    * 而且必须要声明get和set方法,也要声明toString方法
    * 属性的类型,最好是包装类型
    *    基本类型:不属于面向对象,默认值是0
    *    包装类型:属于面向对象,默认是Null,而int不能接受null
    *    一般情况下:成员变量都是包装类型,方法中的变量是基本类型
    * */
    private Integer id;
    private String name;
    private String job;
    private Double salary;

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", job='" + job + '\'' +
                ", salary=" + salary +
                '}';
    }

    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 getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }
}

6、实现测试类,并测试

package com.weq.myBatisDemo;

import com.weq.pojo.Emp;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

/*
 * 查询emp表中的所有的员工信息
 * */
public class TestmyBatis {
    @Test
    public void findAll() throws IOException {
//        前三步不需要记忆,后面会由spring框架自动配置
//        1、读取mybatis的核心配置文件(mybatis-config.xml
        /*
         * maven管理项目,源代码放在java目录下,配置文件放在resources目录下,但是底层管理,两个文件的内容会存储在同一个目录classes下
         * */
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        //2、获取一个SqlSessionFactory工厂对象,工厂对象根据核心配置文件工作
        //SqlSessionFactory是mybatis的核心关键对象,可以读取xml配置文件的内容,可以利用这个对象创建连接数据库操作的实例
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//        3、通过工厂对象获取一个SqlSession对象
        /*
         * SqlSession是Mybatis的关键对象,是执行持久化操作的对象,类似于JDBC中的connection对象,里面封装了很多执行
         * SQL的增删改查的方法,openSession方法内部有一个布尔值的参数,如果不写参数,默认是false,表示手动提交事务,如果
         * 需要JDBC自动接管事务,我们需要设置true
         * */
        SqlSession session = factory.openSession(true);
//        4、通过namespace+id的值定位到具体的sql,并执行具体的sql语句
//        执行的sql查询多条记录的,所以可以调用selectList,返回一个结果的集合
        List<Emp> list = session.selectList("EmpMapper.findAll");
//        5、输出结果
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
}

执行findAll方法
在这里插入图片描述

7、mybatis的增删改查

代码如下:

package com.weq.myBatisDemo;

import com.weq.pojo.Emp;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

/*
 * 查询emp表中的所有的员工信息
 * */
public class TestmyBatis01 {
    /*
     * 由于前三步太繁琐,可以提取出来,保证单元测试方法时,可以自动执行这三步即可
     * session对象需要全局使用,所以声明为全局变量
     * */
    private static SqlSession session = null;

    static {
        try {
            InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            session = factory.openSession(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    @Test
    public void findAll() throws IOException {
        List<Emp> list = session.selectList("EmpMapper.findAll");
//        5、输出结果
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }

    @Test
    public void insert() {
// 也可以使用session.insert;里面的值是EmpMapper.xml里面的namcepace.id
// 有返回值,是一个整数,记录的是修改的记录数
        int rows = session.update("EmpMapper.insert");
        System.out.println("修改了"+rows+"条");
//        如果openSession没有写参数,表示不会自动提交事务,就需要手动提交事务
//          session.commit();
    }

    @Test
    public void update(){
        int rows = session.update("EmpMapper.update");
        System.out.println("修改了"+rows+"条");
    }
}

在对应的mapper.xml文件中添加相应的sql

<?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">
<!--专门写SQL
     当前的文件名是EmpMapper.xml,一般情况下,都是和涉及到的表进行联系的,每个
     文件中有一个namespace属性,其中的值是一个项目中都是唯一的,目的就是为了定位
     当前的mapper.xml文件,后期这个值是用来关联接口的
-->
<mapper namespace="EmpMapper">
    <!--查询emp表中所有的员工信息-->
    <!--sql分为增删改查四种,每种都对应了一组标签,增insert删delete 改 update 查select
    每条sql都应该有id值,并且一个mapper.xml中,id值不能重复
    查询sql相较于修改sql有一点注意事项:
        查询是有结果的,但是传统的JDBC获取结果集特别的繁琐
        所以mybatis帮助我们解决了这个问题,可以自动得将结果封装到实体中,需要提前准备一下几步:
          1、先创建一个和Emp表有映射关系的实体类Emp
          2、手动为查询sql绑定结果的映射类,使用resultType属性
             使用resultType属性,值是要映射的实体类的全路径
             当调用该查询sql时,会自动将结果映射到实体类中,底层会根据查询的多条记录,创建多个对应对象,每个对象会自动调用
             set方法,将对应的字段值存储到对应的属性中
    -->
    <select id="findAll" resultType="com.weq.pojo.Emp">
        select * from emp
    </select>
<!--新增员工信息,修改的sql是不需要写resultType属性的-->
    <update id="insert">
     insert into emp values (null ,'李小龙','程序员',10000.0);
    </update>
    <update id="update">
        update emp set name='马云',salary=10000000.0 where id=8;
    </update>
</mapper>
  • 18
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值