这一部分我们将从三方面对MyBatis进行一个初步的认识。
MyBatis概述
我们在之前做JSP+Servlet+Dao的Web项目时,使用的是Apache提供的Dbutils对数据库进行各项操作,其主要步骤如下:
JDBCàDbutils(QueryRunner)àjdbcTemplet:
缺点很明显:
- 功能简单
- sql语句编写在java代码里
当我们对已经成型的项目中更改sql语句,我们需要为了这一句更改,作出巨大牺牲,打包编译发布,运行都要重来一遍,这是一种硬编码、高耦合的方式,我们在任何时候都不是推荐的
然后我们说说前些年很火的Hibernate,Hibernate是一种全自动ORM框架,旨在消除sql语句
它将我们原先JDBC的一系列操作当做一个黑盒,有Hibernate为我们提供对象操作,也就说,我们不必编写sql语句,由框架提供,当然这也引起新的问题,如果我们想要优化sql语句,编写一些复杂的sql语句时,我们用Hibernate就无法做到这点。Hibernate还有一个缺点,就是全映射,如果JavaBean有100个字段,那么将会对应数据库100列,当我们只想要其中一个字段时,Hibernate并不允许,它依旧会返还100列上的信息。
其实Hibernate提供了一个HQL技术,可以解决上述问题,不过这个将会额外增加我们的学习负担。
综上,我们希望sql语句交给我们开发人员编写,能完成一些定制功能,不是灵活性。所以,基于这一点,Mybatis就诞生了。
MyBatis完美的实现了上述的猜想,将编写sql的权利还给了开发人员,将sql语句写进配置文件,实现sql与Java代码分离,并且sql由开发人员编写。
MyBatis的配置
我这里仅给出Maven的配置方法,因为现在商用项目,也基本都是使用Maven,不会使用传统的jar包导入的方式。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
其中log4j是用来做测试使用的,既然MyBatis是用于对数据库的操作,那么数据库连接相关包,也是并不可少的。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
我们先创建一个新的数据库,作为测试,
接下来是JavaBean,JavaBean要求字段名与数据库的列名一直,这里我们故意写错一个字段名
生成getter,setter,toString函数。
MyBatis对数据库的操作是基于SqlSessionFactory,而SqlSessionFactory是有XML配置文件创建的(其实你也可以不通过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="${driver}"/>
-
<property name="url" value="${url}"/>
-
<property name="username" value="${username}"/>
-
<property name="password" value="${password}"/>
-
</dataSource>
-
</environment>
-
</environments>
-
<mappers>
-
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
-
</mappers>
-
</configuration>
在dataSource中填入我们熟悉的几项内容,至于mapper标签,我们稍后再说,
-
String resource = "org/mybatis/example/mybatis-config.xml";
-
InputStream inputStream = Resources.getResourceAsStream(resource);
-
SqlSessionFactory sqlSessionFactory =
-
new SqlSessionFactoryBuilder().build(inputStream);
然后我们可以编写一个测试类,输入以上代码(resource填写刚刚我们编写的xml配置文件,至于命名随便,这里我命名为mybatis-conf.xml)
接着我们编写一个映射文件,mapper.xml
Namespace
namespace填写上这个文件的名字,id就是这个sql语句的唯一标识,resultType填入JavaBean的全限定名,由于我们写错了last_name字段名,所以我们需要用别名的方式书写,这样我们就可以在总配置文件里的mapper标签里写上这个配置文件的名字
在测试代码中编写以下代码,完成测试
-
SqlSession openSession = getSqlSessionFactory().openSession();
-
try {
-
Employee employee = openSession.selectOne("mapper.xml.selectEmp", 1);
-
-
-
} finally {
-
openSession.close();
-
}