avatar

MyBatis入门

Mybaris是什么

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。——mybatis

与Hibiernate区别

我们在没有框架实现的时候一般使用的JDBC来实现数据库的连接,当然还有很多小工具用于简化我们的数据库操作流程(Dbutis、jdbcTemplate等),当我们在进行操作数据库的时候一般有这样几步操作:
编写sql->预编译->设置参数->执行sql->封装结果
我们不直接使用jdbc的原因很简单
1、功能简单,sql语句是直接编写在java代码里面的,非常不方便,硬编码高耦合的方式

Hibernate是一个全自动的ORM(Object Relation Mapping)框架,旨在消除sql,将以上运行sql的几步作为一个黑箱,我们不需要去编写sql,而是Hibernate去实现
1、所有的sql都是框架生成的,我们没有优化空间
2、如果我们想要去定制sql的话,我们需要学习Hibernate自己的数据库操作语言 HQL
3、Hibernate是全映射,如果我们数据库里面有一百个字段,我只需要一个字段,他也会把一百个字段查出来,需要定制只能使用HQL

Mybatis把编写参数开发出来,交给开发人员,这是与Hibernate最大的区别,而且Mybatis是将sql抽取出来,由xml去编写,这样sql就与java分开解耦。
Mybatis是一个半自动的ORM框架,将sql交出去,有开发人员编写灵活性很高

MyBatis使用

Mybatis项目地址
我们下载最新的版本进行学习,使用Mybatis只需要一个jar包即可,非常的轻量级。

HelloWorld

  • 首先我们创建一个数据库名字叫mybatis,创建一个数据表并且加入一些数据
    create database mybatis;
    use mybatis;
    create table tb1_employee
    (
    id int(11) PRIMARY KEY AUTO_INCREMENT,
    last_name VARCHAR(255),
    gender CHAR(1),
    email VARCHAR(255)
    );
    insert into tb1_employee(last_name,gender,email) values("zhulonghao",1,"1127913170@qq.com");
    insert into tb1_employee(last_name,gender,email) values("zhulonghao1",1,"11279131701@qq.com");
    insert into tb1_employee(last_name,gender,email) values("zhulonghao2",1,"11279131702@qq.com");
    insert into tb1_employee(last_name,gender,email) values("zhulonghao3",1,"11279131703@qq.com");
    insert into tb1_employee(last_name,gender,email) values("zhulonghao4",1,"11279131704@qq.com");
    数据库创建好了以后我们开始使用mybatis操作数据库
  • 我们创建一个与这张表对象的javabean类
    public class employee {
    private Integer id;
    private String lastName;
    private String email;
    private String gender;

    public Integer getId() {
    return id;
    }

    public void setId(Integer id) {
    this.id = id;
    }

    public String getLastName() {
    return lastName;
    }

    public void setLastName(String lastName) {
    this.lastName = lastName;
    }

    public String getEmail() {
    return email;
    }

    public void setEmail(String email) {
    this.email = email;
    }

    public String getGender() {
    return gender;
    }

    public void setGender(String gender) {
    this.gender = gender;
    }
    }
  • 导入mybatis的jar包,我们需要导入最主要的两个包mybatis、mysql-connector为了打印日志方便我们可以加入log4j,jar包

也可以使用maven去导入这些jar包,快速方便,这里我选择最原始的方法,熟悉一下。

  • 想要使用log4j,需要写一个log4j的配置文件,首先创建一个资源文件夹,并且标记为资源文件夹,再资源文件夹下编写log4j.properties

    # 全局日志配置
    log4j.rootLogger=ERROR, stdout
    # MyBatis 日志配置
    log4j.logger.com.zenshin.employee.employeeMapper=TRACE #这里要写的是mapper映射文件中的命名空间,下文会给出
    # 控制台输出
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

    然后还需要在mybatis的全局配置文件中加上

    <settings>
    <setting name="logImpl" value="LOG4J" />
    </settings>
  • 创建操作mybatis的xml文件,与log4j的xml文件在一个目录下即可,
    因为每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

    <?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>
    <!--设置配置打印的日志-->
    <settings>
    <setting name="logImpl" value="LOG4J" />
    </settings>
    <environments default="development">
    <environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://192.168.1.8:3306/mybatis?useSSL=false"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
    </dataSource>
    </environment>
    </environments>
    <!--将自己的映射文件添加到主配置中-->
    <mappers>
    <mapper resource="EmployeeMapper.xml"/>
    </mappers>
    </configuration>
  • 编写mybatis的测试代码,根据配置文件和SqlSessionFactoryBuilder类创建一个SqlSessionFactory

    public class main {
    public static void main(String[] args) throws IOException {
    String resource = "mybatis-config.xml"; //这个配置文件为全局配置文件
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//获取到SqlSessionFactory
    }
    }
  • 有了sqlSessionFactory我们要想操作sql,还需要从工厂中创建一个sqlSession,和一个映射sql的xml文件,下面我们来编写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.zenshin.employee.employeeMapper">
    <!--
    namespace:名称空间
    id:唯一标识
    resultType:返回值类型
    #{id}:从参数中传入id值
    -->
    <select id="selectEmp" resultType="com.zenshin.beans.employee">
    select * from tb1_employee where id = #{id}
    </select>
    </mapper>

    这个映射文件就是用来操作数据库的sql语句,通过这个xml操作数据库

  • 在main函数中将映射文件和java代码结合起来

    SqlSession sqlSession = sqlSessionFactory.openSession();//获取sqlSession实例,sqlSession能直接执行已经映射的sql语句
    //找到映射文件的唯一标识:mapping文件的命名空间+id
    //后面是参数
    Employee emp = sqlSession.selectOne("com.zenshin.Employee.employeeMapper.selectEmp", 1);
    System.out.println(emp);
    sqlSession.close();//把session关掉

    这里还有很重要的一点就是我们需要把我们自己的映射文件加到mybatis的全局配置文件中

    <!--加到environments节点下面-->
    <mappers>
    <mapper resource="EmployeeMapper.xml"/>
    </mappers>
  • 运行main方法就可以得到结果了

    /**
    DEBUG [main] - ==> Preparing: select * from tb1_employee where id = ?
    DEBUG [main] - ==> Parameters: 1(Integer)
    TRACE [main] - <== Columns: id, last_name, gender, email
    TRACE [main] - <== Row: 1, zhulonghao, 1, 1127913170@qq.com
    DEBUG [main] - <== Total: 1
    Employee{id=1, lastName='null', email='1127913170@qq.com', gender='1'} //lastname是null是因为bean中的名字和数据库中的不对应
    */
  • 总结一下使用步骤:

    • 根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象,有数据源一些运行环境的信息
    • sql映射文件,配置了每一个sql,以及sql的封装规则
    • 将sql文件注册到全局配置文件中
    • 写代码:
      • 根据全局配置文件得到SqlSeeionFactory;
      • 使用SqlSession工厂,获取到sqlSession对象使用它来进行增删改查,一个SqlSession就代表和数据库的一次会话,用完关闭

接口式编程

接口和映射文件的动态绑定

  • 首先我们定义一个接口
    public interface EmployeeMapper {
    //这里定义一个方法,方法要实现的sql在配置文件中
    public Employee getEmpByid(Integer id);
    }
  • 编写配置文件与接口绑定
    <?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.zenshin.dao.EmployeeMapper">
    <!--
    namespace:写要绑定的接口的全类名
    id:接口要绑定的函数名
    resultType:返回值类型
    #{id}:从参数中传入id值
    -->
    <select id="getEmpByid" resultType="com.zenshin.beans.Employee">
    select * from tb1_employee where id = #{id}
    </select>
    </mapper>
  • 编写测试类,调用接口获取数据
    public class main {
    public static void main(String[] args) throws IOException {
    //1、获取SqlSessionFactory
    String resource = "mybatis-config.xml"; //这个配置文件为全局配置文件
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//获取到SqlSessionFactory
    //2、获取SqlSession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //3、获取接口实现类对象,这是创建了一个代理对象,代理对象去实现增删改查
    EmployeeMapper sessionMapper = sqlSession.getMapper(EmployeeMapper.class);
    //4、调用接口的方法
    Employee employee = sessionMapper.getEmpByid(1);
    System.out.println(employee);
    sqlSession.close();
    }
    }
    这样调用是实现了接口隔离,更加简单,更加灵活同时与xml的耦合更低了。

注解式编程

MyBatis还有一种方式,就是纯注解的方式实现,不需要编写xml映射文件.

  • 首先我们创建一个接口类,给接口类标上@Mapper注解,方法上标注@Select()
    @Mapper
    public interface EmployeeMapper {
    @Select("select * from tb1_employee where id = #{id}")
    public Employee getEmpByid(Integer id);
    }
  • 加入@Mapper主要是用于结合spring使用,通过扫描该注解加入到容器中,然后从容器中获取再使用,因为我们现在不依赖于spring,所以我们需要把这个接口加到mybatis的全局配置类中
    <!--mappers扫描包-->
    <mappers>
    <package name="com.zenshin.dao"/>
    </mappers>
  • 使用的方式与原来一样,只是没有了配置文件,所有的sql语句都是基于注解去写的
    public class main {
    public static void main(String[] args) throws IOException {
    //1、获取SqlSessionFactory
    String resource = "mybatis-config.xml"; //这个配置文件为全局配置文件
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//获取到SqlSessionFactory
    //2、获取SqlSession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //3、获取接口实现类对象,这是创建了一个代理对象,代理对象去实现增删改查
    EmployeeMapper sessionMapper = sqlSession.getMapper(EmployeeMapper.class);
    //4、调用接口的方法
    Employee employee = sessionMapper.getEmpByid(1);
    System.out.println(employee);
    sqlSession.close();
    }
    }
  • 运行方法产生的效果是和映射文件的效果是一样的。

总结

1、Mybatis编程方式一共有两大种

  • 直接加载映射文件,使用SqlSession提供的方法调用sql语句操作数据库
  • 使用接口方式,使用接口方式有两种
    • 使用接口加映射文件的方式,实现sql操作
    • 使用接口加注解的方式,实现操作sql

2、SqlSession代表和数据库的一次会话,用完需要关闭。SqlSession与connection一样都是非线程安全的,每次使用都应该获取新的对象。
3、mapper没有实现类,但是mybatis会为这个接口生成一个代理对象,这个代理对象把接口和xml进行绑定。
4、两个重要的配置文件:

  • mybatis的全局配置文件,包含数据库连接池,事务管理器等。。。系统运行环境信息
  • sql映射文件,保存了每一个sql语句的映射信息。
文章作者: zenshin
文章链接: https://zlh.giserhub.com/2020/05/06/mybatis/01/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 zenshin's blog
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论