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中:
个人学习笔记