Mybatis初试
话不多说,开始使用mybatis
初试
编写实体类
这个实体类对应了数据库中的一张表,这里以员工变为例,这里用了lombok自动构建get跟set方法,如果没有使用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>
生成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语句
注意:
- 执行完后要将sqlSession关闭
- 在查询的时候需要传入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(); } }
上面通过sqlSession的getMapper方法获取到了一个接口的实现类,但是我们并没有写实现类,那这个实现类究竟是什么?其实它获取的是一个代理对象,代理对象会去执行增删改查