Spring回顾之三 —— MyBatis的加盟

9 篇文章 0 订阅
4 篇文章 0 订阅
[size=medium] 本篇将介绍如何引入帮助处理数据的MyBatis框架,对于普通的数据处理而言,MyBatis属于轻量级的数据持久层框架,使用起来简单上手,具体优缺点放下不说,我们先上手。[/size]
[b][size=large]第一步:数据环境的准备和依赖的引入[/size][/b]
[size=medium] 首先我们要准备下数据环境,当然这里不准备强调MySQL数据库怎么使用,前提假定我们已经安装好了数据库,并且也会做简单的操作,并能理解基本的SQL语言。我们需要创建一个数据库,作为对应起名为demo,然后创建一张作为测试的表,起名为d_user,创建代码如下[/size]

DROP TABLE IF EXISTS d_user;
CREATE TABLE d_user (
u_id int(11) NOT NULL,
u_name varchar(255) DEFAULT NULL,
u_password varchar(255) DEFAULT NULL,
u_age int(11) DEFAULT NULL,
PRIMARY KEY (u_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

[size=medium] 然后我们在这张表里边手动填充一下数据,看起来大概就是这个样子[/size]
[img]http://dl2.iteye.com/upload/attachment/0123/8175/c34f3940-6582-34b1-aa44-e78208f66f28.jpg[/img]

[size=medium] 好了,数据环境OK之后,我们要引入相关的jar包资源。[/size]
[size=medium] 在之前的项目基础上,我们看看,集成MyBatis都需要添加什么,首先MyBatis是直接基于jdbc的,所以spring-jdbc这个包是少不了的,然后还有必须的dao模块啊、驱动啊等等,修改pom文件,这部分MyBatis所涉及到的依赖代码代码如下[/size]

<!-- ============== orm begin ============== -->
<dependency><!-- Spring对 JDBC数据访问进行封装的所有类 -->
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency><!-- 包含 Spring DAO、Spring Transaction 进行数据访问的所有类 -->
<groupId>org.springframework</groupId>
<artifactId>spring-dao</artifactId>
<version>2.0.8</version>
</dependency>
<dependency><!-- mysql驱动 -->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.5</version>
</dependency>
<dependency><!-- Druid的数据库连接池,性能良好不错 -->
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.28</version>
</dependency>
<dependency><!-- mybatis -->
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency><!-- Spring整合mybatis所需类包 -->
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- ============== orm end ============== -->

[size=medium] 注意我们使用了阿里的druid数据连接池,这个在很多方面都表现了不错的性能优势,还可以配置资源监控等,具体以后再聊,由于考虑到maven会将一些所依赖的jar包自动引入,可能引起疑问,于是也将整个项目所需的重要jar包都在pom文件里显式的写出,顺便也再次熟悉下每个jar包大概的功能,这部分依赖就像下边的样子[/size]

<!-- ============== spring core begin ============== -->
<dependency><!-- Spring框架基本的核心工具类 -->
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency><!-- 访问配置文件、创建和管理bean以及进行IoC/DI操作相关 -->
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency><!-- 基于AOP的Spring特性功能,如声明型事务管理 -->
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency><!-- Spring EL, 表达式语言功能 -->
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency><!-- 为Spring核心提供扩展 -->
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- ============== spring core end ============== -->
<!-- ============== web begin ============== -->
<dependency><!-- Web应用开发时,用到Spring框架时所需的核心类 -->
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency><!-- Spring MVC框架相关的所有类 -->
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- ============== web end ============== -->

[size=medium] 这些MyBatis框架所依赖的jar包处理完之后,我们下一步来看如何整合起来。[/size]

[b][size=large]第二步:整合装配[/size][/b]
[size=medium] 使用MyBatis来帮助数据处理,必然少不了对事务的管理,我们先来配置一下web.xml,让项目以在启动容器时,可以加载Spring容器,这段代码如下[/size]

<!-- Spring 配置文件 定义 -->
<!-- 给ContextLoaderListener指定要加载的xml,无此配置将默认去加载/WEB-INF/下去加载 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext.xml</param-value>
</context-param>
<!-- 配置ContextLoaderListener说明,该工程启动时将加载Spring容器,注意context-param配置的内容 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

[size=medium] 然后我们去resource文件夹下创建applicationContext.xml文件,同时考虑到想解耦数据管理,顺带也创建一个名为jdbc.properties的文件,来存放数据方面的配置信息,jdbc.properties内容如下[/size]

#MySQL驱动
jdbc.driver=com.mysql.jdbc.Driver
#数据连接URL
jdbc.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&serverTimezone=UTC&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456
#初始连接数
jdbc.initialSize=0
#定义最大连接数
jdbc.maxActive=20
#最大空闲
jdbc.maxIdle=20
#最小空闲
jdbc.minIdle=1
#最长等待时间
jdbc.maxWait=60000

[size=medium] 这里具体的用户名密码、链接地址要看自己的来配,但要注意一点,在使用连接mysql的jdbc驱动最新版时,会遇到数据库和系统时区差异引起的问题,这时候有两种解决方案,一种是降版本,这个我们知道就行了,适可而行,还有一种是在jdbc连接的url后面加上serverTimezone=UTC或GMT即可,如果需要使用gmt+8时区,需要写成GMT%2B8,否则可能会被解析为空。[/size]
[size=medium] 接下来看最重要的这块,就是applicationContext.xml文件,先看已经写好的代码[/size]

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd ">

<!-- 加载配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
</bean>
<!-- ========================= ORM BEGIN ========================= -->
<!-- 数据源配置 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="${jdbc.initialSize}"></property>
<!-- 连接池最大数量 -->
<property name="maxActive" value="${jdbc.maxActive}"></property>
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="${jdbc.maxIdle}"></property>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${jdbc.minIdle}"></property>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${jdbc.maxWait}"></property>
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件,mapperLocations的设置将会自动扫描MyBatis的xml文件-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:test/demo/mapper/*Mapper.xml"/>
</bean>
<!-- DAO接口所在包名,Spring会自动寻找其路径下的接口 -->
<bean id="demoDaoFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="test.demo.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- 数据事务管理 ( Spring允许允许 MyBatis参与到事务管理中,所以MyBatis没有特定的事务管理器,直接利用了Spring中的 DataSourceTransactionManager) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- ========================= ORM END ========================= -->

</beans>

[size=medium] 来看内容,开头这段,说的是将数据相关的配置信息加载进来,接下来的先配置一个数据源,注意我们用的是com.alibaba.druid.pool.DruidDataSource,将使用德鲁伊的数据连接方式;接下来我们配置连接池sqlSessionFactory,同时指定数据源,这里边mapperLocations参数的设置,将使系统自动扫描与接口相匹配的mapper文件;然后配置demoDaoFactory,这个使用mybatis-spring提供了MapperScannerConfigurer类,避免一个个的去定义MapperFactoryBean,会自动去扫描指定路径下的所有接口,然后创建各自接口的动态代理类;最后还要说一下transactionManager的配置,由于Spring允许 MyBatis参与到事务管理中,所以MyBatis没有自己特定的事务管理器,直接利用了Spring中的 DataSourceTransactionManager。[/size]
[size=medium] 配置文件写好了,我们要写点代码配合测试下,看看效果怎么样。[/size]

[b][size=large]第三步:测试代码[/size][/b]
[size=medium] 首先,写一个用作数据传递的javaBean,User类,如下[/size]

package test.demo.data;

public class User {
private Integer id;
private String name;
private String password;
private Integer age;

public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}

[size=medium] 然后写接口,我们试着从数据库读一条数据吧,写接口,定义接口方法getUserById,给添加个条件,userId,代码如下[/size]

package test.demo.dao;

import test.demo.data.User;

public interface UserDAO {
public User getUserById(Integer userId);
}

[size=medium] 然后再回想下MyBatis的使用,我们还需要定义一个UserMapper.xml的文件,来添加对数据库操作的SQL内容,代码如下[/size]

<?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="test.demo.dao.UserDAO">
<select id="getUserById" parameterType="java.lang.Integer" resultType="test.demo.data.User">
<![CDATA[
select u.u_id id, u.u_name name, u.u_password password, u.u_age age from d_user u WHERE u.u_id = #{userId}
]]>
</select>
</mapper>

[size=medium] 这里要注意路径和命名规则,必须跟applicationContext.xml这个配置文件里的指定路径对应起来,否则会因为找不到相关文件服务器启动的时候报错。[/size]
[size=medium] 本来想写个单元测试直接试试,但这样的话只能展示出MyBatis对数据的处理是否成功,并不能跟上一篇的SpringMVC联系起来,于是直接修改下原来代码,在Controller添加了一个方法,修改后的代码如下[/size]

package test.demo.controller;

import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import test.demo.dao.UserDAO;
import test.demo.data.User;

@Controller
public class TestSpringController {

@Resource
private UserDAO userDao;

@RequestMapping(value="/mvcIndex", method=RequestMethod.GET)
public ModelAndView mvcIndex() {
return new ModelAndView("mvcIndex");
}

@ResponseBody
@RequestMapping(value="/getHello", method=RequestMethod.GET)
public String getHello() {
return "Hello Controller!";
}

@ResponseBody
@RequestMapping(value="/getUser/{userId}", method=RequestMethod.GET)
public String getUser(@PathVariable Integer userId) {
User user = userDao.getUserById(userId);
return user.getName() + " , Hello Controller!";
}
}

[size=medium] 这里要注意@Resource的使用,这时候代码部分差不多已经完事儿了,整个项目结构基本是下图的样子,接下来我们可以尝试着打包部署,然后测试。[/size]
[img]http://dl2.iteye.com/upload/attachment/0123/8177/cd0094c4-25f3-38c6-93f7-a9823c3b6389.jpg[/img]

[size=medium] 构建的时,我这里遇到一个问题,就是UserMapper.xml文件并不能够听话的被写进war文件,这个很恼火,原因是maven在构建打包的时候,全然不考虑文件路径中.xml结尾的文件,我们得去pom文件的build元素下,添加这样一段代码,如下[/size]

<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>

[size=medium] 这段代码的意思很显然是解决这个问题的,接着再构建,一切就OK了,然后我们愉快的打包部署,可以测试了。[/size]

[b][size=large]第四步:运行结果[/size][/b]
[size=medium] 服务器启动之后,我们在浏览器输入:http://localhost:8080/demo/getUser/1,回车[/size]
[img]http://dl2.iteye.com/upload/attachment/0123/8179/0fa20d3d-3c7c-3249-9474-afd528d5f5a0.jpg[/img]

[size=medium] 然后把1改成2:http://localhost:8080/demo/getUser/2,回车[/size]
[img]http://dl2.iteye.com/upload/attachment/0123/8181/9b0b9a30-326c-364d-aa47-7e5323104234.jpg[/img]

[size=medium] 看到这些内容,好了,我们已经成功的将MyBatis引入系统。[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值