06_MyBatis,Spring,SpringMVC整合


  1. 项目结构

06_MyBatis,Spring,SpringMVC整合

06_MyBatis,Spring,SpringMVC整合

06_MyBatis,Spring,SpringMVC整合

  1. Spring的配置:

beans.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:mvc="http://www.springframework.org/schema/mvc"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

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

      
http://www.springframework.org/schema/aop

      
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

      
http://www.springframework.org/schema/tx

      
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd "
>

<context:component-scan
base-package="com.rl"/>

<bean
id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property
name="driverClassName"
value="com.mysql.jdbc.Driver"></property>

<property
name="url"
value="jdbc:mysql://localhost:3306/mybatis"></property>

<property
name="username"
value="root"></property>

<property
name="password"
value="123456"></property>

</bean>

<!--

使用spring来管理sqlSessionFactory

-->

<bean
id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">

<property
name="configLocation"
value="classpath:sqlMapConfig.xml"></property>

<property
name="dataSource"
ref="dataSource"></property>

</bean>

<bean
id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property
name="dataSource"
ref="dataSource"></property>

</bean>

<tx:advice
id="txAdvice"
transaction-manager="txManager">

<tx:attributes>

<tx:method
name="save*"
propagation="REQUIRED"/>

<tx:method
name="update*"
propagation="REQUIRED"/>

<tx:method
name="delete*"
propagation="REQUIRED"/>

<tx:method
name="select*"
read-only="true"/>

</tx:attributes>

</tx:advice>

<aop:config>

<aop:advisor
advice-ref="txAdvice"
pointcut="execution(* com.rl.service..*.*(..))"/>

</aop:config>

</beans>

  1. springmvc.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:mvc="http://www.springframework.org/schema/mvc"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

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

      
http://www.springframework.org/schema/aop

      
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

      
http://www.springframework.org/schema/tx

      
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd "
>

<context:component-scan
base-package="com.rl.controller"/>

<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property
name="prefix"
value="/WEB-INF/jsp/"></property>

<property
name="suffix"
value=".jsp"></property>

</bean>

</beans>

  1. 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"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

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">

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:beans.xml</param-value>

</context-param>

<servlet>

<servlet-name>springmvc</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:springmvc.xml</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>springmvc</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

<filter>

<filter-name>SpringCharacterEncodingFilter</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>SpringCharacterEncodingFilter</filter-name>

<url-pattern>*.do</url-pattern>

</filter-mapping>

</web-app>


log4j.properties

log4j.rootLogger=DEBUG,
Console

#Console

log4j.appender.Console=org.apache.log4j.ConsoleAppender

log4j.appender.Console.layout=org.apache.log4j.PatternLayout

log4j.appender.Console.layout.ConversionPattern=%d
[%t]
%-5p
[%c]
-
%m%n

log4j.logger.java.sql.ResultSet=INFO

log4j.logger.org.apache=INFO

log4j.logger.java.sql.Connection=DEBUG

log4j.logger.java.sql.Statement=DEBUG

log4j.logger.java.sql.PreparedStatement=DEBUG

  1. sqlMapConfig.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>

<typeAliases>

<typeAlias
type="com.rl.model.Person"
alias="person"/>

</typeAliases>

<mappers>

<mapper
resource="com/rl/mapper/PersonMapper.xml"
/>

</mappers>

</configuration>

PersonMapper.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">

<!--

namespace:命名空间,用来唯一标识一个映射文件,命名规范就是当前的文件的包加上文件名

-->

<mapper
namespace="com.rl.mapper.PersonMapper">

<resultMap
type="person"
id="BaseResultMap">

<!--

column:库表的字段

property:库表所有映射的实体类中属性名

-->

<id
column="person_id"
property="personId"/>

<result
column="name"
property="name"/>

<result
column="gender"
property="gender"/>

<result
column="person_addr"
property="personAddr"/>

<result
column="birthday"
property="birthday"/>

</resultMap>

<!--

公用的sql片段,也可以接收参数动态sql,所有的sql可以

-->

<sql
id="columns">

PERSON_ID, NAME, GENDER, PERSON_ADDR, BIRTHDAY

</sql>

<!--

根据id来查询一个Person的数据

sql语句接收参数的一个语法#{},如果接收的是一个{}中的内容任意select
* from person_test t where t.ID = ?,使用预编译方式生成sql

id:sql语句的唯一的标识不能重复

parameterType:sql要接收的数据类型

resultType:sql所返回的数据类型

-->

<!--

实际项目中数据库的表的字段一般由多个单词来构成
由下划线来分隔多个单词 person_addr

在java的model的实体类中的属性多个单词的命名规范是驼峰模式personAddr

-->

<!--

useCache:控制当前的这个sql是否使用二级缓存

-->

<select
id="selectPersonById"
parameterType="int"
resultMap="BaseResultMap"
useCache="true">

select * from person t where t.person_id = #{id}

</select>

<!--
库表变更 -->

<insert
id="insert"
parameterType="person">

<selectKey
keyProperty="personId"
order="AFTER"
resultType="int">

select LAST_INSERT_ID()

</selectKey>

insert into person (person_id, name, gender, person_addr, birthday)

values(#{personId}, #{name}, #{gender}, #{personAddr}, #{birthday})

</insert>

<!--

删除的sql不能使用别名

-->

<delete
id="delete"
parameterType="int">

delete from person where person_id = #{personId}

</delete>

<!--
动态sql
-->

<!--

map.put("name", "安");

map.put("gender", "0");

map.put("personAddr", "东京")

map.put("birthday", new Date());

<where>会自动处理and,
第一个and可以不写,其他的and必须要写

-->

<select
id="selectPersonByCondition"
parameterType="map"
resultMap="BaseResultMap">

select * from person t

<where>

<if
test="name != null">

t.name like '%${name}%'

</if>

<if
test="gender != null">

and t.gender = #{gender}

</if>

<if
test="personAddr != null">

and t.person_addr like '%${personAddr}%'

</if>

<if
test="birthday != null">

<![CDATA[

and t.birthday < #{birthday}

]]>

</if>

</where>

</select>

<!--

动态修改

<set>标签可以去掉最后一个逗号

flushCache:二级缓存的刷新的配置:默认是true:会刷新,如果false就不刷新缓存

-->

<update
id="dynamicUpdate"
parameterType="person"
flushCache="false">

update person t

<set>

<if
test="name != null">

t.name = #{name},

</if>

<if
test="gender != null">

t.gender = #{gender},

</if>

<if
test="personAddr != null">

t.person_addr = #{personAddr},

</if>

<if
test="birthday != null">

t.birthday = #{birthday}

</if>

</set>

where t.person_id = #{personId}

</update>

</mapper>

6
 Person.java的内容如下:

package com.rl.model;

import java.io.Serializable;

import java.util.Date;

public class Person implements Serializable{

private static final long serialVersionUID = 7728191033619971201L;

private Integer personId;

private String name;

private String gender;

private String personAddr;

private Date birthday;

public Integer getPersonId() {

return personId;

}

public void setPersonId(Integer personId) {

this.personId = personId;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getGender() {

return gender;

}

public void setGender(String gender) {

this.gender = gender;

}

public String getPersonAddr() {

return personAddr;

}

public void setPersonAddr(String personAddr) {

this.personAddr = personAddr;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

}


PersonDao.java

package com.rl.dao;

import java.util.List;

import java.util.Map;

import com.rl.model.Person;

public interface PersonDao {

public void save(Person person);

public Person selectPersonById(Integer personId);

public void update(Person person);

public void delete(Integer personId);

public List<Person> selectPersonByCondition(Map<String, Object> map);

}


PersonDaoImpl.java的内容如下:

package com.rl.dao.impl;

import java.util.List;

import java.util.Map;

import org.mybatis.spring.support.SqlSessionDaoSupport;

import org.springframework.stereotype.Repository;

import com.rl.dao.PersonDao;

import com.rl.model.Person;

@Repository

public class PersonDaoImpl extends SqlSessionDaoSupport implements PersonDao {

//命名空间

String ns = "com.rl.mapper.PersonMapper.";

@Override

public void save(Person person) {

this.getSqlSession().insert(ns+"insert", person);

}

@Override

public Person selectPersonById(Integer personId) {

return (Person) this.getSqlSession().selectOne(ns+"selectPersonById", personId);

}

@Override

public void update(Person person) {

this.getSqlSession().update(ns+"dynamicUpdate", person);

}

@Override

public void delete(Integer personId) {

this.getSqlSession().delete(ns+"delete", personId);

}

@SuppressWarnings("unchecked")

@Override

public List<Person> selectPersonByCondition(Map<String, Object> map) {

return this.getSqlSession().selectList(ns+"selectPersonByCondition", map);

}

}


PersonService.java

package com.rl.service;

import java.util.List;

import java.util.Map;

import com.rl.model.Person;

public interface PersonService {

public void save(Person person);

public Person selectPersonById(Integer personId);

public void update(Person person);

public void delete(Integer personId);

public List<Person> selectPersonByCondition(Map<String, Object> map);

}

10
 PersonServiceImpl.java

package com.rl.service.impl;

import java.util.List;

import java.util.Map;

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

import org.springframework.stereotype.Service;

import com.rl.dao.PersonDao;

import com.rl.model.Person;

import com.rl.service.PersonService;

@Service

public class PersonServiceImpl implements PersonService {

@Autowired

private PersonDao personDao;

@Override

public void save(Person person) {

personDao.save(person);

}

@Override

public Person selectPersonById(Integer personId) {

return personDao.selectPersonById(personId);

}

@Override

public void update(Person person) {

personDao.update(person);

}

@Override

public void delete(Integer personId) {

personDao.delete(personId);

}

@Override

public List<Person> selectPersonByCondition(Map<String, Object> map) {

return personDao.selectPersonByCondition(map);

}

}

11
 PersonController.java的内容如下:

package com.rl.controller;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

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

import org.springframework.beans.propertyeditors.CustomDateEditor;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.ServletRequestDataBinder;

import org.springframework.web.bind.annotation.InitBinder;

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

import com.rl.model.Person;

import com.rl.service.PersonService;

@Controller

@RequestMapping("/person")

public class PersonController {

@Autowired

private PersonService personService;

/**

* 跳转到添加页面

*/

@RequestMapping("/toSave.do")

public String toSave(){

return "add";

}

/**

* 添加Person

*/

@RequestMapping("/save.do")

public String save(Person person){

personService.save(person);

return "redirect:listPerson.do";

}

/**

* 查询Person

*/

@RequestMapping("/getPerson.do")

public String getPerson(Integer personId, Model model){

Person person = personService.selectPersonById(personId);

model.addAttribute("person", person);

return "update";

}

/**

* 修改Person

*/

@RequestMapping("/update.do")

public String update(Person person){

personService.update(person);

return "redirect:listPerson.do";

}

/**

* 删除

*/

@RequestMapping("/delete.do")

public String delete(Integer personId){

personService.delete(personId);

return "redirect:listPerson.do";

}

/**

* 动态条件组合查询

*/

@RequestMapping("/listPerson.do")

public String listPerson(String name, String gender,

String personAddr, Date birthday, Model model){

Map<String, Object> map = new HashMap<String,Object>();

if(name != null && "".equals(name.trim())){

name = null;

}

if(gender != null && "".equals(gender.trim())){

gender = null;

}

if(personAddr != null && "".equals(personAddr.trim())){

personAddr = null;

}

map.put("name", name);

map.put("gender", gender);

map.put("personAddr", personAddr);

map.put("birthday", birthday);

List<Person> pList = personService.selectPersonByCondition(map);

model.addAttribute("pList", pList);

model.addAttribute("name", name);

model.addAttribute("gender", gender);

model.addAttribute("personAddr", personAddr);

model.addAttribute("birthday", birthday);

return "list";

}

@InitBinder

public void initBinder(ServletRequestDataBinder binder){

binder.registerCustomEditor(Date.class,

new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));

}

}

12 
add.jsp

<%@
page
language="java"
import="java.util.*"
pageEncoding="UTF-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<%@taglib
uri="http://java.sun.com/jsp/jstl/core" 
prefix="c"%>

<%@taglib
uri="http://java.sun.com/jsp/jstl/fmt" 
prefix="f"%>

<!DOCTYPE
HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<base
href="<%=basePath%>">

<title>My
JSP 'list.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">

<!--

<link rel="stylesheet" type="text/css" href="styles.css">

-->

</head>

<body>

<form
action="person/save.do"
method="post">

<table
width="80%"
align="center">

<tr>

<td><label>姓名:</label><input
type="text"
name="name"
></td>

<td><label>性别:</label>

<select
name="gender"
>

<option
value="">请选择</option>

<option
value="0" 
>男</option>

<option
value="1" 
>女</option>

</select>

</td>

<td><label>地址:</label><input
type="text"
name="personAddr"
></td>

<td><label>生日:</label><input
type="text"
name="birthday"></td>

<td><input
type="submit"
value="保存"></td>

</tr>

</table>

</form>

</body>

</html>

13 list.jsp

<%@
page
language="java"
import="java.util.*"
pageEncoding="UTF-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<%@taglib
uri="http://java.sun.com/jsp/jstl/core" 
prefix="c"%>

<%@taglib
uri="http://java.sun.com/jsp/jstl/fmt" 
prefix="f"%>

<!DOCTYPE
HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<base
href="<%=basePath%>">

<title>My
JSP 'list.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">

<!--

<link rel="stylesheet" type="text/css" href="styles.css">

-->

<script
type="text/javascript">

     
function
delPerson(personId){

if(confirm("真删吗?")){

window.location.href="person/delete.do?personId="+personId;

}

}

</script>

</head>

<body>

<form
action="person/listPerson.do"
method="post">

<table
width="80%"
align="center">

<tr>

<td><label>姓名:</label><input
type="text"
name="name"
value="${name }"></td>

<td><label>性别:</label>

<select
name="gender"
>

<option
value="">请选择</option>

<option
value="0"
<c:if
test="${gender == '0' }">selected</c:if>
>男</option>

<option
value="1"
<c:if
test="${gender == '1' }">selected</c:if>
>女</option>

</select>

</td>

<td><label>地址:</label><input
type="text"
name="personAddr"
value="${personAddr }"></td>

<td><label>生日:</label><input
type="text"
name="birthday"
value="<f:formatDate
value="${birthday }"
pattern="yyyy-MM-dd"/>"></td>

<td><input
type="submit"
value="查询"></td>

</tr>

</table>

</form>

<table
align="center"
width="80%">

<tr>

<td><a
href="person/toSave.do">添加</a></td>

</tr>

</table>

<table
width="80%"
align="center"
border="1">

<tr>

<th>姓名</th>

<th>性别</th>

<th>地址</th>

<th>生日</th>

<th>操作</th>

</tr>

<c:forEach
items="${pList }"
var=
"person">

<tr>

<td>${person.name
}</td>

<td>

<c:if
test="${person.gender == '0' }">
男</c:if>

<c:if
test="${person.gender == '1' }">
女</c:if>

</td>

<td>${person.personAddr
}</td>

<td><f:formatDate
value="${person.birthday }"
pattern=
"yyyy-MM-dd"/>
</td>

<td><a
href="person/getPerson.do?personId=${person.personId }">修改</a>

<a
href="javascript:void(0)"
onclick="delPerson(${person.personId})">删除</a></td>

</tr>

</c:forEach>

</table>

</body>

</html>

14 update.jsp

<%@
page
language="java"
import="java.util.*"
pageEncoding="UTF-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<%@taglib
uri="http://java.sun.com/jsp/jstl/core" 
prefix="c"%>

<%@taglib
uri="http://java.sun.com/jsp/jstl/fmt" 
prefix="f"%>

<!DOCTYPE
HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<base
href="<%=basePath%>">

<title>My
JSP 'list.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">

<!--

<link rel="stylesheet" type="text/css" href="styles.css">

-->

</head>

<body>

<form
action="person/update.do"
method="post">

<input
type="hidden"
name="personId"
value="${person.personId }">

<table
width="80%"
align="center">

<tr>

<td><label>姓名:</label><input
type="text"
name="name"
value="${person.name }"></td>

<td><label>性别:</label>

<select
name="gender"
>

<option
value="">请选择</option>

<option
value="0"
<c:if
test="${person.gender == '0' }">selected</c:if>
>男</option>

<option
value="1"
<c:if
test="${person.gender == '1' }">selected</c:if>
>女</option>

</select>

</td>

<td><label>地址:</label><input
type="text"
name="personAddr"
value="${person.personAddr }"></td>

<td><label>生日:</label><input
type="text"
name="birthday"
value="<f:formatDate
value="${person.birthday }"
pattern="yyyy-MM-dd"/>"></td>

<td><input
type="submit"
value="修改"></td>

</tr>

</table>

</form>

</body>

</html>

上一篇:Elasticsearch系列---并发控制及乐观锁实现原理


下一篇:C程序的内部机制