Mybatis初试

话不多说,开始使用mybatis

初试

编写实体类

这个实体类对应了数据库中的一张表,这里以员工变为例,这里用了lombok自动构建getset方法,如果没有使用lombok,需要将get以及set方法加上

package com.jinxin.bean;

import lombok.Data;

@Data
public class Employee {
    private Integer id;
    private String lastName;
    private String email;
    private String gender;
}

编写配置文件

导完包后就需要编写全局配置文件了,在编写之前需要先了解一下目录结构,当然可以将文件放到任意的目录,这并没有问题,但是仍旧有一个最佳的方案,如下:

/my_application
  /bin
  /devlib
  /lib                <-- MyBatis *.jar 文件在这里。
  /src
    /org/myapp/
      /action
      /data           <-- MyBatis 配置文件在这里, 包括映射器类, XML 配置, XML 映射文件。
        /mybatis-config.xml
        /BlogMapper.java
        /BlogMapper.xml
      /model
      /service
      /view
    /properties       <-- 在你 XML 中配置的属性文件在这里。
  /test
    /org/myapp/
      /action
      /data
      /model
      /service
      /view
    /properties
  /web
    /WEB-INF
      /web.xml

如上在data目录建立好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?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>
mybatis-config.xml

生成sqlSessionFactory

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。

从xml文件中构建SqlSessionFactory

String resource = "data/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

从SqlSessionFactory中获取SqlSession

既然有了 SqlSessionFactory ,顾名思义,我们就可以从中获得 SqlSession 的实例了。SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。我们可以通过 SqlSession 实例来直接执行已映射的 SQL 语句,在此之前我们需要搞清楚一个概念,什么是已经映射的SQL

什么是已经映射的SQL

还记得全局的配置文件中有一个mapper标签吗?在那里面的SQL就叫做已映射的sql

那么怎样映射呢?

1、我们首先去data目录建立一个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.jinxin.bean.EmployeeMapper">
    <!--
        namespace: 名称空间
        id: 唯一标识
        resultType: 返回值类型,即想要将返回的对象封装成设么样的独享。直接将对应的实体类的全类名写上即可
        #{id}: 从传递过来的参数中取出id值
    -->
    <select id="selectEmp" resultType="com.jinxin.bean.Employee">
      select * from tb1_employee where id = #{id}
    </select>
</mapper>

有几个属性说明:

  • namespace:名称空间,使用一个比较有意义的即可,在后面的接口式编程中这里填写接口的路径
  • id:唯一标识,在Sqlsession执行映射的SQL时需要传入这个唯一的标识。在接口式编程中填写方法名
  • resultType:返回值类型,即想要返回的值封装成什么样子的对象。直接将对应的实体类名全路径写上即可
  • #{id}:从传递过来的参数中取出id值

2、当写好配置文件后,将这个文件映射到全局配置文件的mapper里面即可,然后SqlSession级就可以执行这里面的sql语句了

<mappers>
    <mapper resource="com/jinxin/data/EmployeeMapper.xml"/>
</mappers>

获取SqlSession并执行已映射的SQL语句

注意:

  1. 执行完后要将sqlSession关闭
  2. 在查询的时候需要传入select标签的id定位到相应的SQL,最好是将名称空间也带上,名称空间跟id之间使用.连接
// 获取SqlSession实例
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
    Employee employee = sqlSession.selectOne("selectEmp", 1);
    System.out.println(employee);
} finally {
    sqlSession.close();
}

接口式编程

上面基本已经完整的介绍了mybatis的使用流程,但是像上面那样直接执行映射的SQL语句已经使用的不是很多了,用的更多的是接口式操作,下面介绍使用方式

定义接口

接口式编程首先得有接口,如下定义了一个接口,并且定义一个根据id查询记录的方法

import com.jinxin.bean.Employee;

public interface EmployeeMapper {
    Employee getById(Integer id);
}

修改xxxMapper.xml配置文件

之前Mapper.xml文件中的命名空间跟id都是随意定义的,在这里我们不再随便定义了,将命名空间写成接口的全路径,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.jinxin.mapper.EmployeeMapper">

    <select id="getById" resultType="com.jinxin.bean.Employee">
      SELECT * FROM `tb1_employee` WHERE id = #{id}
    </select>
</mapper>

实现类?

这里会有一个问题,既然定义了接口,就自然而然的会想到要定义它的实现类,那么这里需要定义吗?是不需要的,为什么呢?从需求上分析,接口中的方法需要的是通过传入的id获取到一个Employee对象,而映射的SQL同样是通过id查询到Employee对象,这两者之间完全可以直接对接,并不再需要实现类做什么,因此实现类在这里是多余的

通过sqlSession查询

做好一切准备工作后就可以直接使用sqlSession查询了,如下:

@Test
public void test1() throws IOException {
    // 获取sqlSessionFatory对象
    String resource = "data/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    // 获取sqlSession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    try {
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        Employee byId = employeeMapper.getById(1);
        System.out.println(byId);
    } finally {
        sqlSession.close();
    }
}

上面通过sqlSessiongetMapper方法获取到了一个接口的实现类,但是我们并没有写实现类,那这个实现类究竟是什么?其实它获取的是一个代理对象,代理对象会去执行增删改查

posted @ 2018-11-08 16:30  Jin同学  阅读(85)  评论(0)    收藏  举报