Java Server 理解与实践 —— 集成Mybatis到Spring项目

引言

既然是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的架构解析,可以参阅这篇文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值