MyBatis学习-1

MyBatis sql ORM

Posted by lvyonghao on April 13, 2019

MyBatis学习-1

在学习Java后端的过程中,很重要的一部分就是要去操作数据库,实现持久层,我们最开始使用JDBC这样的工具去操作,后来会使用Spring封装的JdbcTemplate,但这些仅仅只能算是工具,和全自动映射ORM(Object Relation Mapping)框架的整体解决方案相比较还是差得远。 通常我们使用JDBC的操作流程为:

  1. 编写sql
  2. 预编译
  3. 设置参数
  4. 执行sql
  5. 封装结果

当我们使用ORM方式的时候,只需要创建好JavaBean,和操作DbRecords就好了中间的部分呢框架来实现,就是我们代码中的实现类,和数据库中的表一一对应的意思啦,当然他有他的缺点,因为所有的操作都是框架来实现,所以你不能对他进行优化,一些复杂的sql语句也得自己去定制,所以呢我们希望sql交给开发人员,希望sql不失去灵活性,所以我们使用Mybatis,编写sql语句放到我们的配置文件当中去,剩下的让框架自己去执行,这样既不少灵活性,又可以方便很多,sql与java编码分离。


Hello World

接下来我们用Mybatis写一个Test,首先我们先去创建一个数据库名字叫做mybatis然后去添加一个table

CREATE TABLE `tbl_employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `last_name` varchar(255) DEFAULT NULL,
  `gender` char(1) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) 

在表中添加一条记录id=1,剩下的随便写了 — 创建一个持久层的类与数据库中的表,属性和表中的列对应:

package com.snake_lvyonghao.MyBatis.bean;

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) {
        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;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", Lastname='" + Lastname + '\'' +
                ", email='" + email + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}


下面写一个MyBatis的Demo

package com.snake_lvyonghao.MyBatis.test;

import com.snake_lvyonghao.MyBatis.bean.Employee;
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;

public class MyBatistest {
    @Test
    public void test() throws IOException {
        String resource = "Mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);

        //获取sqlSession实例,能直接执行已经映射的sql语句
        SqlSession opensession = sqlSessionFactory.openSession();

        //两个参数,sql的唯一标示,执行sql的参数
        try {
            Employee e = opensession.selectOne("org.mybatis.EmployeeMapper.selectEmp",1);
            System.out.println(e);
        }finally {
            opensession.close();
        }
    }
}


当然配置文件我也准备好了,直接在工程文件中的resource文件夹当中添加就好了 Mybaits-config.xml: 和JDBC一样设置Diviver,数据库的位置,用户名,密码,还有很重要的一点就是设置mapper resource,就是你的sql映射文件

<?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?userSSL=FALSE"/>
                <property name="username" value="root"/>
                <property name="password" value="12345678"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="EmployeeMapper.xml"/>
    </mappers>
</configuration>

EmployeeMapper(sql映射文件): 在Mapper文件当中我们要设置他的namespace,设置这个映射文件的唯一标示,还有他的返回类型,在这里我们是持久层的操作所以返回类型就是一个Employee类了,要写上这个类的路径,最后设置好你的sql语句就ok了 其中的#{id} 和JDBC当中的?和是一样的就是一个占位符。

<?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="org.mybatis.EmployeeMapper">

    <!--
    namespace名称空间
    id唯一标示
    resultType,返回值类型
    #{id}从传递过来的参数中取出id值-->
    <select id="selectEmp" resultType="com.snake_lvyonghao.MyBatis.bean.Employee">
    select id,last_name  lastName,email,gender from tbl_employee where id = #{id}
  </select>
</mapper>

run一下我们可以看到他给出的结果:Employee{id=1, Lastname='tom', email='tom@atguigu', gender='0'}这个结果正是我在数据库当中添加的id=1的那一条记录

总结

    /**
     * 1.根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象
     *      有一些数据源运行信息
     * 2.sql映射文件;配置可每一个sql,以及sql的封装规则,
     * 3.将sql映射文件注册在全局配置文件当中
     * 4.写代码
     *      1)根据全局配置文件得到SqlSessionFactory
     *      2)使用sqlSession工厂,获取到sqlSession对象使用它来执行增删改查
     *      一个sqlSession就是代表和数据库的一次会话,用完关闭
     *      3)使用sql的唯一标示告诉MyBatis执行那个sql,sql都保存在映射文件当中
     */

最后再放上这个Demo的代码SSM框架源码中的MyBatis文件就是我们的项目了,祝大家在学习MyBatis中旗开得胜