美文网首页mybatis
【mybatis】之一:快速入门案例

【mybatis】之一:快速入门案例

作者: 蛋花汤汤 | 来源:发表于2019-01-25 15:05 被阅读0次

    一、开发环境

    Idea + maven + mybtis3.4.1

    二、简单示例

    此示例没有使用spring集成,后续会有spring集成的Demo。mybatis官方文档中,quit start部分非常详细,按照介绍即可快速上手mybatis。

    • 首先,看一下项目结构。本示例是再idea下编写,使用默认的maven模板创建。


      图片.png

    talk is cheap, show me code. OK,下面是此demo的代码部分。

    • 第一步:再pom文件中,引入需要的依赖。

    没有很特殊的地方,主要引入了mybatis、mysql的驱动,以及用于测试的JUnit。

        <dependencies>
            <!-- 用到的mybatis依赖 -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.4.1</version>
            </dependency>
    
            <!-- 用户测试使用的依赖 -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-api</artifactId>
                <version>RELEASE</version>
            </dependency>
    
            <!-- mysql 驱动 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.38</version>
            </dependency>
    
        </dependencies>
    
    • 第二步:编写mybatis-config.xml 全局配置文件。

    mybatis应用中,有两类关键的配置文件,一个是本部分要介绍的全局配置文件:mybatis-config.xml,一个是sql mapper 映射文件。这个全局文件中包含了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">
    <configuration>
        <environments default="mysql">
            <environment id="mysql">
                <!-- 此处的JDBC、POOL等都是被框架设置别名的 -->
                <!-- 之后会交给spring framework管理 -->
                <transactionManager type="JDBC"></transactionManager>
                <!-- 之后会交给spring framework管理 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"></property>
                    <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"></property>
                    <property name="username" value="root"></property>
                    <property name="password" value="123456"></property>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper class="com.hly.dao.EmployeeMapper"></mapper>
        </mappers>
    </configuration>
    
    • 第三步:定义一个简单的POJO,并在mysql中创建对应的table。
    package com.hly.entity;
    
    public class Employee {
        private int id;
        private String name;
        private String gender;
        private String email;
        // 省略setter、getter、toString等方法
    }
    

    在mariadb中创建一张对应此实体的表:tbl_employee.

     CREATE TABLE `tbl_employee` (
      `id` int(10) NOT NULL AUTO_INCREMENT,
      `name` varchar(32) NOT NULL,
      `gender` varchar(1) NOT NULL,
      `email` varchar(100) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
    
    • 第四步:编写接口及sql mapper配置文件。

    这一步的接口和配置文件是一一对应的。应用层面向接口编程,由框架根据接口和配置文件的对应关系生成代理对象,完成sql封装和执行过程。

    package com.hly.dao;
    
    import com.hly.entity.Employee;
    
    public interface EmployeeMapper {
        public Employee getEmpById(int id);
    }
    

    对应的sql mapper如下:

    <?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.hly.dao.EmployeeMapper">
        <select id="getEmpById" resultType="com.hly.entity.Employee">
            select * from tbl_employee where id = #{id}
        </select>
    </mapper>
    

    这里只演示了一个查询方法。注意一下几点:
    1、xml中,mapper标签的namespace属性,要指定成对应java接口的全限定名称,以此完成绑定。
    2、xml中,增删改查操作,均有对应的标签,标签的id对应java接口中的方法名。
    3、resultTpye虽然可以指定别名,但建议还是使用类的全限定名称,这样可以提升可读性,使阅读代码的人可以快速知晓返回类型,也可以在ide中快速追踪到此类的内容。

    • 第五步: 这一步中,主要展示业务逻辑层面如何使用mybatis。

    前几步中已经把mybatis的使用步骤进行了简单的展示,在应用逻辑层使用的时候,只需要根据全局配置文件(mybatis-config)的内容创建SqlSessionFactory,从SqlSessionFactory中拿到SqlSession,再指定要使用的SqlMapper类,即可进行数据库操作。

    package com.hly;
    
    import com.hly.dao.EmployeeMapper;
    import com.hly.entity.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.jupiter.api.Test;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    public class MainTest {
    
        public SqlSession getSession() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            return sqlSessionFactory.openSession();
        }
    
        @Test
        public void testQuery(){
            SqlSession sqlSession = null;
            try {
                sqlSession = getSession();
                EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
                Employee e = employeeMapper.getEmpById(1);
                System.out.println(e);
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                sqlSession.close();
            }
        }
    }
    

    代码逻辑较为简单,基本流程就是:加载全局配置文件(mybatis-config)-->创建SQLSessionFactory-->拿到SqlSessionn-->拿到接口实现-->执行数据库操作。

    三、结果验证

    在数据库中插入一条记录:


    图片.png

    执行test方法,console打印如下内容,执行成功。


    图片.png

    四、问题留根

    别看是是个小Demo,在编写执行过程中,还是遇到了几个小问题,下面记录一下。

    • java接口类和sql mapper XML绑定不成功的问题。
      在本例中,EmployeeMapper.java和EmployeeMapp.xml同放在com.hly.dao中,理论上,在全局配置文件中加入
        <mappers>
            <mapper class="com.hly.dao.EmployeeMapper"></mapper>
        </mappers>
    

    应该可以执行成功。但是作者执行测试方法后,抛出了一个方法绑定异常,百度之后发现这时Idea一个特性导致:Idea在进行编译打包时,src下的xml文件不会被编译到类路径中(Eclipse不存在此问题)。解决方式是在pom中增加以下代码段:

    <build>
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                    </includes>
                </resource>
            </resources>
     </build>
    
    • MySQL远程访问密码问题。
      平时都是直接用已经部署好的mysql环境,mysql -h -P -u -p等等,作者在阿里云的centos7上安装了mariadb后,发现不用用户名和密码就可以登录。百度后发现,需要在mysql库中的user表中,将user=''的用户删掉,并且设置root的密码,即可在本地要求使用用户名密码登录,此时,注意仅仅是在本地成功。
      执行本例的代码时,提示登录被远程服务器拒绝,阿里云的端口策略是开放了的,此时又百度,发现需要给mysql库user表中的root用户的host字段设置空值(此步骤可能会报错,可忽略),之后刷一下权限表flush privileges,这样,远程即可登录访问。

    相关文章

      网友评论

        本文标题:【mybatis】之一:快速入门案例

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