您的位置:首页 > 编程语言 > Java开发

SpringMVC+MyBatis整合(注解方式)

2014-04-30 17:46 543 查看
1.新建一个web项目

其中src/main/java用于存放java代码,src/main/resource用于存放配置文件。

2.导入工程所需jar包,如图


3.新建如图所示包结构及文件(可根据自己项目,自行创建,本文只是一个例子)

            


4.init.properties中内容为:

datasource.type=mysql
datasource.driverClassName=com.mysql.jdbc.Driver

datasource.url=jdbc\:mysql\://127.0.0.1\:3306/twitter?useUnicode\=true&characterEncoding\=UTF-8
datasource.username=root
datasource.password=root

datasource.maxActive=10
datasource.maxIdle=2
datasource.maxWait=120
datasource.whenExhaustedAction=1
datasource.validationQuery=select 1 from dual
datasource.testOnBorrow=true
datasource.testOnReturn=false

c3p0.acquireIncrement=3
c3p0.initialPoolSize=3
c3p0.idleConnectionTestPeriod=900
c3p0.minPoolSize=2
c3p0.maxPoolSize=50
c3p0.maxStatements=100
c3p0.numHelperThreads=10
c3p0.maxIdleTime=600
 log4j.properties中内容为:

log4j.rootLogger=INFO, stdout

log4j.logger.com.ibatis = DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner = DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = DEBUG
log4j.logger.java.sql.Connection = DEBUG
log4j.logger.java.sql.Statement = DEBUG
log4j.logger.java.sql.PreparedStatement = DEBUG
log4j.logger.java.sql.ResultSet = INFO

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
5.配置数据库连接及事务管理器(dbconfig.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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 
<!-- 引入init.properties中属性 -->
<bean id="placeholderConfig"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:init.properties</value>
</property>
</bean>
<!-- 配置数据源,连接池使用c3p0 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close" >
<property name="driverClass">
<value>${datasource.driverClassName}</value>
</property>
<property name="jdbcUrl">
<value>${datasource.url}</value>
</property>
<property name="user">
<value>${datasource.username}</value>
</property>
<property name="password">
<value>${datasource.password}</value>
</property>
<!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement">
<value>${c3p0.acquireIncrement}</value>
</property>
<!-- 初始化时获取连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize">
<value>${c3p0.initialPoolSize}</value>
</property>
<!-- 连接池中保留的最小连接数 -->
<property name="minPoolSize">
<value>${c3p0.minPoolSize}</value>
</property>
<!-- -连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize">
<value>${c3p0.maxPoolSize}</value>
</property>
<!-- 连接最大空闲时间,单位为秒。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime">
<value>${c3p0.maxIdleTime}</value>
</property>
<!-- 检查所有连接池中的空闲连接的时间间隔,单位是秒。Default: 0 -->
<property name="idleConnectionTestPeriod">
<value>${c3p0.idleConnectionTestPeriod}</value>
</property>
<!-- JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。 -->
<property name="maxStatements">
<value>${c3p0.maxStatements}</value>
</property>
<!-- -c3p0支持的线程数,c3p0是异步操作的,通过多线程实现多个操作同时被执行。Default: 3- -->
<property name="numHelperThreads">
<value>${c3p0.numHelperThreads}</value>
</property>
</bean>

<!-- 配置mybatis固定的写法 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation">
<value>classpath:config/mybatis-sqlmap.xml</value>
</property>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
</bean>

<!-- 配置事务管理器bean -->
<!-- TransactionManager -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>

<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
</bean>

<!-- 事务控制代理抽象定义 -->
<bean id="transactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<!-- 为事务代理bean注入一个事物管理器 -->
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<!-- 定义事务传播属性 -->
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="release*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>

</beans>
6.springmvc核心配置,在WEB-INF目录下建立如图所示结构:

  


其中twitter-servlet.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
default-autowire="byName" default-lazy-init="false">

<!-- 默认注解映射的支持 -->
<mvc:annotation-driven/>

<!-- 自动扫描的包 -->
<context:component-scan base-package="com.lee.twitter.*"></context:component-scan>

<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
<property name="order" value="0" ></property>
&
d44a
lt;property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
</bean>

<!-- 全局异常处理配置 -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">errors/error</prop>
<prop key="java.lang.Throwable">errors/err</prop>
</props>
</property>
<property name="statusCodes">
<props>
<prop key="errors/error">500</prop>
<prop key="errors/404">404</prop>
</props>
</property>
<!-- 设置日志输出级别,不定义则默认不输出警告等错误日志信息 -->
<property name="warnLogCategory" value="INFO"></property>
<!-- 默认错误页面,当找不到上面mappings中指定的异常对应视图时,使用本默认配置 -->
<property name="defaultErrorView" value="errors/error"></property>
<!-- 默认HTTP状态码 -->
<property name="defaultStatusCode" value="500"></property>
</bean>
<!-- 全局异常配置 end -->
</beans>
web.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
<!-- 加载配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/*.xml</param-value>
</context-param>

<!-- 加载日志配置文件 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath*:log4j.properties</param-value>
</context-param>

<!-- 启动监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- 对客户端请求的静态资源如图片、JS文件等的请求交由默认的servlet进行处理 ,必须写在DispatcherServlet前面,否则会被spring拦截 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>

<!-- 配置Spring核心控制器 -->
<servlet>
<servlet-name>twitter</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvcxml/twitter-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>twitter</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<!-- 统一工程编码过滤器 -->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
7.sqlmap的配置,如图

 


User.java代码如下:

package com.lee.twitter.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable{

private static final long serialVersionUID = 8128692597339854520L;

private Integer userId;
private String userName;
private String password;
private String phone;
private String email;
private byte gender;
private Date registerDate;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public byte getGender() {
return gender;
}
public void setGender(byte gender) {
this.gender = gender;
}
public Date getRegisterDate() {
return registerDate;
}
public void setRegisterDate(Date registerDate) {
this.registerDate = registerDate;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName
+ ", password=" + password + ", phone=" + phone + ", email="
+ email + ", gender=" + gender + ", registerDate="
+ registerDate + "]";
}

}
User.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="User">
<resultMap type="com.lee.twitter.domain.User" id="userResultMap">
<result property="userId" column="userId"/>
<result property="userName" column="userName"/>
<result property="password" column="password"/>
<result property="phone" column="phone"/>
<result property="email" column="email"/>
<result property="gender" column="gender"/>
<result property="registerDate" column="registerDate"/>
</resultMap>

<insert id="addUser" parameterType="com.lee.twitter.domain.User">
INSERT INTO tb_user(`userName`,`password`,`phone`,`email`,`gender`,`registerDate`)
VALUES(#{userName},#{password},#{phone},#{email},#{gender},#{registerDate})
</insert>

<select id="findUserById" resultMap="userResultMap" parameterType="java.lang.Integer">
SELECT userId,userName,PASSWORD,phone,email,gender,registerDate
FROM tb_user WHERE userId = #{userId}
</select>

</mapper>
mybatis-sqlmap.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>
<mappers>
<mapper resource="com/lee/twitter/domain/sqlmap/User.xml"/>
</mappers>
</configuration>
8.其他各层代码如下:



 (1)dao层代码:

         UserDao.java:

package com.lee.twitter.dao;

import com.lee.twitter.domain.User;

public interface UserDao {

public int addUser(User user);

public User findUserById(Integer userId);
}
       UserDaoImpl.java:

package com.lee.twitter.dao.impl;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.lee.twitter.dao.UserDao;
import com.lee.twitter.domain.User;

@Repository
public class UserDaoImpl implements UserDao{

@Autowired
private SqlSessionTemplate sqlSession;

public int addUser(User user) {
return sqlSession.insert("User.addUser", user);
}

public User findUserById(Integer userId) {
return (User)sqlSession.selectOne("User.findUserById", userId);
}

}
(2)service层代码:
       UserService.java:
package com.lee.twitter.service;

import com.lee.twitter.domain.User;

public interface UserService {

public int addUser(User user);

public User findUserById(Integer userId);
}
      UserServiceImpl.java:
package com.lee.twitter.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.lee.twitter.dao.UserDao;
import com.lee.twitter.domain.User;
import com.lee.twitter.service.UserService;

@Service
public class UserServiceImpl implements UserService{

@Autowired
private UserDao userDao;

public int addUser(User user) {
return userDao.addUser(user);
}

public User findUserById(Integer userId) {
return userDao.findUserById(userId);
}

}
(3)web层代码:
       UserController.java:
package com.lee.twitter.web.user;

import java.util.Date;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.lee.twitter.domain.User;
import com.lee.twitter.service.UserService;

@Controller
@RequestMapping("/user")
public class UserController {

private final Log logger = LogFactory.getLog(UserController.class);

@Autowired
private UserService userService;

@RequestMapping("/index")
public String index(){

return "user/index";
}

@RequestMapping("/getUserInfo")
public String getUserInfo(Integer userId,Map<String,Object> map){

logger.info("获取用户信息请求参数userId="+userId);
User user = userService.findUserById(userId);
map.put("userInfo", user);
return "user/show";
}

@RequestMapping("/addInfo")
public String addInfo(User user,Map<String,Object> map){
user.setRegisterDate(new Date());
logger.info("添加用户信息请求参数:"+user);
int result = userService.addUser(user);
map.put("addRes", result);
return "user/index";
}
}
(3)展示层代码:
     


index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>

<body>
${addRes }
<a href="${pageContext.request.contextPath }/user/getUserInfo?userId=1">获取用户信息</a>
</body>
</html>


show.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'show.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">

</head>

<body>
用户名:${userInfo.userName }
<form action="${pageContext.request.contextPath }/user/addInfo" method="POST">
用户名:<input type="text" name="userName"/><br/>
密码:<input type="text" name="password"/><br/>
电话:<input type="text" name="phone"/><br/>
email:<input type="text" name="email"/><br/>
<input type="submit" value="提交"/>    
<input type="reset" value="重置">
</form>
</body>
</html>
9.数据库设计如下(mysql):





/*
SQLyog Ultimate v9.63
MySQL - 5.0.22-community-nt : Database - twitter
*********************************************************************
*/

/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`twitter` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */;

USE `twitter`;

/*Table structure for table `tb_user` */

DROP TABLE IF EXISTS `tb_user`;

CREATE TABLE `tb_user` (
`userId` bigint(32) NOT NULL auto_increment,
`userName` varchar(16) collate utf8_bin default NULL,
`password` varchar(64) collate utf8_bin default NULL,
`phone` bigint(11) default NULL,
`email` varchar(32) collate utf8_bin default NULL,
`gender` smallint(6) default NULL,
`registerDate` datetime default NULL,
PRIMARY KEY  (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

/*Data for the table `tb_user` */

insert  into `tb_user`(`userId`,`userName`,`password`,`phone`,`email`,`gender`,`registerDate`) values (1,'admin','admin',15230633320,'zee@gamil.com',1,'2014-04-30 14:50:47'),(2,'å¼ ä¸','123456',15233225566,'hello@sina.ok',0,'2014-04-30 16:26:06'),(3,'网球啊','aaaaaa',18611227788,'wangqiu@qq.com',0,'2014-04-30 16:30:43');

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
10.项目部署在tomcat下,访问路径为http://127.0.0.1:8080/Twitter/user/index

点击后会看到如下页面:



点击 获取用户信息,结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息