一、MyBatis简介

  • MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
  • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
  • MyBatis可以使用简单的XML注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.
  • MyBatis是一个半自动化持久化层框架。

对于使用JDBC操作数据库,SQL夹在Java代码块里,耦合度高导致硬编码内伤,维护不易且实际开发需求中sql是有变化,频繁修改的情况多见。

Hibernate操作数据库,SQL长难且复杂,内部自动生产的SQL,不容易做特殊优化。基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降。

MyBatis操作数据库,核心sql还是需要自己优化,sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。MyBatis将重要的步骤抽取出来可以人工顶置,其他步骤自动化,重要步骤都是写在配置文件中,也方便维护。MyBatis底层就是对原生JDBC的一个简单封装,既将java编码与SQL抽取了出来,还不会失去自动化功能,属于半自动化的持久层框架。

mybatis mysql 创建系统变量_MyBatis

二、MyBatis环境搭建

创建MyBatis全局配置文件mybatis-config.xml

<?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.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!--注册自己编写的每一个接口的实现文件-->
    <mappers>
        <mapper resource="EmployeeDao.xml"/>
    </mappers>
</configuration>

创建SQL映射文件EmployeeDao.xml,映射文件的作用就相当于是定义Dao接口的实现类如何工作。

<?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">

<!--名称空间是用来写接口的全类名的,相当于告诉MyBatis这个配置文件是配置哪个接口的-->
<mapper namespace="dao.EmployeeDao">
    <!--select:用来定义一个查询操作,
    id是方法名,相当于这个配置是对于某个方法的实现
    resultType指定返回值类型,查询操作必须指定
    -->
    <select id="getEmpById" resultType="bean.Employee">
        select * from employee where id = #{id}
    </select>

    <!--增删改不用写返回类型,返回的是影响多少行,MyBatis自动判断,如果是数字直接返回,如果是Boolen(影响0行会封装成false,否则true)-->
    <update id="updateEmployee">
        update employee set empname = #{empName}, gender = #{gender}, email = #{email} where id = #{id}
    </update>

    <delete id="deleteEmployee">
        delete from employee where id = #{id}
    </delete>

    <insert id="insertEmployee">
        insert into employee value(#{id}, #{empName}, #{gender}, #{email})
    </insert>
</mapper>

测试,根据全局配置文件,利用SqlSessionFactoryBuilder创建SqlSessionFactory,使用SqlSessionFactory获取sqlSession对象。一个SqlSession对象代表和数据库的一次会话。

@Test
    public void test1() throws IOException {
        //1、根据全局配置文件创建出一个SQLSessionFactory
        //SqlSessionFactory是SqlSession工厂,负责创建SqlSession对象
        //SqlSession是sql会话,代表和数据库的一次会话
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        Employee employee = null;
        SqlSession sqlSession = null;

        try {
            //2.获取和数据库的一次会话,类似于getConnection()方法
            sqlSession = sqlSessionFactory.openSession();

            //3、使用SqlSession操作数据库,获取到dao接口的实现
            EmployeeDao employeeDao = sqlSession.getMapper(EmployeeDao.class);

            //4、调用接口中的方法
            int i = employeeDao.insertEmployee(new Employee(null, "tomcat", 1, "tomcat@qq.com"));
            System.out.println(i);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

            //默认自动提交为false,所以需要手动提交
            sqlSession.commit();

            //关闭会话
            sqlSession.close();
        }

    }

SqlSession 的实例不是线程安全的,因此是不能被共享的。每次使用完成后需要正确关闭,这个关闭操作是必须的。SqlSession可以直接调用方法的id进行数据库操作,但是最好还是使用SqlSession获取到Dao接口的代理类,执行代理对象的方法,可以更安全的进行类型检查操作。