引言
既然是Java Server,当然离不开与数据库交互。而Java与数据库交互,又永远绕不开一个话题—— ORM。
对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换
简单点来说,就是我们要将数据库里面的一个个字段,转化成为Java里面的对象的一个个属性,当然我们可以通过jdbc直接,然后通过读取结果集,调用对象的setter方法来完成这个过程。但是,框架的存在,就是为了减少这些繁杂而重复的工作。Mybatis正是这样一个ORM框架。
在介绍Mybatis框架之前,再简单说一下为什么我会选择这个框架。
简单,Mybatis框架的代码库大小只有1.5M,对比于JPA动辄7-8M的代码库,要轻巧很多,轻巧意味着简单,意味着能更迅速更深刻地了解这个开源框架。
直接,直接通过配置sql的方式设定CURD语句,可以最充分地利用数据库的索引,提升查询性能。JPA虽然省去了手写SQL,但是却难以生成最佳索引的查询语句。
可扩展。支持编写插件。
那么,接下来就开始Mybatis的介绍吧。这系列的文章将会分成几部分,首先,我们从如何使用开始。我们将会基于之前文章中的Java Server项目继续。该项目也已经上传到github上。
关于Mybatis的使用例子,我们可以从官方文档中迅速地学习,上手,因此关于mapper等mybatis基础概念,在这里就不做过多的阐述了。下面主要是如何将Mybatis集成到Spring项目中。
Maven配置
要将Mybatis集成到Spring项目中,我们需要增加以下这几个依赖。
<!--spring jdbc 用于管理Spring的事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- mybatis 这里采用3.4.1的版本 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- mysql connector 与数据库建立连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- dbcp2 数据库连接池管理 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
<!-- mybatis 与Spring的集成工具 必须采用1.3.1的版本 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
上面的配置都是一些基本配置,包括连接数据库,连接池管理等等。但必须注意但是,mybatis-spring的版本与mybatis的版本必须使用笔者的版本或者更高,否则会因为两者之间版本不匹配而引发一些问题。
Bean配置
在依赖添加完成之后,我们就可以开始增加我们的Bean配置了。
<!--将配置文件写在配置文件中,读取配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/META-INF/jdbc.properties</value>
</list>
</property>
</bean>
<!--配置dataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 启用mybatis的扫描功能 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
在这里,因为我们暂时不使用spring的事务管理,因此将事务管理交给mybatis-spring中默认的SpringManagedTransaction
去管理。
启用扫描功能是为了尽量简化项目的配置,配置了MapperScannerConfigurer
之后,我们就可以直接通过注解来定义Mybatis的mapper而不需要再写额外的xml文件了。
类使用
首先是Mapper类。
public interface UserMapper {
@Select("Select account from user where id = #{id}")
String selectAccountById(@Param("id") int id);
}
这里面有两个需要注意的地方。
- 使用
#{param}
使用参数传入的形式。 - 使用
@Param
声明方法参数与sql变量中的绑定关系。
这里的sql是简单的select单个变量并且直接返回,我们也可以返回一个对象,只要在对象中有相应的属性就可以了。另外mybatis也支持在select语句中使用script,比如判断,比如循环。
然后是Service类。
@Service
public class UserService {
private UserMapper userMapper;
@Autowired
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
public String getUserAccountById(Integer id) {
return userMapper.selectAccountById(id);
}
}
启用了MapperScan之后,mapper会初始化成为bean,因此可以直接使用autowired
进行组装。
最后,在Controller中进行调用成为api暴露出去就可以通过postMan等工具调用了。
@RestController
@RequestMapping(value="/noAuth")
public class NoAuthController {
private UserService userSrv;
@Autowired
public NoAuthController(UserService userSrv) {
this.userSrv = userSrv;
}
@RequestMapping(value="/test/{id}")
public @ResponseBody String test(@PathVariable("id") Integer id) {
return userSrv.getUserAccountById(id);
}
}
以上,就是一个最简单的Mybatis与集成的最简单例子。
小结
Mybatis是一个简单的ORM框架,使用者自己定义sql,定义返回的Java对象,然后它进行数据库查询,将查询结果映射到Java对象中。它最大的特色就是简洁,简单的事物管理,简单的缓存管理,简单的对象映射以及语句解析。
这篇文章主要讲述了如何将Mybatis集成到Spring项目中,关于Mybatis的深入介绍,会在接下来的文章中完成。
关于Mybatis的架构解析,可以参阅这篇文章。