欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring集成MyBatis框架

程序员文章站 2024-03-08 09:49:16
java在写数据库查询时,我接触过四种方式: 1、纯java代码,引用对应的数据库驱动包,自己写连接与释放逻辑(可以用连接池) 这种模式实际上性能是非常不错的,但是使用...

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的大体框架,可以作为上述配置的一个补述:

Spring集成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还是挺不错的,建议大家在业务合适的情况下试用试用。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!