Spring Framework,MyBatis,PostgreSQL整合
简介
Spring Framework 是优秀的JAVA应用程序开发框架和IoC容器,支持依赖注入,事务管理,Web MVC模式开发,数据存取,JMS等,是全功能(full stack)的开发框架。
MyBatis 是ORM半自动映射框架,是支持普通SQL查询,存储过程和高级映射的优秀持久层框架,其架构十分灵活,允许用户定制OR影射规则,其精华在mapper。
PostgreSQL 是最好的开源关系数据库,虽然现在使用的并不是很广泛。
企业应用开发可以整合Spring MVC,Spring,Mybatis,PostgreSQL实现一个完整的体系架构。Spring MVC作为MVC开发框架,Spring作为IoC容器, MyBatis则为ORM持久层框架,底层使用PostgreSQL数据库。Spring MVC本来就是Spring Framework中的一个组件,所以二者是天然集成在一起的。
集成配置
依赖
因为Spring 3发布时,MyBatis 3尚未完成,所以MyBatis提供了与Spring集成的包MyBatis-Spring 。所以需要下载MyBatis和MyBatis两个依赖包。 因为要使用数据库,所以需要Spring Famework提供的数据库相关的包,又因为Spring的事务管理框架是基于AOP实现的,所以还需要Spring AOP相关的jar包。 使用PostgresQL需要官方提供的PostgreSQL JDBC驱动 。 使用C3P0连接池 ,需要C3P0的相关包。
整合需要添加的jar包汇总如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Spring: === spring-aop-3.2 .4 .RELEASE.jar spring-aspects-3.2 .4 .RELEASE.jar spring-jdbc-3.2 .4 .RELEASE.jar spring-tx-3.2 .4 .RELEASE.jar MyBatis: === asm-3.3 .1 .jar cglib-2.2 .2 .jar javassist-3.17 .1 -GA.jar mybatis-3.2 .3 .jar mybatis-spring-1.2 .1 .jar PostgreSQL: === postgresql-9.2 -1003. jdbc4.jar C3P0: === mchange-commons-java-0.2 .3 .4 .jar c3p0-0.9 .2 .1 .jar
以上jar包都放入WEB-INF/lib目录下
配置
Spring配置文件spring-servlet.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <bean id ="dataSource" class ="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method ="close" ><property name ="driverClass" value ="${jdbc.driverClassName}" /> <property name ="jdbcUrl" value ="${jdbc.url}" /> <property name ="user" value ="${jdbc.username}" /> <property name ="password" value ="${jdbc.password}" /> </bean > <context:property-placeholder location ="WEB-INF/jdbc.properties" /> <bean id ="sqlSessionFactory" class ="org.mybatis.spring.SqlSessionFactoryBean" > <property name ="dataSource" ref ="dataSource" /> <property name ="configLocation" value ="WEB-INF/mybatis.xml" /> </bean > <mybatis:scan base-package ="net.openwares.test.mapper" />
其中配置了C3P0 jdbc数据源dataSource,使用刚配置好的spring数据源dataSource配置MyBatis的SqlSessionFactoryBean,用来产生mapper需要的sqlsession,最后是自动扫描包下面的mapper,并生成相应接口的代理实现类。 不要忘了在spring-servlet.xml中添加mybatis 名字空间,如下:
1 2 3 4 5 <beans xmlns ="http://www.springframework.org/schema/beans" xmlns:mybatis ="http://mybatis.org/schema/mybatis-spring" xsi:schemaLocation =" http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd" >
WEB-INF/jdbc.properties文件
1 2 3 4 jdbc.driverClassName=org.postgresql.Driver jdbc.url=jdbc:postgresql: jdbc.username=postgres jdbc.password=postgres
MyBatis的其他配置可以设置在WEB-INF/mybatis.xml文件中,但不用再设置environments元素,因为MyBatis-Spring会使用spring配置的数据库环境包括数据源和事务配置。
这样配置就算完成了,MyBatis-Spring会自动扫描类classpath下包net.openwares.test.mapper里面的mapper配置xml和接口,生成mapper接口的代理实现类,并自动注入sqlSessionFactory为mapper提供可用的sqlSession。 如果有多个包需要扫描,只需用逗号或分号分隔包名即可。这是设置mapper bean最简单的方式。
而且,MyBatis-Spring自动扫描产生的mapper接口实现类是线程安全的,也完全不用再与sqlsession打交道,MyBatis-Spring会在背后默默的处理好这一切。
Rather than code data access objects (DAOs) manually using SqlSessionDaoSupport or SqlSessionTemplate, Mybatis-Spring can create a thread safe mapper that you can inject directly into other beans
简单示例代码
与前面的例子一样,这里只是把前端提交的加数augend和被加数addend存入postgresql数据库,PostgreSQL建库脚本testdb.sql如下:
1 2 3 4 5 6 7 8 CREATE DATABASE testdb;\\c testdb; CREATE TABLE Attender( augend int , addend int );
然后执行命令行建库,psql的简单使用参见 PostgreSQL初步
1 $ psql -U postgres -h localhost -f testdb.sql
MyBatis mapper
mapper分为两部分,一个是java接口,另一个是xml配置文件,这两个文件要放置在一个目录下,而且接口的全限定接口名一定要与xml配置文件中mapper元素的命名空间完全一致。MyBatis会扫描xml为mapper接口生成实现类,并注册到spring容器中,供应用程序使用。这个mapper接口实际上就是一个DAO接口。
先看mapper配置文件
1 2 3 4 5 6 7 8 9 10 11 12 <?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 ="net.openwares.test.mapper.AttenderMapper" > <select id ="selectAttender" parameterType ="int" resultType ="net.openwares.test.mapper.AttenderPO" > select * from attender where augend = #{augend} </select > <insert id ="insertAttender" parameterType ="net.openwares.test.mapper.AttenderPO" > insert into attender (augend, addend) values (#{augend},#{addend}) </insert > </mapper >
mapper接口代码:
1 2 3 4 5 6 7 8 9 package net.openwares.test.mapper;import java.util.List;public interface AttenderMapper { List<AttenderPO> getAttender (String augend) ; void insertAttender (AttenderPO attender) ; }
接口全限定类名和xml配置文件中mapper的命名空间都为net.openwares.test.mapper.AttenderMapper,有了这些信息,无需实现mapper接口, mybatis会自动提供接口的实现。
最后使用此接口将客户提交的数据持久化到数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @Controller public class Persistent { @Autowired private Outcome outcome; @Autowired(required=true) private AttenderMapper attenderMapper; @RequestMapping("/ajaxcalc") public @ResponseBody Outcome getResult (@RequestBody Attender attender) { AttenderPO attenderPO = new AttenderPO(); attenderPO.setAugend(attender.getAugend()); attenderPO.setAddend(attender.getAddend()); attenderMapper.insertAttender(attenderPO); outcome.setResult(attender.getAugend() + attender.getAddend()); return outcome; } }
使用@Autowired(required=true)自动注入依赖attenderMapper即可。
因为是简单的示例,这里没有使用事务管理,也没有仔细的分层,将代码直接写入了controller。
完整的示例代码下载 。