zoukankan      html  css  js  c++  java
  • 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配置

     1         <!-- Spring Base -->
     2         <dependency>
     3             <groupId>org.springframework</groupId>
     4             <artifactId>spring-beans</artifactId>
     5             <version>4.2.5.RELEASE</version>
     6         </dependency>
     7         <dependency>
     8             <groupId>org.springframework</groupId>
     9             <artifactId>spring-context</artifactId>
    10             <version>4.2.5.RELEASE</version>
    11         </dependency>
    12         <dependency>
    13             <groupId>org.springframework</groupId>
    14             <artifactId>spring-jdbc</artifactId>
    15             <version>4.2.5.RELEASE</version>
    16         </dependency>
    17         <!-- MySql -->
    18         <dependency>
    19             <groupId>mysql</groupId>
    20             <artifactId>mysql-connector-java</artifactId>
    21             <version>5.1.39</version>
    22         </dependency>
    23         <dependency>
    24             <groupId>com.mchange</groupId>
    25             <artifactId>c3p0</artifactId>
    26             <version>0.9.5.2</version>
    27         </dependency>
    28         <dependency>
    29             <groupId>org.mybatis</groupId>
    30             <artifactId>mybatis</artifactId>
    31             <version>3.4.1</version>
    32         </dependency>
    33         <dependency>
    34             <groupId>org.mybatis</groupId>
    35             <artifactId>mybatis-spring</artifactId>
    36             <version>1.3.0</version>
    37         </dependency>

        关于Spring的包引用,我这里的引用只作为参考,其它web、mvc的包视各业务来引用。如果不用Maven,就自己乖乖引jar包,或者使用其它包管理吧。

    二、Spring配置

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
     4 
     5     <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
     6         <property name="driverClass" value="com.mysql.jdbc.Driver" />
     7         <property name="jdbcUrl" value="jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxxdb" />
     8         <property name="user" value="lekko" />
     9         <property name="password" value="xxx" />
    10         <property name="minPoolSize" value="2" />
    11         <property name="maxPoolSize" value="100" />
    12     </bean>
    13 
    14     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    15         <property name="mapperLocations" value="classpath:mapper/**/*Mapper.xml" />
    16         <property name="dataSource" ref="myDataSource" />
    17     </bean>
    18  
    19     <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    20         <property name="basePackage" value="lekko.code.**.dao" />
    21     </bean>
    22 
    23 </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接口
     1 package lekko.code.test.dao;
     2 
     3 import lekko.code.test.model.TestModel;
     4 import org.springframework.stereotype.Repository;
     5 
     6 /**
     7  * 测试DAO
     8  */
     9 @Repository
    10 public interface TestDao {
    11 
    12     TestModel getTest(String name);
    13 
    14     int addTest(String name);
    15 
    16 }

        上面这个接口,由于属于包lekko.code.**.dao,所以会被识别为需要映射的dao。

        接口只有两个方法,一个是查询getTest,一个是新增addTest。至于getTest已经根据需要,我这里提取成了一个实体类TestModel:

     1 package lekko.code.test.model;
     2 
     3 /**
     4  * 测试数据类
     5  */
     6 public class TestModel {
     7 
     8     private int id;
     9     private String name;
    10 
    11     public String getName() {
    12         return name;
    13     }
    14     public void setName(String name) {
    15         this.name = name;
    16     }
    17 
    18     public int getId() {
    19         return id;
    20     }
    21     public void setId(int id) {
    22         this.id = id;
    23     }
    24 
    25 }

    四、Mapper映射

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     3 
     4 <mapper namespace="lekko.code.test.dao.TestDao">
     5 
     6     <select id="getTest" resultType="lekko.code.test.model.TestModel">
     7         select id, name from Test where name = #{name}
     8     </select>
     9 
    10     <insert id="addTest">
    11         insert into Test (name, createdTime) values (#{name}, now())
    12     </insert>
    13 
    14 </mapper>

        语法我就不详细解释了,百度一下就有。各种条件、判断、参数都有解释。我本人非常喜欢这种自由度高,sql看起来也很舒服的配置方式。

        

        至此,大体的使用介绍已经完毕。MyBatis还是挺不错的,建议大家在业务合适的情况下试用试用。

        转载请注明原址:http://www.cnblogs.com/lekko/p/6367732.html 

  • 相关阅读:
    LeetCode 120:三角形最小路径和
    守护进程
    G711时间戳增量和数据包大小的关系
    H264防止竞争机制
    硬编码帧率错误导致的浏览器不能播放的问题
    GCC inline
    单例模式的双检锁的隐患和优化
    Java中异常捕获子类异常捕获在父类异常前面,即小范围先被捕获
    线程运行流程图
    将二维数组转为稀疏数组
  • 原文地址:https://www.cnblogs.com/lekko/p/6367732.html
Copyright © 2011-2022 走看看