美文网首页Java
MyBatis学习笔记 | MyBatis的下载、编写一个Hel

MyBatis学习笔记 | MyBatis的下载、编写一个Hel

作者: 一颗白菜_ | 来源:发表于2019-11-20 22:53 被阅读0次

    MyBatis是一个半自动化,轻量级的持久化层框架,实现了Sql与Java编码分离,功能边界清晰,一个专注业务、一个专注数据。且sql是由开发人员控制的。

    MyBatis下载

    MyBatis的官方文档:https://mybatis.org/mybatis-3/
    MyBatis的下载在GitHub中:https://github.com/mybatis/mybatis-3点此下载。


    点此链接进去,然后就可以看到下图:

    我们将这两个压缩包都下载,下载完成后解压好,进入框架的压缩包,大致的目录如下:

    建立一个HelloWorld

    1.建表

    我们先创建一个数据库,名字为mybatis,然后我们在这个数据库中建立数据表:

    CREATE TABLE tb1_employee(
        id INT(11) PRIMARY KEY AUTO_INCREMENT,
        last_name VARCHAR(255),
        gender CHAR(1),
        email VARCHAR(255)
    )
    

    然后向数据表中添加一条数据:


    2.创建项目

    在idea中直接新建一个Java项目,然后新建一个conf(Sources),再新建一个lib文件夹,然后在lib中导入我们前面下载的mybatis的jar包。在src目录下新建com.cerr.mybatis包。项目目录结构如下:


    3.创建全局配置文件

    然后填入对应的配置信息,例如driver,url,username,password:

    <?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>
    </configuration>
    

    4.配置sql映射文件

    在mybatis中,把sql语句抽取出来在sql映射文件中。里面可以编写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">
    <!--
        namespace : 命名空间
        id : 唯一标识
        returnType : 返回值类型
        #{id} : 从传递过来的参数中取出id值
    
    -->
    <mapper namespace="com.cerr.mybatis.EmployeeMapper">
        <select id="selectEmp" resultType="com.cerr.mybatis.Employee">
        select id,last_name lastName,email,gender from tb1_employee where id = #{id}
        </select>
    </mapper>
    

    配置好sql映射文件后要在全局配置文件中进行注册:

        <!-- 将我们写好的sql映射文件一定要注册到全局配置文件中 -->
        <mappers>
            <mapper resource="EmployeeMapper.xml"/>
        </mappers>
    

    完整的全局配置文件代码:

    <?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>
    
        <!-- 将我们写好的sql映射文件一定要注册到全局配置文件中 -->
        <mappers>
            <mapper resource="EmployeeMapper.xml"/>
        </mappers>
    </configuration>
    

    5.编码

    新建Employee实体类:

    package com.cerr.mybatis;
    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;
        }
        @Override
        public String toString() {
            return "Employee{" +
                    "id=" + id +
                    ", lastName='" + lastName + '\'' +
                    ", email='" + email + '\'' +
                    ", gender='" + gender + '\'' +
                    '}';
        }
    }
    

    编写测试类:

    package com.cerr.mybatis;
    
    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 static org.junit.Assert.*;
    
    public class MyBatisTest {
    
        /**
         * 1.根据xml配置文件(全局配置文件)创建一个SQLSessionFactory对象
         *         有数据源一些运行环境信息
         * 2.sql映射文件:配置了每一个sql,以及sql的封装规则等
         * 3.将sql映射文件注册在全局配置文件中
         * 4.编写代码
         *      1).根据全局配置文件得到SQLSessionFactory
         *      2).使用sqlSession工厂,获取到sqlSession对象,使用它来执行增删改查
         *          一个sqlSession就是代表和数据库的一次会话,用完要关闭
         *      3).使用sql的唯一表示来告诉mybatis执行哪个sql,sql都是保存在sql映射文件中
         * @throws IOException
         */
        @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 sqlSession = sqlSessionFactory.openSession();
            try{
                Employee employee = sqlSession.selectOne("com.cerr.mybatis.EmployeeMapper.selectEmp",1);
                System.out.println(employee);
            }finally {
                sqlSession.close();
            }
        }
    }
    

    对上述代码,我们首先根据xml配置文件(全局配置文件)创建一个SQLSessionFactory对象,然后再使用SQLSessionFactory对象来创建一个SqlSession对象,而SqlSession对象可以执行依据映射的sql语句。

    运行代码,结果如下:



    改进:使用接口式编程

    接口式编程

    在之前我们是先定义一个接口,再去定义一个实现类;而MyBatis是定义一个接口,然后通过一个sql映射文件,使接口与sql映射文件绑定,接口的方法与标签绑定,绑定之后MyBatis会为接口生成一个代理对象,可以使用这个代理对象来进行增删改查

    如何绑定

    • 接口和sql映射文件的绑定
      在sql映射文件的<mapper ></mapper>标签中有一个namespace属性,我们将其值写为要绑定的接口的全类名即可。
    • 接口的方法与标签绑定
      对于编写sql语句的标签,有一个id属性,我们将接口的某个方法与其相对应即可。

    上面HelloWorld的改进

    1.新建接口

    我们使用接口式编程来进行修改,首先我们新建一个Employee的接口:

    package com.cerr.mybatis.dao;
    
    import com.cerr.mybatis.Employee;
    
    public interface EmployeeMapper {
    
        public Employee getEmpById(Integer id);
    }
    

    里面有一个方法,是通过id返回数据表中对应的记录。

    2.修改EmployeeMapper.xml配置文件

    然后我们来修改EmployeeMapper.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">
    <!--
        namespace : 命名空间,指定为接口的全类名
        id : 唯一标识
        returnType : 返回值类型
        #{id} : 从传递过来的参数中取出id值
    
    -->
    <mapper namespace="com.cerr.mybatis.dao.EmployeeMapper">
        <!-- id 与接口中的某方法名对应 -->
        <select id="getEmpById" resultType="com.cerr.mybatis.Employee">
            select id,last_name lastName,email,gender from tb1_employee where id = #{id}
        </select>
    </mapper>
    

    3.编码

    package com.cerr.mybatis;
    
    import com.cerr.mybatis.dao.EmployeeMapper;
    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 static org.junit.Assert.*;
    
    public class MyBatisTest {
    
        //获取SQLSessionFactory
        public SqlSessionFactory getSqlSessionFactory() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            return new SqlSessionFactoryBuilder().build(inputStream);
        }
    
        @Test
        public void test1() throws IOException {
            //获取SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
            //获取SqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            try {
                //获取接口的实现类对象:会为接口自动的创建一个代理对象,代理对象去执行增删改查
                EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
                //调用方法
                Employee employee = employeeMapper.getEmpById(1);
                //打印
                System.out.println(employee);
            }finally {
                //关闭
                sqlSession.close();
            }
        }
    }
    

    修改后的代码,在获取SqlSessionFactorySqlSession与之前一样,但是后面我们是直接通过SqlSession的getMapper(EmployeeMapper.class)来获取该接口的实现类对象(实际上是一个代理对象),然后通过这个对象来调用接口中定义的方法(前提是已经与sql映射文件中的标签绑定了)。

    运行代码后结果如下:



    总结

    • SqlSession代表和数据库的一次会话,用完必须关闭。
    • SqlSessionconnection一样都是非线程安全的,每次使用都应该去获取新的对象。
    • mapper接口没有实现类,但是将接口和sql映射文件绑定之后,mybatis会为这个接口生成一个代理对象,可以使用这个代理对象进行增删改查
    • 两个重要的配置文件
      mybatis的全局配置文件:包含数据库连接池信息、事务管理器信息等等。
      sql映射文件:保存了每一个sql语句的映射信息,将sql语句抽取出来。

    相关文章

      网友评论

        本文标题:MyBatis学习笔记 | MyBatis的下载、编写一个Hel

        本文链接:https://www.haomeiwen.com/subject/htioictx.html