雷聪

个人站点

欢迎来到我的个人站点~
一面技术,一面生活!


mybatis从入门到实践(1)

本篇文章主要介绍了什么是 mybatis 以及一个简单的入门程序实践帮助入门和理解。

Mybatis 入门到实践系列前言

mybatis 是目前比较流行的 Java 持久层框架,我们所说的 SSM 的最后一个 M 代表的就是 mybatis 了。

本系列博客围绕着 mybatis 的学习展开,从入门到实际开发应用,都有涉及!

看了这篇文章你将:

  1. 了解什么是 mybatis
  2. 能够了解 mybatis 与 JDBC 对比的优势
  3. 能够搭建 mybatis 的入门环境
  4. 能够运行 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

1527735114581

选择MyBatis的理由

  1. mybatis 是一个持久层的框架,是对 JDBC 操作数据库的封装,使开发者只需要关注业务本身,不需要花费精力去处理加载驱动、创建数据库连接对象、创建 statement 语句对象、参数设置、结果集处理等一系列繁杂的过程代码。
  2. mybatis 通过 xml 或注解进行配置,将 java 对象与 sql 语句中的参数自动映射生成最终执行的 sql 语句,并将 sql 语句执行结果自动映射成 java 对象,返回给业务层(service)应用。

2. 从JDBC 到 mybatis

使用 JDBC 开发 的步骤

  1. 加载驱动

  2. 创建一个数据库连接对象

  3. 定义sql语句

  4. 创建Statement语句对象

  5. 设置参数

  6. 执行

  7. 处理结果集

  8. 释放资源(关闭Connection,关闭Statement,关闭ResultSet)

Q:实现JDBC有八个步骤,哪些步骤是可以进一步封装的,减少我们开发的代码量?


总结 JDBC 开发的问题

  1. 频繁创建数据库连接对象和释放,容易造成系统资源的浪费,从而影响系统的性能。在企业项目中,可以通过使用连接池技术解决这个问题。但是使用jdbc需要我们自己来实现连接池。mybatis内部提供连接池。

  2. sql语句的定义、参数设置、结果集处理存在硬编码。在企业项目中sql语句变化的可能性较大,一旦发生变化,需要修改java代码,系统需要重新编译,重新发布。不好维护。

  3. 结果集处理存在重复代码,处理麻烦。如果可以自动映射为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 说明文档,或者官方网站的介绍也是有的。

下载的压缩包:

1527772094049

官方的说明文档网址: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)

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦