[转]基于全注解的Spring3.1 mvc、myBatis3.1、Mysql的轻量级项目
摘要 对于现在主流的j2ee企业级开发而言,ssh(struts+hibernate+spring)依然是一个事实的标准。由struts充当的mvc调度控制;hibernate的orm持久化映射;spring的ioc和aop的容器环境近乎于完美的框架组合。但是,在实际的开发工作中,由于程序猿对于技术、以及更加快速的解决方案的追求,我们会越来越发现ssh框架所存在的诸多问题和困扰。
基于REST风格的Spring3 MVC资源映射编程模型,编写的Code真的很优雅。那是相当的惊喜,编程之美。
MyEclipse项目清单
清单1. web.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
<? xml version = "1.0" encoding = "UTF-8" ?>
< web-app version = "2.5" 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_2_5.xsd">
< display-name >mySpring3 and myBatis3 Project</ display-name >
<!-- 配置文件位置,默认为/WEB-INF/applicationContext.xml --> < context-param >
< param-name >contextConfigLocation</ param-name >
< param-value >classpath:applicationContext.xml</ param-value >
</ context-param >
<!-- 字符集过滤器 --> < 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 >
<!-- 上下文Spring监听器 --> < listener >
< listener-class >org.springframework.web.context.ContextLoaderListener</ listener-class >
</ listener >
<!-- servlet控制跳转 --> < servlet >
< servlet-name >spring3</ servlet-name >
< servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class >
<!-- 配置文件 --> < init-param >
< param-name >contextConfigLocation</ param-name >
< param-value >classpath:context-dispatcher.xml</ param-value >
</ init-param >
</ servlet >
< servlet-mapping >
< servlet-name >spring3</ servlet-name >
< url-pattern >/</ url-pattern >
</ servlet-mapping >
<!-- 激活静态资源的默认配置,解决Rest风格兼容 -->
< servlet-mapping >
< servlet-name >default</ servlet-name >
< url-pattern >*.css</ 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 >*.gif</ url-pattern >
</ servlet-mapping >
< servlet-mapping >
< servlet-name >default</ servlet-name >
< url-pattern >*.jpg</ url-pattern >
</ servlet-mapping >
< welcome-file-list >
< welcome-file >index.jsp</ welcome-file >
</ welcome-file-list >
</ web-app >
|
清单2. applicationContext.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
<? 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:tx = "http://www.springframework.org/schema/tx"
xmlns:aop = "http://www.springframework.org/schema/aop"
xmlns:context = "http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"
default-init-method = "init" >
<!-- 引入jdbc配置文件 -->
< context:property-placeholder location = "classpath:jdbc.properties" />
<!--创建jdbc数据源 -->
< bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method = "close" >
< property name = "driverClassName" value = "${driver}" />
< property name = "url" value = "${url}" />
< property name = "username" value = "${username}" />
< property name = "password" value = "${password}" />
</ bean >
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
< bean id = "transactionManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" >
< property name = "dataSource" ref = "dataSource" />
</ bean >
<!-- 创建SqlSessionFactory,同时指定数据源 -->
< bean id = "sqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean" >
< property name = "configLocation" value = "classpath:mybatis.cfg.xml" ></ property >
< property name = "dataSource" ref = "dataSource" />
</ bean >
<!-- 可通过注解控制事务 -->
< tx:annotation-driven transaction-manager = "transactionManager" />
<!-- 配置事务的传播特性 -->
<!--
<tx:advice >
<tx:attributes>
<tx:method name="create*" propagation="REQUIRED" />
<tx:method name="modify*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
-->
<!-- 配置事务的切入点 -->
<!--
<aop:config>
<aop:pointcut />
<aop:advisor advice-ref="txAdvice" pointcut-ref="targetMethod" />
</aop:config>
-->
<!-- Mapper接口所在包名,Spring会自动查找其下的Mapper -->
< bean class = "org.mybatis.spring.mapper.MapperScannerConfigurer" >
< property name = "basePackage" value = "com.matol.mapper" />
</ bean >
<!-- 负责注册JSR-250 的注释生效 @Resource MapperScannerConfigurer配置会自动启用mapper注解,可省略当前配置
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>
-->
</ beans >
|
清单3. context-dispatcher.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
<? xml version = "1.0" encoding = "UTF-8" ?>
< beans default-lazy-init = "true"
xmlns = "http://www.springframework.org/schema/beans"
xmlns:p = "http://www.springframework.org/schema/p"
xmlns:tx = "http://www.springframework.org/schema/tx"
xmlns:aop = "http://www.springframework.org/schema/aop" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:context = "http://www.springframework.org/schema/context"
xmlns:mvc = "http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-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/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 通过注解,把URL映射到Controller上,该标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
< mvc:annotation-driven />
<!-- annotation默认的方法映射适配器 mvc:annotation-driven注册后可以省略当前配置
<bean />
<bean />
-->
<!-- 探测注解的包,包括子集, 在JUnit测试的时候需要 --> <!-- 自动扫描bean,把作了注解的类转换为bean --> < context:component-scan base-package = "com.matol" />
<!-- 加载组装所以配置文件 context:component-scan注册后可以省略当前配置
<context:annotation-config/>
-->
<!-- 视图解析器 -->
< bean id = "viewResolver"
class = "org.springframework.web.servlet.view.InternalResourceViewResolver" >
<!-- 使用JSP页面进行输出 -->
< property name = "viewClass" value = "org.springframework.web.servlet.view.JstlView" />
<!-- 指定了表示层的前缀 --> <!-- 这个配置是配置JSP页面的位置,按照你自己的配置来配 -->
< property name = "prefix" value = "/" />
<!-- 指定了表示层的后缀 -->
< property name = "suffix" value = ".jsp" ></ property >
</ bean >
<!-- 处理文件上传处理 -->
< bean id = "multipartResolver"
class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding = "UTF-8" />
</ beans >
|
清单4. jdbc.properties
1
2
3
4
|
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/matolDB username=root password=root |
清单5. mybatis.cfg.xml
1
2
3
4
5
6
7
8
9
10
11
12
|
<? 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 >
< typeAliases >
< typeAlias alias = "Student" type = "com.matol.entity.User" />
</ typeAliases >
< mappers >
< mapper resource = "com/matol/mapper/UserMapper.xml" />
</ mappers >
</ configuration >
|
清单6. matolDB.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/* Navicat MySQL Data Transfer Source Server : localhost Source Server Version : 50141 Source Host : localhost:3306 Source Database : matoldb Target Server Type : MYSQL Target Server Version : 50141 File Encoding : 65001 Date: 2013-01-23 16:47:52 */ SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `sys_user` -- ---------------------------- DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` (
`id` int (11) unsigned zerofill NOT NULL AUTO_INCREMENT,
` name ` varchar (100) COLLATE utf8_unicode_ci DEFAULT NULL ,
`pass` varchar (100) COLLATE utf8_unicode_ci DEFAULT NULL ,
`age` int (11) DEFAULT NULL ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE =utf8_unicode_ci;
|
清单7. User.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
package com.matol.entity;
import java.io.Serializable;
import org.springframework.stereotype.Repository;
/**
*
* @author matol
* @date 2013-01-23 16:38
*/ @Repository (value = "user" ) public class User implements Serializable {
private Integer id;
private String name;
private String pass;
private Integer age;
public User(){}
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 getPass() {
return pass;
}
public void setPass(String pass) {
this .pass = pass;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this .age = age;
}
} |
清单7. UserMapper.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package com.matol.mapper;
import java.util.List;
import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional;
import com.matol.entity.User;
/**
*
* @author matol
* @date 2013-01-23 16:38
*/ @Repository (value = "userMapper" ) @Transactional public interface UserMapper {
Integer create(User user);
Integer delete(Integer id);
Integer modify(User user);
User findById(Integer id);
User findByUser(User user);
List<User> findAll();
List<User> findAll(User user);
Integer count();
} |
清单8. UserMapper .xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
<? 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 = "com.matol.mapper.UserMapper" >
<!-- 定义数据库字段与实体对象的映射关系 -->
< resultMap type = "com.matol.entity.User" id = "resultUser" >
< id property = "id" column = "id" />
< result property = "name" column = "name" />
< result property = "pass" column = "pass" />
< result property = "age" column = "age" />
</ resultMap >
<!-- 定义参数模型 -->
< parameterMap type = "com.matol.entity.User" id = "paramUser" >
< parameter property = "id" />
< parameter property = "name" />
< parameter property = "pass" />
< parameter property = "age" />
</ parameterMap >
<!-- 定义要操纵的SQL语句 --> < insert id = "create" parameterType = "com.matol.entity.User" >
INSERT INTO sys_user(name,pass,age)
VALUES(#{name},#{pass},#{age})
</ insert >
< delete id = "delete" parameterType = "Integer" >
DELETE FROM sys_user
WHERE id=#{value}
</ delete >
< update id = "modify" parameterType = "com.matol.entity.User" >
UPDATE sys_user
< set >
< if test = "name != null" >name=#{name},</ if >
< if test = "pass != null" >pass=#{pass},</ if >
< if test = "age != null" >age=#{age},</ if >
</ set >
WHERE id=#{id}
</ update >
< select id = "findById" parameterType = "Integer" resultMap = "resultUser" >
SELECT * FROM sys_user
WHERE id=#{value}
</ select >
< select id = "findAll" resultType = "list" resultMap = "resultUser" >
SELECT * FROM sys_user
</ select >
< select id = "count" resultType = "Integer" >
SELECT count(*) FROM sys_user
</ select >
</ mapper >
|
清单9. UserService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
package com.matol.service;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.matol.entity.User;
/**
*
* @author matol
* @date 2013-01-23 16:38
*/ @Repository (value = "userService" ) public interface UserService {
Integer create(User user);
Integer delete(Integer id);
Integer modify(User user);
User findById(Integer id);
User findByUser(User user);
List<User> findAll();
List<User> findAll(User user);
Integer count();
} |
清单10. UserServiceImpl.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
package com.matol.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Repository;
import com.matol.entity.User; import com.matol.mapper.UserMapper; import com.matol.service.UserService;
/**
*
* @author matol
* @date 2013-01-23 16:38
*/ @Repository (value = "userServiceImpl" ) public class UserServiceImpl implements UserService{
@Resource (name = "userMapper" )
private UserMapper userMapper;
public Integer count() {
return userMapper.count();
}
public Integer create(User user) {
return userMapper.create(user);
}
public Integer delete(Integer id) {
return userMapper.delete(id);
}
public List<User> findAll() {
return userMapper.findAll();
}
public List<User> findAll(User user) {
return userMapper.findAll(user);
}
public User findById(Integer id) {
return userMapper.findById(id);
}
public User findByUser(User user) {
return userMapper.findByUser(user);
}
public Integer modify(User user) {
return userMapper.modify(user);
}
} |
清单11. UserController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
package com.matol.controller;
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;
import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView;
import com.matol.entity.User; import com.matol.service.UserService;
/**
*
* @author matol
* @date 2013-01-23 16:38
*/ @Controller @RequestMapping (value = "/user" ) public class UserController {
@Resource (name = "userServiceImpl" )
private UserService userService;
/**
* @author matol
* @date 2013-01-23 16:38
* @return
*/ @RequestMapping (value = "**/list" )
public ModelAndView getAllUser(HttpServletRequest request,HttpServletResponse response) throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
List<User> result = new ArrayList<User>();
result = userService.findAll();
map.put( "result" , result);
return new ModelAndView( "/user/list" , map);
}
/**
* @author matol
* @date 2013-01-23 16:38
* @return
*/ @RequestMapping (value = "**/list/{id}" )
public ModelAndView getTheUser( @PathVariable ( "id" ) int id){
Map<String, Object> map = new HashMap<String, Object>();
List<User> result = new ArrayList<User>();
result.add(userService.findById(id));
map.put( "result" , result);
return new ModelAndView( "/user/list" , map);
}
/**
* @author matol
* @date 2013-01-23 16:38
* @return
*/ @RequestMapping (value = "**/toAdd" )
public ModelAndView toAddUser(){
return new ModelAndView( "/user/adds" );
}
/**
* @author matol
* @date 2013-01-23 16:38
* @return
*/ @RequestMapping (value = "**/doAdd" )
public String addUser(User user){
userService.create(user);
Map<String, Object> map = new HashMap<String, Object>();
List<User> result = new ArrayList<User>();
result = userService.findAll();
map.put( "result" , result);
return "redirect:list" ;
}
/**
* @author matol
* @date 2013-01-23 16:38
* @return
*/ @RequestMapping (value = "**/delete/{id}" )
public String deleteTheUser( @PathVariable ( "id" ) int id){
Map<String, Object> map = new HashMap<String, Object>();
userService.delete(id);
List<User> result = new ArrayList<User>();
result = userService.findAll();
map.put( "result" , result);
return "redirect:/user/list" ;
}
} |
清单12. index.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
< html >
< head >
< title >My JSP 'index.jsp' starting page</ title >
</ head >
< body >
< h3 >Spring3.1、MyBatis3.1、MySQL 整合.</ h3 >
< a href = "user/list" >查询所有</ a >< br />
< a href = "user/toAdd" >添加记录</ a >< br />
</ body >
</ html >
|
清单13. list.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" />
< title >Insert title here</ title >
</ head >
< body >
< c:forEach items = "${result}" var = "item" >
< a href = "list/${item.id }" >${item.name }</ a > pass: ${item.pass } --- age: ${item.age } < a href = "delete/${item.id }" >delete</ a >< hr />
</ c:forEach >
< a href = "toAdd" >添加记录</ a >< br />
</ body >
</ html >
|
清单14. adds.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" />
< title >Insert title here</ title >
</ head >
< body >
< br />
< form action = "doAdd" method = "post" >
name:< input type = "text" name = "name" >
pass:< input type = "text" name = "pass" >
age:< input type = "text" name = "age" >
< input type = "submit" value = "submit" >
</ form >
< br />
< a href = "list" >查询所有</ a >< br />
</ body >
</ html >
|
lib的jar清单
由于只是一个相对简单的使用范例,所以没有非常标准的注入DAO,以及DAO接口,只是通过Mapper代替过程。不过,道理都是一样,无非就是新添加一层注入而已。