本篇文章主要介绍了什么是 mybatis 以及一个简单的入门程序实践帮助入门和理解。
Mybatis 入门到实践系列前言
mybatis 是目前比较流行的 Java 持久层框架,我们所说的 SSM 的最后一个 M 代表的就是 mybatis 了。
本系列博客围绕着 mybatis 的学习展开,从入门到实际开发应用,都有涉及!
看了这篇文章你将:
- 了解什么是 mybatis
- 能够了解 mybatis 与 JDBC 对比的优势
- 能够搭建 mybatis 的入门环境
- 能够运行 mybatis 的入门案例
1. 简介
什么是 MyBatis ?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由 apache software foundation 迁移到了 google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合。
官网: http://www.mybatis.org/mybatis-3/
GitHub 仓库地址 : https://github.com/mybatis/mybatis-3.git
选择MyBatis的理由
- mybatis 是一个持久层的框架,是对 JDBC 操作数据库的封装,使开发者只需要关注业务本身,不需要花费精力去处理加载驱动、创建数据库连接对象、创建 statement 语句对象、参数设置、结果集处理等一系列繁杂的过程代码。
- mybatis 通过 xml 或注解进行配置,将 java 对象与 sql 语句中的参数自动映射生成最终执行的 sql 语句,并将 sql 语句执行结果自动映射成 java 对象,返回给业务层(service)应用。
2. 从JDBC 到 mybatis
使用 JDBC 开发 的步骤
-
加载驱动
-
创建一个数据库连接对象
-
定义sql语句
-
创建Statement语句对象
-
设置参数
-
执行
-
处理结果集
-
释放资源(关闭Connection,关闭Statement,关闭ResultSet)
Q:实现JDBC有八个步骤,哪些步骤是可以进一步封装的,减少我们开发的代码量?
总结 JDBC 开发的问题
-
频繁创建数据库连接对象和释放,容易造成系统资源的浪费,从而影响系统的性能。在企业项目中,可以通过使用连接池技术解决这个问题。但是使用jdbc需要我们自己来实现连接池。mybatis内部提供连接池。
-
sql语句的定义、参数设置、结果集处理存在硬编码。在企业项目中sql语句变化的可能性较大,一旦发生变化,需要修改java代码,系统需要重新编译,重新发布。不好维护。
-
结果集处理存在重复代码,处理麻烦。如果可以自动映射为java对象会比较方便。
3. 入门
这里举一个比较简单的例子,就是根据 id 查询用户。
3.1 安装
要使用 MyBatis, 只需添加jar包 mybatis-x.x.x.jar 就可以了。
如果使用 maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
这里列出我配置入门程序,使用的 pom.xml 文件,仅供参考:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- mysql版本 -->
<mysql.version>5.1.30</mysql.version>
<!-- junit版本 -->
<junit.version>4.12</junit.version>
<!-- mybatis版本号 -->
<mybatis.version>3.4.5</mybatis.version>
<!-- log4j日志包版本 -->
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<dependencies>
<!-- mysql数据库依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- log4j日志包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- junit依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 设置编译插件,如果不设置的话默认是 JDK1.5 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
</plugins>
</build>
3.2 XML 映射配置文件
对于框架来说,基本都会有主配置文件,mybatis 也不例外。
mybatis 的 xml 主配置映射文件可以在下载的压缩文件中找到一个 PDF 说明文档,或者官方网站的介绍也是有的。
下载的压缩包:
官方的说明文档网址:http://www.mybatis.org/mybatis-3/zh/configuration.html
我这里列举出简单的配置文件供入门使用。具体的配置文件使用在后续介绍,也可以先看官方文档。
sqlMapConfig.xml 说明:它就是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>
<!-- 运行环境配置 -->
<!-- default:指定使用哪一个运行环境 -->
<environments default="development">
<!-- id:唯一标识一个运行环境 -->
<environment id="development">
<!-- 配置事务 -->
<transactionManager type="JDBC" />
<!-- 数据源配置 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis_01" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
</configuration>
注意数据源的配置,要和你们使用的数据库一致。
3.3 log4j.properties 配置文件
由于要使用日志框架查看输出的 SQL 语句。所以需要配置一个 log4j 配置文件。设置为 DEBUG 输出级别:
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
3.4 用户实体类对象(user)
package cn.ssm.mybatis.po;
import java.sql.Date;
/**
* @author 雷聪
*/
public class User {
private Integer id; // int(11) NOT NULL AUTO_INCREMENT,
private String username; // varchar(32) NOT NULL COMMENT '用户名称',
private Date birthday; // date DEFAULT NULL COMMENT '生日',
private String sex; // char(1) DEFAULT NULL COMMENT '性别',
private String address; // varchar(256) DEFAULT NULL COMMENT '地址',
// 这里省略 getter、setter 方法和 toString 方法。
}
3.5 原生的 SQL 语句 以及数据库数据
这里是一个简单的根据用户 ID 查询数据。所以 SQL 语句如下:
select * from `user` where id=10
数据库数据如下: 也可以自行准备:
-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` date DEFAULT NULL COMMENT '生日',
`sex` char(1) DEFAULT NULL COMMENT '性别',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '王五', null, '2', null);
INSERT INTO `user` VALUES ('10', '张三', '2014-07-10', '1', '北京市');
INSERT INTO `user` VALUES ('16', '张小明', null, '1', '河南郑州');
INSERT INTO `user` VALUES ('22', '陈小明', null, '1', '河南郑州');
INSERT INTO `user` VALUES ('24', '张三丰', null, '1', '河南郑州');
INSERT INTO `user` VALUES ('25', '陈小明', null, '1', '河南郑州');
INSERT INTO `user` VALUES ('26', '王五', null, null, null);
3.6 准备 mapper 映射文件
说明:它就是用户配置java对象,与sql语句的对应关系的,这就是 mybatis 中 sql 语句与 java 对象之间关系的映射的配置文件了。我们在 resource 目录下新建一个 sqlmap 文件夹用于存放,写好映射文件后,我们需要在主配置文件中加载这个 mapper 映射文件。
User.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">
<!--namespace:名称空间,相当于java中的package,用于防止sql语句名称冲突(sql语句的隔离) -->
<mapper namespace="test">
<!--mybatis针对每一种sql语句:新增/修改/删除/查询,
提供了对应的标签:insert/update/delete/select来放置
-->
<!-- 根据用户Id查询用户,说明:
select标签:用于放置查询sql语句
id:唯一标识名称
parameterType:输入参数的类型
resultType:输出结果的类型(暂时注意:需要的是全限定名称)
#{id}:占位符,相当于jdbc中的?
-->
<select id="queryUserById" parameterType="int" resultType="cn.ssm.mybatis.po.User">
select * from `user` where id=#{id}
</select>
</mapper>
在之前的 主配置文件中加载 User.xml: 将下面的代码放到 </environments>
标签后面。
<!-- 加载mapper映射文件 -->
<mappers>
<!-- 加载User.xml文件,说明:
1.resource:指定配置文件的位置
-->
<mapper resource="sqlmap/User.xml"/>
</mappers>
这样我们的配置就基本上配置好了,两个文件都是有约束文件的,可以使用 IDE 关联约束文件检查是否有错误。约束文件的位置在:mybatis jar 包有,按照下面的路径可以找到。
/org/apache/ibatis/builder/xml/mybatis-3-config.dtd 主配置文件约束
/org/apache/ibatis/builder/xml/mybatis-3-mapper.dtd mapper映射 文件约束
3.7 编写 junit测试代码
配置好之后,接下来就是写 junit 测试代码:
package cn.ssm.mybatis.test;
import java.io.InputStream;
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.Test;
/**
*
* @author 雷聪
*
*/
public class MybatisTest {
/**
* 根据用户 id 查询用户。
* @throws Exception
*/
@Test
public void queryUserByIdTest() throws Exception {
// 1.加载主配置文件sqlMapConfig.xml
/**
* getResourceAsStream:从类的根路径下加载主配置文件
*/
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
// 2.读取配置文件内容
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
/**
* sqlSessionFactory对象:
* 1.它是mybatis框架的核心对象,它是线程安全的,一个项目中只需要一个即可
*/
SqlSessionFactory sqlSessionFactory = builder.build(inputStream);
// 3.使用sqlSessionFactory对象,创建SqlSession对象
/**
* sqlSession对象:
* 1.它相当于jdbc中的Connection对象,它提供了操作数据库的CRUD方法
* 2.它是线程不安全的,每一个执行的方法都需要创建一个sqlSession
*/
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4.使用sqlSession对象,调用方法执行
/**
* selectOne:查询单条记录
* 参数:
* statement:执行的sql语句(名称空间+"."+sql语句Id)
* parameter:传入的参数值
*/
Object user = sqlSession.selectOne("test.queryUserById", 10);
System.out.println(user);
// 5.释放资源
sqlSession.close();
}
}
测试代码基本上对 API 都进行了说明。如果有什么疑问或者出现什么 BUG 可以联系我~
3.8 junit 运行结果
直接 右键 Run As 跑 JUnit Test ,如果配置了 log4j.properties 运行结果中会出现如下片段:
DEBUG [main] - ==> Preparing: select * from `user` where id=?
DEBUG [main] - ==> Parameters: 10(Integer)
DEBUG [main] - <== Total: 1
User [id=10, username=张三, birthday=2014-07-10, sex=1, address=北京市]
运行结果中显示了,mybatis 执行 SQL 语句时的语句,传入的参数,输出的 User 结果 是因为我在数据库里面找到了这条数据。
最后
对比与 JDBC 的开发方式,mybatis 简化了很多,而且也解决了很多 使用JDBC开发 的问题,并且简单易学也是其流行的一个重要原因之一。
转载请注明: 雷聪的博客 » mybatis从入门到实践(1)