Spring集成MyBatis框架
Java在写数据库查询时,我接触过四种方式:
1、纯Java代码,引用对应的数据库驱动包,自己写连接与释放逻辑(可以用连接池)
这种模式实际上性能是非常不错的,但是使用起来并不是非常方便:一是要手工为Connection做获取与释放,大量的冗余代码也容易出错;另一个是,复杂的SQL用字符串写起来简直不可维护(换行、可视长度、参数都是问题)。
2、使用Spring JdbcTemplate
这个其实还是挺不错的,配置比较简单,功能丰富上比手工管理Connection要舒服多了,而且代码也比较简洁。突出的问题就是SQL维护还是挺麻烦的。
3、使用Hibernate框架
一句话,配置很麻烦,用起来还是挺不错的。但是有一个致命缺陷,它并不能像单表查询一样可以帮我们完成多表的查询。如果有复杂的多表查询或查询条件,还是得用SQL去查,这对于一些业务逻辑复杂或者会经常变更的业务来说,后期维护就是灾难,改到想哭(因为真的是很混乱,一定要开始就规划好)。
4、使用MyBatis框架
这个是当前我所做项目最喜欢用的数据库持久化框架了,它通过XML配置可以非常简单直观地帮你完成各种条件、判断、多表的综合查询,实现方式比Java代码拼SQL要舒服太多了,在这方面更是甩Hibernate一条街。要说易用性,其实也挺容易用的,但是配置上也要对一些数据做映射,不过相对而言更加灵活。它的实体类并不一定要是数据库物理表,而可以是任意查询出来的数据集(类似数据传输对象DTO)。
简单总结一下:
配置容易程度:1 > 2 > 4 > 3
使用便捷程度:2 > 3 > 4 > 1
查询灵活程度:4 > 1 = 2 > 3
下面将开始介绍Spring集成MyBatis的配置和使用,项目基于Maven构建,连接Mysql数据库:
一、Maven配置
<!-- Spring Base -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
关于Spring的包引用,我这里的引用只作为参考,其它web、mvc的包视各业务来引用。如果不用Maven,就自己乖乖引jar包,或者使用其它包管理吧。
二、Spring配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxxdb" />
<property name="user" value="lekko" />
<property name="password" value="xxx" />
<property name="minPoolSize" value="2" />
<property name="maxPoolSize" value="100" />
</bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="mapperLocations" value="classpath:mapper/**/*Mapper.xml" />
<property name="dataSource" ref="myDataSource" />
</bean> <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="lekko.code.**.dao" />
</bean> </beans>
这里的配置比较关键。
1、myDataSource是一个ComboPooledDataSource类型的实例bean,它实现了数据库连接池的功能。
2、sqlSessionFactory是MyBatis用于建立查询的工厂实例,它包括了一个mapperLocations定位,以及dataSource数据库连接来源。
- mapperLocations指定了MyBatis将会搜索的路径,支持Ant风格路径。在指定的路径下,MyBatis会把读取其中的xml查询,并将用于后面的dao映射。
- dataSource是来源数据库,这里直接就是前面的连接池。
3、mapperScannerConfigurer是MyBatis用于自动建立数据库dao类的配置器。
- basePackage指定了要扫描的包名称,支持Ant风格路径。在指定的包名称下,MyBatis通过Spring,会自动发现对应包名下的dao接口,在后面需要查询时,为接口提供实现。
下图是MyBatis的大体框架,可以作为上述配置的一个补述:

也就是说,MyBatis会根据XML配置Mapper去组成数据库查询,然后把查询中所涉及的参数、返回结果,都映射成为Java对象(或元数据类型)。最后交由数据库去执行,返回。 三、dao接口
package lekko.code.test.dao; import lekko.code.test.model.TestModel;
import org.springframework.stereotype.Repository; /**
* 测试DAO
*/
@Repository
public interface TestDao { TestModel getTest(String name); int addTest(String name); }
上面这个接口,由于属于包lekko.code.**.dao,所以会被识别为需要映射的dao。
接口只有两个方法,一个是查询getTest,一个是新增addTest。至于getTest已经根据需要,我这里提取成了一个实体类TestModel:
package lekko.code.test.model; /**
* 测试数据类
*/
public class TestModel { private int id;
private String name; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
} }
四、Mapper映射
<?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"> <mapper namespace="lekko.code.test.dao.TestDao"> <select id="getTest" resultType="lekko.code.test.model.TestModel">
select id, name from Test where name = #{name}
</select> <insert id="addTest">
insert into Test (name, createdTime) values (#{name}, now())
</insert> </mapper>
语法我就不详细解释了,百度一下就有。各种条件、判断、参数都有解释。我本人非常喜欢这种自由度高,sql看起来也很舒服的配置方式。
至此,大体的使用介绍已经完毕。MyBatis还是挺不错的,建议大家在业务合适的情况下试用试用。
转载请注明原址:http://www.cnblogs.com/lekko/p/6367732.html
Spring集成MyBatis框架的更多相关文章
- Spring+SpringMvc+Mybatis框架集成搭建教程
一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以在自己搭建SSM框架集成的时候,出现了这样或者那样的问题,很是苦恼 ...
- SSM框架开发web项目系列(五) Spring集成MyBatis
前言 在前面的MyBatis部分内容中,我们已经可以独立的基于MyBatis构建一个数据库访问层应用,但是在实际的项目开发中,我们的程序不会这么简单,层次也更加复杂,除了这里说到的持久层,还有业务逻辑 ...
- Spring MVC 学习总结(十)——Spring+Spring MVC+MyBatis框架集成(IntelliJ IDEA SSM集成)
与SSH(Struts/Spring/Hibernate/)一样,Spring+SpringMVC+MyBatis也有一个简称SSM,Spring实现业务对象管理,Spring MVC负责请求的转发和 ...
- SSM(Spring + Springmvc + Mybatis)框架面试题
JAVA SSM框架基础面试题https://blog.csdn.net/qq_39031310/article/details/83050192 SSM(Spring + Springmvc + M ...
- flink 流式处理中如何集成mybatis框架
flink 中自身虽然实现了大量的connectors,如下图所示,也实现了jdbc的connector,可以通过jdbc 去操作数据库,但是flink-jdbc包中对数据库的操作是以ROW来操作并且 ...
- MyBatis从入门到精通(第9章):Spring集成MyBatis(中)
MyBatis从入门到精通(第9章):Spring集成MyBatis(中) 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法.应该将应用自身的设计和具体 ...
- MyBatis从入门到精通(第9章):Spring集成MyBatis(上)
MyBatis从入门到精通(第9章):Spring集成MyBatis(上) Spring是一个为了解决企业级Web应用开发过程中面临的复杂性,而被创建的一个非常流行的轻量级框架. mybatis-sp ...
- Spring和MyBatis框架整合
Spring集成MyBatis 使用MyBatis,需要创建MyBatis框架中的某些对象,使用这些对象,就能使用mybatis提供的功能了. 需要有Dao接口的代理对象,例如StudentDao接口 ...
- 【SSM 8】spring集成Mybatis通用Mapper
上篇博客中介绍了关于Mybatis底层封装的思路问题,那么这篇博客,就介绍一下怎么引入通用的mapper插件. 备注:本项目通过maven管理 关键版本说明: spring:4.1.3.RELEASE ...
随机推荐
- 说说Core Animation
前言 本次分享将从以下方面进行展开: 曾被面试官问倒过的问题:层与视图的关系 CALayer类介绍及层与视图的关系 CAShapeLayer类介绍 UIBezierPath贝塞尔曲线讲解 CoreAn ...
- Ubuntu下安装PDF 文档阅读器Adobe Reader 9.5.5
由于没有PPA所以我们必须在Adobe的官方FTP上下载安装,下面的方法同时适用于32位和64位系统: wget ftp://ftp.adobe.com/pub/adobe/reader/unix/9 ...
- javascript 中 function bind()
Function bind() and currying <%-- All JavaScript functions have a method called bind that binds t ...
- Struts2 JSP中将list,set ,Map传递到Action然后遍历(三十五) - 雲淡風輕 - ITeye技术网站
1.使用Strut2的的集合对象:在jsp初始化action中的list然后提交到action2.使用Struts标签,实现多个用户同时注册(注意属性配置文件)3.pojo package com.s ...
- HDU 2859 Phalanx
简单二维dp.o(n^3)效率过的.不知道有没有o(n^2)的解法. 为了方便点,先左右交换一下. dp[i][j]表示以[i,j]为左上角的最大对称矩阵长度 那么dp[i][j]=min(Max,d ...
- [iOS Animation]-CALayer 专用图层
专用图层 复杂的组织都是专门化的 Catharine R. Stimpson 到目前为止,我们已经探讨过CALayer类了,同时我们也了解到了一些非常有用的绘图和动画功能.但是Core Animati ...
- $.extend 用法
此处参考了RascallySnake 的博客 $.extend(boolean, dest, src1, src2, src3) 第一个参数boolean代表是否进行深度拷贝,其余参数和前面介绍的一致 ...
- redis 学习
http://blog.csdn.net/z69183787/article/category/2923783
- UISlider小结
滑块(UISlider)是常用的界面组件,能够让用户可以用可视化方式设置指定范围内的值,比如音量设置,比如灵敏度控制等诸如此类的用途. - (void)viewDidLoad { [super vie ...
- JQuery的 jQuery.fn.extend() 和jQuery.extend();
原文链接:http://caibaojian.com/jquery-extend-and-jquery-fn-extend.html jQuery.fn.extend(); jQuery.extend ...