您的位置:首页 > 编程语言 > Java开发

【Spring+MyBatis+MySQL实战入门】三、MyBatis的4个基本配置介绍

2017-02-19 15:06 543 查看
本系列文章系本人原创,欢迎转载,转载请注明出处

上一章中,我们介绍了要让程序能使用MyBatis来操作数据库,应该至少有4个最基本的需要写/配置的地方:Java Model,DAO,DAO和SQL的映射关系,以及MyBatis连接数据库的配置。我们还介绍了使用MyBatis Generator

来生成这4个配置中的前三个。在本章中,我们来逐一探讨这4个基本的配置。

一、Java Model

我们先以MyBatis Generator为我们自动生成的User类作为例子来看一下:



可以看到,这个User对象就是一个很简单的POJO类,提供了一些属性和getter/setter方法,仅此而已。

结合User表的定义:



我们可以发现,User类就是User表对应的实体类。

细心的读者可能会发现,MyBatis Generator除了帮我们生成了User类,还生成了一个UserExample类:



如果我们不用MyBatis Generator创建实体类,而是自己写实体类的话,这个UserExample类并不是必须的。那么这个UserExample类究竟是做什么的呢?我们看一下这个类里面定义的成员变量和方法不难发现,这个类可以帮助我们实现更发杂的查询(此处的“查询”不一定是select,如 ‘delete * from user where …’中的where子句指定了一个筛选条件,从某种意义上也算是“查询”)。结合后面会讲到的Mapper以及Mapper和Sql的映射关系,我们能更好的理解UserExample类的作用。

注:因为Example相关内容不是必须的,如果不想让MyBatis Generator生成相关内容,可以参考这里

二、DAO (MyBatis中的Mapper)

常用的设计模式/框架中,经常会提到Data Access Object (DAO)的概念,它封装了具体与数据库(或其他数据存储机制)打交道的方法,使得上层Java代码即使对数据是如何存储的廖无所知也能方便的存取数据。MyBatis中的Mapper就可以理解为是一种DAO。我们仍以UserMapper举例:



可以看到以下几点:

UserMapper是一个接口

UserMapper这个接口中提供了常用的增删改查的功能

接口中部分方法用到了之前提到过的UserExample类,这就是为什么我们之前说UserExample可以帮助我们实现复杂的“查询”功能。

讲到这里,善于思考的读者们可能会有疑问:UserMapper仅仅是一个接口,必须要有接口的实现类才能真正的实现方法的调用,但是MyBatis Generator并没有生成相应的实现类。这是个很好的问题,其答案就是我们接下来要讲的DAO(Mapper)和Sql之间的映射关系。

三、DAO(Mapper)和Sql之间的映射关系

在上一节中,我们留了一个问题:Mapper接口的实现在哪里?为了回答这个问题,我们来思考这样一个问题:Mapper接口的实现应该怎么写?

如果我们不用任何框架的话,最直接也是最简单的写法就是:新建一个类,实现Mapper接口,然后在该类的各方法中,使用JDBC(或其他工具)来执行该方法对应的Sql语句。这是一个最朴素的实现方法,可以说几乎任何框架都是在这个实现方法上加以包装,或提取出对Sql的依赖,或是自动生成相应的Sql等等。

通过回答这个问题,我们不难发现,无论实现方法是什么,其根本要解决的是Java形式的Mapper接口中定义的各方法到对应的Sql语句之间的映射关系。MyBatis针对这一问题的解决方案是:将映射关系保存在xml文件中(当然也可以以注解的方式保存在Java文件中,两种方法各有利弊。作为入门教程,我们在此只讨论xml形式的解决方案)。这样,映射关系就有了。有了接口,有了映射关系,MyBatis就能为我们生成代理类了,即我们在Java中调用Mapper接口中的方法时,MyBatis就可以自动的执行该方法对应的Sql语句。

至此,我们可以这么回答上一节留下的“Mapper接口的实现在哪里”这个问题了:我们将Mapper接口中各方法对应要执行的Sql语句保存在xml文件中,由MyBatis负责在调用接口时去执行相应的Sql语句,即我们告诉MyBatis要执行什么,而怎么执行则由MyBatis负责,对其内部实现逻辑,在大多数情况下我们无需关心。

这个表示映射关系的xml文件内容比较长,这里就不贴出来演示了,读者可以在这里获得源码。针对这个xml文件的写法,不是在一篇文章中就可以完全介绍完的,好在这个xml文件是MyBatis Generator自动生成的,在我们的入门教程中,这个自动生成的xml文件已经足够用了,没有必要再做修改。如果读者有兴趣的话,可以参考中文版官方文档

四、MyBatis连接数据库的配置

上述三个配置都是在连接好数据库之后,Java与MyBatis交互时需要的配置。这第四个配置则是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>
<properties resource="mybatis-config.properties" />
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/CartMapper.xml" />
<mapper resource="mapper/ProductMapper.xml" />
<mapper resource="mapper/UserMapper.xml" />
</mappers>
</configuration>


其中用到的配置配件mybatis-config.properties:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/smm
username=root
password=root


这个简单的xml配置文件配置了MyBatis是如何连接数据库的:

首先,
<properties resource="mybatis-config.properties" />
定义了从mybatis-config.properties中读取属性。

其次,environments元素制定了默认的environment是id为“development”的environment。这里详细介绍下,实际情况中,针对不同的环境(生产环境,开发环境,测试环境等),可能会有不同的数据库配置,在environments中,我们就可以定义不同的environment来对应各环境,并在environment元素下定义各数据库相关的配置,这样就可以方便我们将代码(包)部署到不同的环境中。

最后,mappers元素里面定义MyBatis会读取哪些xml文件中的Mapper和Sql的映射关系。

这只是一个最简单的配置文件的实现,该配置文件的详细实现不是在一篇文章中可以介绍的完的。有兴趣的读者可以参考中文版官方文档
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mysql java mybatis