Spring、SpringMvC和mybatis整合

本文详细介绍了如何在WebJava工程中整合MyBatis和Spring框架,包括配置数据库连接、事务管理、DAO层实现、Service层设计及Controller层处理等关键步骤,实现了基于条件查询的动态SQL和数据持久化操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、新建web java工程

2、加载依赖包到WEB-INF-lib目录下:

一、添加配置文件:

1、创建配置文件包config:

2、添加配置文件(mybatis):

3、 添加PersonMapper

<?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">
	<!-- 当前映射文件开启二级缓存 -->
	<!-- <cache type="org.mybatis.caches.ehcache.EhcacheCache"/> -->
	<!-- 
		resultMap:组装从数据库表中查询出来的自定义实体的
		type:实体的数据类型
		id:resultMap的唯一标识
	 -->
	<resultMap type="person" id="BaseResultMap">
		<!-- 
			id列只有一个
			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 id="colums">
		person_id, name, gender, person_addr, birthday
	</sql>
	
	<!-- 
		id:sql的唯一标识
		parameterType:传递给sql的参数的数据类型
		resultType:返回数据结果的类型
		#{id}:用于接收参数的语法{}中的内容,如果是接收一个参数内容任意 select * from person_test where id = ?
		,#{}使用预编译的方式生成sql,防止sql的注入
		useCache:是否启用二级缓存true是启用false是禁用,默认是true
	 -->
	<select id="selectPersonById" parameterType="int" resultMap="BaseResultMap" useCache="true">
		select * from person where person_id = #{id}
	</select>
	<!-- ======================================库表变更======================================== -->
	
	<insert id="insert" parameterType="person">
		<!-- 
			selectKey是做主键返回的
			keyProperty:接收返回主键的属性
			order:insert语句和生成主键的sql的执行顺序mysql是AFTER,oracle是BEFORE
			resultType:返回主键的数据类型
			生成主键的sql select LAST_INSERT_ID()
		 -->
		<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>
	
	
	
	<delete id="delete" parameterType="int">
		delete from person  where person_id = #{id}
	</delete>
	
	<!-- ============================动态sql=================================== -->
	<!-- 
		<where>用于动态条件组合查询,可以去掉where后的第一个and
	 -->
	<select id="selectPersonByCondition" parameterType="qc" 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>标签处理,能处理掉最后一个逗号,不要忘记加上t.person_id = #{personId},
	 -->
	<update id="dynamicUpdate" parameterType="person">
		update person t 
		<set>
			t.person_id = #{personId},
			<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>

4、添加配置文件(Spring)

在config下创建beans,并且添加头信息和配置文件:

<?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/"></context:component-scan>
		<!-- 数据源 -->
		<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="root"></property>
		</bean>
		
		<!-- 
			配置SessionFactory(Spring和Mybatis做整合) 
		-->
		<bean id="sqlSessionFactroy" class="org.mybatis.spring.SqlSessionFactoryBean">
			<!-- 数据源的注入 -->
			<property name="dataSource" ref="dataSource"></property>
			<!-- 读取核心配置 -->
			<property name="configLocation" value="classpath:sqlMapConfig.xml"></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>

5、 配置SpringMVC:

<?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、先创建model层:

         创建Person类:

package com.rl.model;

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

public class Person implements Serializable{
    /**
	 * 
	 */
	private static final long serialVersionUID = -3327265996783250419L;

	private Integer personId;

    private String name;

    private Integer 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 Integer getGender() {
        return gender;
    }

    public void setGender(Integer 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;
    }

	@Override
	public String toString() {
		return "Person [personId=" + personId + ", name=" + name + ", gender="
				+ gender + ", personAddr=" + personAddr + ", birthday="
				+ birthday + "]";
	}
}

2、创建QueryCondition类:

package com.rl.model;

import java.util.Date;

public class QueryCondition {
	
	private Integer gender;
	
	private Date birthday;
	
	private String name;
	
	private String personAddr;
	

	public Integer getGender() {
		return gender;
	}


	public void setGender(Integer gender) {
		this.gender = gender;
	}


	public Date getBirthday() {
		return birthday;
	}


	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}


	public String getName() {
		return name;
	}


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


	public String getPersonAddr() {
		return personAddr;
	}


	public void setPersonAddr(String personAddr) {
		this.personAddr = personAddr;
	}
	@Override
	public String toString() {
		return "QueryCondition [gender=" + gender + ", birthday=" + birthday
				+ "]";
	}
}

创建dao层:

 创建PersonDao接口:

package com.rl.dao;

import java.util.List;

import com.rl.model.Person;
import com.rl.model.QueryCondition;

public interface PersonDao {
	
	public void savePerson(Person p);
	
	public Person selectPersonById(Integer personId);
	
	public void delete(Integer personId);
	
	public List<Person> selectPersonByCondtion(QueryCondition qc);
}

 创建Daoimpl实现类:

         创建PersonDaoImpl实现类(注解开发,SqlSessionDaoSupport注意这个继承类,开发中也会使用它):

package com.rl.dao.impl;

import java.util.List;

import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.stereotype.Repository;

import com.rl.dao.PersonDao;
import com.rl.model.Person;
import com.rl.model.QueryCondition;
@Repository
public class PersonDaoImpl extends SqlSessionDaoSupport implements PersonDao {

	//查找命名空间
	String ns = "com.rl.mapper.PersonMapper.";
	
	@Override
	public void savePerson(Person p) {
		this.getSqlSession().insert(ns+"insert", p);
	}

	@Override
	public Person selectPersonById(Integer personId) {
		return (Person) this.getSqlSession().selectOne(ns+"selectPersonById", personId);
	}
	
	@Override
	public void update(Person p) {
		this.getSqlSession().update(ns+"dynamicUpdate", p);
	}

	@Override
	public void delete(Integer personId) {
		this.getSqlSession().delete(ns+"delete", personId);
	}

	@Override
	public List<Person> selectPersonByCondtion(QueryCondition qc) {
		return this.getSqlSession().selectList(ns+"selectPersonByCondition", qc);
	}

}

创建Service层:

package com.rl.service;

import java.util.List;

import com.rl.model.Person;
import com.rl.model.QueryCondition;

public interface PersonService {
	
public void savePerson(Person p);
	
	public Person selectPersonById(Integer personId);
	
	public void update(Person p);
	
	public void delete(Integer personId);
	
	public List<Person> selectPersonByCondtion(QueryCondition qc);

}

创建实现类:

package com.rl.service.impl;

import java.util.List;

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.model.QueryCondition;
import com.rl.service.PersonService;
@Service
public class PersonServiceImpl implements PersonService{

	//注入dao
	@Autowired
	private PersonDao personDao;
	
	@Override
	public void savePerson(Person p) {
		personDao.savePerson(p);
	}

	@Override
	public Person selectPersonById(Integer personId) {
		return personDao.selectPersonById(personId);
	}

	@Override
	public void update(Person p) {
		personDao.update(p);
	}

	@Override
	public void delete(Integer personId) {
		personDao.delete(personId);
	}

	@Override
	public List<Person> selectPersonByCondtion(QueryCondition qc) {
		return personDao.selectPersonByCondtion(qc);
	}
	
}

创建controller层:

         创建PersonController类:

package com.rl.controller;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

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.model.QueryCondition;
import com.rl.service.PersonService;

import freemarker.template.SimpleDate;

@Controller
@RequestMapping("/person")
public class PersonController {
	
	@Autowired
	private PersonService personService;
	/**
	 * 查询
	 * @param qc
	 * @param model
	 * @return
	 */
	@RequestMapping("/listPerson.do")
	public String listPerson(QueryCondition qc, Model model){
		List<Person> pList = personService.selectPersonByCondtion(qc);
		model.addAttribute("pList", pList);
		model.addAttribute("qc", qc);
		return "list";
	}
	/**
	 * 跳转到添加页面
	 */
	@RequestMapping("/toSave.do")
	public String toSave(){
		return "save";
	}
	
	@RequestMapping("/save.do")
	public String save(Person p){
		personService.savePerson(p);
		return "redirect:listPerson.do";
	}
	
	/**
	 * 根据id查询Person
	 */
	@RequestMapping("/selectPerson.do")
	public String selectPerson(Integer PersonId, Model model){
		Person p = personService.selectPersonById(PersonId);
		model.addAttribute("person", p);
		return "update";
	}
	/**
	 * 修改
	 * @param p
	 * @return
	 */
	@RequestMapping("/update.do")
	public String update(Person p){
		personService.update(p);
		return "redirect:listPerson.do";
	}
	
	@RequestMapping("/delete.do")
	public String delete(Integer personId){
		personService.delete(personId);
		return "redirect:listPerson.do";
	}
	
	/**
	 * 修改时间格式
	 */
	@InitBinder
	public void initBinder(ServletRequestDataBinder binder){
		binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
	}
}

配置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">
	<!-- 配置Spring的listener -->
	<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>
	
	<!-- springmvc的中央控制器 -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	</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>

三、页面编写

在WEB-INF中创建jsp文件夹,添加list.jsp界面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f" %>
<%
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>
    <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/listPerson.do" method="post">
    	<table align="center" width="80%">
    	<tr>
    		<td><label>姓名:</label><input type="text" name="name" value="${qc.name }"></td>
    		<td><label>性别:</label>
					<select name="gender">
						<option value="">请选择</option>
						<option value="1" <c:if test="${qc.gender == 1 }">selected</c:if> >帅哥</option>
						<option value="0" <c:if test="${qc.gender == 0 }">selected</c:if> >美女</option>
					</select>
			</td>
			<td><label>地址:</label><input type="text" name="personAddr" value="${qc.personAddr }"></td>
			<td><label>生日:</label><input type="text" name="birthday" value ="<f:formatDate value="${qc.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 align="center" width="80%" 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 == 1 }">帅哥</c:if>
    				<c:if test="${person.gender == 0 }">美女</c:if>
    			</td>
    			<td>${person.personAddr }</td>
    			<td><f:formatDate pattern="yyyy-MM-dd" value="${person.birthday }"/></td>
    			<td>
    				<a href="person/selectPerson.do?personId=${person.personId }">修改</a>
    				<a href="person/delete.do?personId=${person.personId }">删除</a>
    			</td>
    		</tr>
    	</c:forEach>
    </table>
    
  </body>
</html>

测试:

将项目部署在Tomcat中:

个人学习笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值