Qiuliang's Site

做一个独立思考和具备创新能力的人,打造谦逊和强大的内心

Spring MVC + Mybatis + MySQL CRUD Demo

本文档结合Spring MVCMybatisMySQL,说明如何实现一个简单的数据库单表CRUD操作。开发工具使用集成了spring mvc的eclipse(Spring Tool Suite,简称STS)。

[TOC]

##基础环境说明

  • Mac OS X 10.9.4
  • jre version 1.8.0_05
  • java sdk 1.8.0_05
  • STS 3.5.1
  • maven 3.2.2

以上环境安装配置好后,就可以开始demo程序了。

###MySQL建表语句

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=big5

##Step 1 新建spring mvc项目

使用STS新建一个spring mvc project,建立好项目后,一个基本的spring mvc web项目已经搭建好,我们只需要在这之上配置好相关的beans,以及编写CRUD相关的代码。

可以注意一下项目中的web.xmlservlet-context.xml,STS已经帮我们把跟spring相关的基本配置项配置好。

例如:web.xml中定义了请求由spring接管,以及IOC相关的配置文件名称。

<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
            <!-- IOC配置文件 -->
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

##Step 2 使用maven加载所需的jar包

如果使用独立安装的maven程序,需要在eclipse中指定maven的路径:

Preferences – Maven – Installations

例如,我的路径是:/usr/local/maven/maven3.2.2

maven配置好后,就可以在pom文件中添加相关的依赖项了,需要添加的相关依赖配置如下:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${org.springframework-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${org.springframework-version}</version>
</dependency>
<!-- mybatis -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.31</version>
</dependency>
<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.2.2</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.2.7</version>
</dependency>

需要注意跟spring相关的jar包的版本问题

保存pom文件后会自动根据配置文件下载所需的jar包。

##Step 3 主要配置示例

###bean相关配置 在servlet-context.xml配置文件中增加如下的bean,注意schema格式

数据源:

<!--数据源:-->
<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" lazy-init="default" autowire="default"  ]]>
      <beans:property name="driverClassName" value="com.mysql.jdbc.Driver"]]></beans:property]]>
      <beans:property name="url" value="jdbc:mysql://127.0.0.1:3306/remember" ]]></beans:property]]>
      <beans:property name="username" value="root"]]></beans:property]]>
      <beans:property name="password" value="123456"]]></beans:property]]>
      
   </beans:bean]]>

Mybatis Sql Session配置: > 由spring接管的mybatis session,configLocation配置的value要和实际的mybatis配置文件一致。

   <beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"]]>
      <beans:property name="configLocation" value="classpath:springdemo-mybatis-config.xml"]]></beans:property]]>
      <beans:property name="dataSource" ref="dataSource" />
   </beans:bean]]> 
 
   <beans:bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"]]>
      <beans:property name="basePackage" value="ql.mac.springdemo" />
   </beans:bean]]>

###Mybatis主配置文件

springdemo-mybatis-config.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]]>
   <settings]]>
      <setting name="cacheEnabled" value="true" />
      <setting name="lazyLoadingEnabled" value="true" />
      <setting name="aggressiveLazyLoading" value="false" /> 
      <setting name="multipleResultSetsEnabled" value="true" />
      <setting name="useColumnLabel" value="true" />
      <setting name="useGeneratedKeys" value="false" />
      <setting name="autoMappingBehavior" value="PARTIAL" />
      <setting name="defaultExecutorType" value="SIMPLE" />
      <setting name="defaultStatementTimeout" value="25000" />
      <setting name="safeRowBoundsEnabled" value="false" />
      <setting name="mapUnderscoreToCamelCase" value="false" />
      <setting name="localCacheScope" value="SESSION" />
      <setting name="jdbcTypeForNull" value="OTHER" />
      <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
   </settings]]>
   <typeAliases]]>
      <typeAlias alias="User" type="ql.mac.springdemo.model.User" />
   </typeAliases]]>
   <mappers]]>
      <mapper resource="mapper/user.xml" />
   </mappers]]>
</configuration]]>

###mapper文件 例如:mapper/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="ql.mac.springdemo.da.UserMapper"> 
       
    
    <select id="get" parameterType="int"  resultType="User">
      select * from user where ID=#{id};
    </select>
     
    <insert id="insert" parameterType="User" >
      insert into user values (#{id}, #{name}, #{age});
    </insert>
    
    <update id="update" parameterType="User" >
      update user set name=#{name},age=#{age} where id=#{id};
    </update>
  
</mapper>

##Step 4 主要代码

###定义Model User.java

package ql.mac.springdemo.model;

public class User {
	private int id;
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
}

###定义CRUD操作接口 UserMapper.java

package ql.mac.springdemo.da;

import ql.mac.springdemo.model.User;

public interface UserMapper {
	User get(int id);
	void insert(User u);
	void update(User u);
}

###编写Action

在Controller中增加CRUD相关的action。需要先将数据操作的mapper类注入到controller中,增加代码如下:

@Autowired
private UserMapper _userMapper;

####get一个数据实体

@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
public String get(@PathVariable("id") int id, Model model) {

    User u = _userMapper.get(id);
    model.addAttribute("user", u);

    return "user";
}

注解RequestMapping说明对应的url,以及http method,其中{id}代表URL参数,和action中的参数id对应,同时需要在参数id前增加注解:@PathVariable(“id”)

这里使用spring内置的model传递参数到view,在页面上可以采用如下语句获取数据实体内容。

<div>
	<p>
		<strong>Id</strong>
		<span>${user.getId()}</span>
	</p>
	<p>
		<strong>Name</strong>
		<span>${user.getName()}</span>
	</p>
	<p>
		<strong>Age</strong>
		<span>${user.getAge()}</span>
	</p>
</div>

####insert一个数据实体

add的get方法

@RequestMapping(value = "/add", method = RequestMethod.GET )
	public String Insert() {
		return "add";
	}

add的post方法

@RequestMapping(value = "/add", method = RequestMethod.POST )
@ResponseBody
public String Insert(User u) {
    _userMapper.insert(u);
    return "insert a new user";
}

对应的view

<form action="" method="post">
	<div>
		<p>
			<input type="text" value="${user.getId()}" name="id" />
		</p>
		<p>
			<strong>Name</strong>
			<input type="text" value="${user.getName()}" name="name" />
		</p>
		<p>
			<strong>Age</strong>
			<input type="text" value="${user.getAge()}" name="age" />
		</p>
	</div>
	
	<div>
		<input type="submit" value="Submit" />
	</div>
</form>

其他update和delete操作和上面基本类似,至此一个简单的单表CRUD程序已经能run起来了。