您的位置:首页 > 数据库 > Oracle

MyBatis系列:(9)mybatis-spring-springmvc-oracle/mysql整合

2016-09-28 11:58 686 查看
大体思路:首先是配置好mybatis的环境,其次就是mybatis与spring的整合,其整合的目标是①mybatis的SqlSessionFactory交由Spring来创建②mybatis的事务交由Spring来处理;最后就是springmvc的融入,使得mybatis(dao层)、spring(中间层)、springmvc(web层)融为一体。

1、MyBatis环境配置
步骤:jar包->SQL语句->entity->dao
1.1、引入jar包
mybatismybatis-3.2.7.jar
mybatis的支持包asm-3.3.1.jar
commons-logging-1.1.1.jar
log4j-1.2.17.jar
oracleojdbc5.jar
1.2、SQL语句
OracleSQL
create table emps(
eid number(1) primary key,
ename varchar2(20),
esal number(6,2),
egender varchar2(3)
);


1.3、entity
Emp.java
package com.rk.entity;

public class Emp {
private Integer id;
private String name;
private Double sal;
private String gender;
public Emp(){}

public Emp(Integer id, String name, Double sal, String gender) {
this.id = id;
this.name = name;
this.sal = sal;
this.gender = gender;
}

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 Double getSal() {
return sal;
}
public void setSal(Double sal) {
this.sal = sal;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}

}


1.4、dao
EmpDao.java
package com.rk.dao;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.rk.entity.Emp;

public class EmpDao {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
Reader reader = Resources.getResourceAsReader("mybatis.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public void add(Emp emp)throws Exception{
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.insert("empNamespace.add", emp);
sqlSession.commit();
sqlSession.close();
}
}


1.5、mybatis的映射文件(EmpMapper.xml)和主配置文件(mybatis.xml)
EmpMapper.xml
<?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="empNamespace">
<resultMap type="com.rk.entity.Emp" id="empResultMap">
<id property="id" column="eid"/>
<result property="name" column="ename"/>
<result property="sal" column="esal"/>
<result property="gender" column="egender"/>
</resultMap>
<insert id="add" parameterType="com.rk.entity.Emp">
insert into emps(eid,ename,esal,egender) values(#{id},#{name},#{sal},#{gender})
</insert>
</mapper>
mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="db.properties"/>
<environments default="oracle_development">
<environment id="oracle_development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${oracle.driver}"/>
<property name="url" value="${oracle.url}"/>
<property name="username" value="${oracle.username}"/>
<property name="password" value="${oracle.password}"/>
</dataSource>
</environment>
<environment id="mysql_developer">
<transactionManager type="jdbc"/>
<dataSource type="pooled">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/rk/entity/EmpMapper.xml"/>
</mappers>
</configuration>
db.properties
#key=value
oracle.driver=oracle.jdbc.driver.OracleDriver
oracle.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
oracle.username=scott
oracle.password=tiger

mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://127.0.0.1:3306/testdb
mysql.username=root
mysql.password=root


1.6、测试
package com.rk.test;

import org.junit.Test;

import com.rk.dao.EmpDao;
import com.rk.entity.Emp;

public class MybatisTest {

@Test
public void testAdd() throws Exception {
EmpDao dao = new EmpDao();
Emp emp = new Emp(1, "小明", 800D, "男");
dao.add(emp);
}

}


2、Mybatis与Spring整合
(1)MyBatis的SqlSessionFactory交由Spring来创建
(2)Mybatis的事务交由Spring来管理
(3)DAO、Service对象的生成和依赖注入由Spring来完成

2.1、引入需要的jar包
c3p0c3p0-0.9.1.2.jar
spring-corecommons-logging-1.2.jar (mybaits中引入了1.1.1版本,可以删除1.1.1版本)
spring-beans-3.2.5.RELEASE.jar
spring-context-3.2.5.RELEASE.jar
spring-core-3.2.5.RELEASE.jar
spring-expression-3.2.5.RELEASE.jar
spring-aop
aopalliance-.jar
aspectjrt.jar
aspectjweaver.jar
spring-aop-3.2.5.RELEASE.jar
spring-jdbcspring-jdbc-3.2.5.RELEASE.jar
spring-tx-3.2.5.RELEASE.jar
spring-ormspring-orm-3.2.5.RELEASE.jar
mybatis与spring整合的jarmybatis-spring-1.2.4.jar
下载地址:https://github.com/mybatis/spring/releases
(版本不同带来的问题:之前引入的是mybatis-spring-1.0.0.jar,后来测试的时候发现错误,错误信息:java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransactionFactory.newTransaction(Ljavax/sql/DataSource;Lorg/apache/ibatis/session/TransactionIsolationLevel;Z)Lorg/apache/ibatis/transaction/Transaction。换成1.2.4版本后,错误消失。)

2.2、修改mybatis.xml
注释或者删除mybatis.xml中关于数据库连接的信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--
<properties resource="db.properties"/>
<environments default="oracle_development">
<environment id="oracle_development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${oracle.driver}"/>
<property name="url" value="${oracle.url}"/>
<property name="username" value="${oracle.username}"/>
<property name="password" value="${oracle.password}"/>
</dataSource>
</environment>
<environment id="mysql_developer">
<transactionManager type="jdbc"/>
<dataSource type="pooled">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
-->
<mappers>
<mapper resource="com/rk/entity/EmpMapper.xml"/>
</mappers>
</configuration>


2.3、添加Spring的主配置文件spring.xml

(1)MyBatis的SqlSessionFactory交由Spring来创建(2)Mybatis的事务交由Spring来管理(3)DAO、Service对象的生成和依赖注入由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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置C3P0连接池,目的:管理数据库连接 -->
<!--
<bean id="comboPooledDataSourceID" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"></property>
<property name="user" value="scott"></property>
<property name="password" value="tiger"></property>
</bean>
-->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="comboPooledDataSourceID" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${oracle.driver}"></property>
<property name="jdbcUrl" value="${oracle.url}"></property>
<property name="user" value="${oracle.username}"></property>
<property name="password" value="${oracle.password}"></property>
</bean>

<!-- 配置SqlSessionFactoryBean,目的:加载mybaits配置文件和映射文件,即替代原Mybatis工具类的作用 -->
<bean id="sqlSessionFactoryBeanID" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="comboPooledDataSourceID"></property>
<property name="configLocation" value="classpath:mybatis.xml"></property>
</bean>

<!-- 配置Mybatis的事务管理器,即DataSourceTransactionManager。
因为Mybatis底层用的是JDBC事务管事器,所以在这里依然配置JDBC事务管理器
-->
<bean id="dataSourceTransactionManagerID" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="comboPooledDataSourceID"></property>
</bean>

<!-- 配置事务通知,即让哪些方法需要事务支持 -->
<tx:advice id="tx" transaction-manager="dataSourceTransactionManagerID">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

<!-- 配置事务切面,即让哪些包下的类需要事务 -->
<aop:config>
<aop:pointcut  id="pointcut" expression="execution(* com.rk.service.*.*(..))"/>
<aop:advisor advice-ref="tx" pointcut-ref="pointcut"/>
</aop:config>

<!-- 注册EmpDao -->
<bean id="empDaoID" class="com.rk.dao.EmpDao">
<property name="sqlSessionFactory" ref="sqlSessionFactoryBeanID"></property>
</bean>

<!-- 注册EmpService -->
<bean id="empService" class="com.rk.service.EmpService">
<property name="empDao" ref="empDaoID"></property>
</bean>
</beans>


2.4、Dao
EmpDao.java

package com.rk.dao;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.rk.entity.Emp;

public class EmpDao {
private SqlSessionFactory sqlSessionFactory;
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}

public void add(Emp emp) throws Exception{
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.insert("empNamespace.add", emp);
sqlSession.close();
}
}


2.5、Serivce
EmpService.java
package com.rk.service;

import com.rk.dao.EmpDao;
import com.rk.entity.Emp;

public class EmpService {
private EmpDao empDao;
public void setEmpDao(EmpDao empDao) {
this.empDao = empDao;
}

public void register(Emp emp) throws Exception{
//        int i = 1/0;
//        System.out.println(i);
empDao.add(emp);
}
}


2.6、测试
package com.rk.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.rk.entity.Emp;
import com.rk.service.EmpService;

public class TestMybatis_Spring {

@Test
public void testRegister() throws Exception {
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
EmpService empService = (EmpService) ac.getBean("empService");

Emp emp = new Emp(3, "小刚", 400D, "男");
empService.register(emp);

}

}


3、SpringMVC的融入

3.1、引入JAR包

spring-webspring-web-3.2.5.RELEASE.jar
spring-webmvcspring-webmvc-3.2.5.RELEASE.jar
3.2、配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>springmvc-mybatis-oracle</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 核心springmvc核心控制器 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>

<!-- POST编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>


3.3、修改spring.xml

添加以下内容
<!-- 注册EmpAction -->
<context:component-scan base-package="com.rk.action"/>

<!-- 通知springioc容器这些注解的作用 -->
<context:annotation-config/>

<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
完整的spring.xml
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置C3P0连接池,目的:管理数据库连接 -->
<!--
<bean id="comboPooledDataSourceID" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"></property>
<property name="user" value="scott"></property>
<property name="password" value="tiger"></property>
</bean>
-->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="comboPooledDataSourceID" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${oracle.driver}"></property>
<property name="jdbcUrl" value="${oracle.url}"></property>
<property name="user" value="${oracle.username}"></property>
<property name="password" value="${oracle.password}"></property>
</bean>

<!-- 配置SqlSessionFactoryBean,目的:加载mybaits配置文件和映射文件,即替代原Mybatis工具类的作用 -->
<bean id="sqlSessionFactoryBeanID" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="comboPooledDataSourceID"></property>
<property name="configLocation" value="classpath:mybatis.xml"></property>
</bean>

<!-- 配置Mybatis的事务管理器,即DataSourceTransactionManager。
因为Mybatis底层用的是JDBC事务管事器,所以在这里依然配置JDBC事务管理器
-->
<bean id="dataSourceTransactionManagerID" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="comboPooledDataSourceID"></property>
</bean>

<!-- 配置事务通知,即让哪些方法需要事务支持 -->
<tx:advice id="tx" transaction-manager="dataSourceTransactionManagerID">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

<!-- 配置事务切面,即让哪些包下的类需要事务 -->
<aop:config>
<aop:pointcut  id="pointcut" expression="execution(* com.rk.service.*.*(..))"/>
<aop:advisor advice-ref="tx" pointcut-ref="pointcut"/>
</aop:config>

<!-- 注册EmpDao -->
<bean id="empDaoID" class="com.rk.dao.EmpDao">
<property name="sqlSessionFactory" ref="sqlSessionFactoryBeanID"></property>
</bean>

<!-- 注册EmpService -->
<bean id="empServiceID" class="com.rk.service.EmpService">
<property name="empDao" ref="empDaoID"></property>
</bean>

<!-- 注册EmpAction -->
<context:component-scan base-package="com.rk.action"/>

<!-- 通知springioc容器这些注解的作用 -->
<context:annotation-config/>

<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>


3.4、添加action
package com.rk.action;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.rk.entity.Emp;
import com.rk.service.EmpService;

@Controller
@RequestMapping(value="/emp")
public class EmpAction {
private EmpService empService;
@Resource(name="empServiceID")
public void setEmpService(EmpService empService) {
this.empService = empService;
}
@RequestMapping(value="/registerEmp")
public String registerEmp(Emp emp) throws Exception{
empService.register(emp);
return "success";
}
}


3.5、添加index.jsp和success.jsp
index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta name="content-type" content="text/html; charset=UTF-8"/>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/emp/registerEmp.action" method="POST">
<table>
<tr>
<td>编号:</td>
<td>
<input type="text" name="id"/>
</td>
</tr>
<tr>
<td>姓名:</td>
<td>
<input type="text" name="name"/>
</td>
</tr>
<tr>
<td>薪水:</td>
<td>
<input type="text" name="sal"/>
</td>
</tr>
<tr>
<td>性别:</td>
<td>
<input type="radio" name="gender" value="男"/>男
<input type="radio" name="gender" value="女" checked="checked"/>女
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="注册"/>
</td>
</tr>
</table>
</form>
</body>
</html>
/jsp/success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta name="content-type" content="text/html; charset=UTF-8"/>
<title>success page</title>
</head>

<body>
success <br>
</body>
</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mybatis
相关文章推荐