ssm實現簡單的增刪改查demo
Spring介紹:
spring 使用基本的 JavaBean 來完成以前只可能由 EJB 完成的事情。然而, Spring的用途不僅限於伺服器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java 應用都可以從 Spring 中受益。 簡單來說, Spring 是一個輕量級的控制反轉(IoC )和麵向切面( AOP )的容器框架。
SpringMVC介紹
Spring MVC 屬於 SpringFrameWork 的後續產品,已經融合在Spring Web Flow 裡面。 Spring MVC 分離了
MyBatis介紹
MyBatis 本是 apache 的一個開源專案 iBatis , 2010 年這個專案由apache software foundation 遷移到了 google code ,並且改名為 MyBatis 。MyBatis 是一個基於 Java 的
首先不是maven架構整合的 SSM 框架
建立資料庫、表db_product user user_t【最下面有sql語句】
1.專案整體結構
2.新增相關jar 包
3.專案整體結構出來了
4.建立model【User】
- package com.lyt.model;
- /**
- * 使用者
- * @author
- *
- */
- public class User {
- private int id;
- private String userName;
- private String age;
- @Override
- public String toString() {
- return "User [id=" + id + ", age=" + age + ", userName=" + userName
- + "]";
- }
- public User(){
- super();
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getAge() {
- return age;
- }
- public void setAge(String age) {
- this.age = age;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public User(int id, String age, String userName) {
- super();
- this.id = id;
- this.age = age;
- this.userName = userName;
- }
- }
5.建立DAO介面【在mybatis中
package com.lyt.mapper; import java.util.List; import com.lyt.model.User; /** * 做為 DAO的介面 * @author */ public interface UserMapper { void save(User user); boolean update(User user); boolean delete(int id); User findById(int id); List<User> findAll(); } 5.建立DAO介面【在mybatis中 mapper就相當於dao】
- package com.lyt.mapper;
- import java.util.List;
- import com.lyt.model.User;
- /**
- * 做為 DAO的介面
- * @author */
- public interface UserMapper {
- void save(User user);
- boolean update(User user);
- boolean delete(int id);
- User findById(int id);
- List<User> findAll();
- }
6.實現dao介面【mybatis中就是UserMapper.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:必須與對應的介面全類名一致 UserMapper.java
- id :必須與對應介面的某個對應的方法名一致即必須要和UserMapper.java介面中的方法同名。
- -->
- <mapper namespace="com.lyt.mapper.UserMapper">
- <insert id="save" parameterType="User">
- insert into t_user(user_name,user_age) values(#{userName},#{age})
- </insert>
- <update id="update" parameterType="User">
- update t_user set user_name=#{userName},user_age=#{age} where user_id=#{id}
- </update>
- <delete id="delete" parameterType="int">
- delete from t_user where user_id=#{id}
- </delete>
- <!-- mybsits_config中配置的alias類別名,也可直接配置resultType為類路徑 -->
- <select id="findById" parameterType="int" resultType="User">
- select user_id id,user_name userName,user_age age from t_user where user_id=#{id}
- </select>
- <select id="findAll" resultType="User">
- select user_id id,user_name userName,user_age age from t_user
- </select>
- </mapper>
這裡對這個xml檔案作幾點說明:
1、namespace必須與對應的介面全類名一致。
2、id必須與對應介面的某個對應的方法名一致即必須要和UserMapper.java介面中的方法同名。
---------------------------------------------------
7.mybatis與Spring整合【spring-common.xml】放在src的根目錄下
對於Mybatis和Spring的整合是這篇博文的重點,需要配置的內容在下面有詳細的解釋。
- <?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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-4.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
- <!-- Mybatis和Spring的整合 -->
- <!-- 1. 資料來源 : DriverManagerDataSource -->
- <bean id="dataSource"
- class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName" value="com.mysql.jdbc.Driver" />
- <property name="url" value="jdbc:mysql://localhost:3306/db_zsl" />
- <property name="username" value="root" />
- <property name="password" value="root" />
- </bean>
- <!--
- 2. mybatis的SqlSession的工廠: SqlSessionFactoryBean dataSource:引用資料來源
- MyBatis定義資料來源,同意載入配置
- -->
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource"></property>
- <property name="configLocation" value="classpath:mybatis-config.xml" />
- </bean>
- <!--
- 3. mybatis自動掃描載入Sql對映檔案/介面 : MapperScannerConfigurer sqlSessionFactory
- basePackage:指定sql對映檔案/介面所在的包(自動掃描)
- -->
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="basePackage" value="com.lyt.mapper"></property>
- <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
- </bean>
- <!--
- 4. 事務管理 : DataSourceTransactionManager dataSource:引用上面定義的資料來源
- -->
- <bean id="txManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource"></property>
- </bean>
- <!-- 5. 使用宣告式事務
- transaction-manager:引用上面定義的事務管理器
- -->
- <tx:annotation-driven transaction-manager="txManager" />
- </beans>
- 8.mybatis配置檔案【mybatis-config.xml】放在src目錄下
- <?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="User" type="com.lyt.model.User" />
- </typeAliases>
- <!-- 實體介面對映資源 -->
- <!--
- 說明:如果xxMapper.xml配置檔案放在和xxMapper.java統一目錄下,mappers也可以省略,因為org.mybatis.spring.mapper.MapperFactoryBean預設會去查詢與xxMapper.java相同目錄和名稱的xxMapper.xml
- -->
- <mappers>
- <mapper resource="com/lyt/mapper/userMapper.xml" />
- </mappers>
- </configuration>
-
配置log4j.properties
- ### set log levels ###
- log4j.rootLogger = info , Console , D
- #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=INFO
- log4j.logger.java.sql.Statement=INFO
- log4j.logger.java.sql.PreparedStatement=INFO
- #output2file
- log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
- log4j.appender.D.File = D\:/logs/log.log
- log4j.appender.D.Append = true
- log4j.appender.D.Threshold = INFO \#\# \u00E8\u00BE\u0093\u00E5\u0087\u00BAinfo\u00E7\u00BA\u00A7\u00E5\u0088\u00AB\u00E4\u00BB\u00A5\u00E4\u00B8\u008A\u00E7\u009A\u0084\u00E6\u0097\u00A5\u00E5\u00BF\u0097
- log4j.appender.D.layout = org.apache.log4j.PatternLayout
- log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] %m%n
10.整合Springmvc
配置spring-mvc.xml放在src根目錄下
- <?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: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.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-4.0.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
- <!-- 註解掃描包 -->
- <context:component-scan base-package="com.lyt.controller" />
- <context:component-scan base-package="com.lyt.service" />
- <!-- 開啟註解 -->
- <mvc:annotation-driven />
- <!--
- 配置靜態資源,直接對映到對應的資料夾,不被DispatcherServlet處理,3.04新增功能,需要重新設定spring-mvc-3.0.xsd
- -->
- <mvc:resources mapping="/img/**" location="/img/" />
- <mvc:resources mapping="/js/**" location="/js/" />
- <mvc:resources mapping="/css/**" location="/css/" />
- <mvc:resources mapping="/html/**" location="/html/" />
- <!-- 定義跳轉的檔案的前後綴 ,檢視模式配置-->
- <bean id="viewResolver"
- class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <!-- 這裡的配置我的理解是自動給後面action的方法return的字串加上字首和字尾,變成一個 可用的url地址 -->
- <property name="prefix" value="/WEB-INF/jsp/" />
- <property name="suffix" value=".jsp" />
- </bean>
- </beans>
- 11.配置web.xml
- <?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">
- <!-- 載入Spring容器配置 -->
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <!-- 設定Spring容器載入所有的配置檔案的路徑 -->
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <!-- <param-value>classpath:config/spring-*.xml</param-value> -->
- <param-value>classpath:spring-common.xml,classpath:spring-mvc.xml</param-value>
- </context-param>
- <!-- 配置SpringMVC核心控制器 -->
- <servlet>
- <servlet-name>springMVC</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <!-- 配置初始配置化檔案,前面contextConfigLocation看情況二選一 -->
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:spring-common.xml,classpath:spring-mvc.xml</param-value>
- </init-param>
- <!-- 啟動載入一次 -->
- <load-on-startup>1</load-on-startup>
- </servlet>
- <!--為DispatcherServlet建立對映 -->
- <servlet-mapping>
- <servlet-name>springMVC</servlet-name>
- <!-- 此處可以可以配置成*.do,對應struts的字尾習慣 -->
- <url-pattern>/</url-pattern>
- </servlet-mapping>
- <!-- 防止Spring記憶體溢位監聽器 -->
- <listener>
- <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
- </listener>
- <!-- 解決工程編碼過濾器 -->
- <filter>
- <filter-name>encodingFilter</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>
- <init-param>
- <param-name>forceEncoding</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>encodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
- 12.建立service以及service實現UserService
- package com.lyt.service;
- import java.util.List;
- import com.lyt.model.User;
- public interface UserService {
- void save(User user);
- boolean update(User user);
- boolean delete(int id);
- User findById(int id);
- List<User> findAll();
- }
UserServiceImpl
- package com.lyt.service.impl;
- import java.util.List;
- import javax.annotation.Resource;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import com.lyt.mapper.UserMapper;
- import com.lyt.model.User;
- import com.lyt.service.UserService;
- @Service
- @Transactional
- // 此處不再進行建立SqlSession和提交事務,都已交由spring去管理了。
- public class UserServiceImpl implements UserService {
- @Resource
- private UserMapper mapper;
- /**
- * 根據 id 刪除 資料
- */
- public boolean delete(int id) {
- return mapper.delete(id);
- }
- /**
- * 查詢User的全部資料
- */
- public List<User> findAll() {
- List<User> findAllList = mapper.findAll();
- return findAllList;
- }
- /**
- * 根據 id 查詢 對應資料
- */
- public User findById(int id) {
- User user = mapper.findById(id);
- return user;
- }
- /**
- * 新增資料
- */
- public void save(User user) {
- mapper.save(user);
- }
- /**
- * 根據 id 修改對應資料
- */
- public boolean update(User user) {
- return mapper.update(user);
- }
- }
13.建立UserController
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.List;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.RequestMapping;
- import com.lyt.model.User;
- import com.lyt.service.UserService;
- @Controller
- @RequestMapping("/user")
- public class UserController {
- @Autowired
- private UserService userService;
- /**
- * 獲取所有使用者列表
- * @param request
- * @return
- */
- @RequestMapping("/getfindAllUser")
- public String getAllUser(HttpServletRequest request,Model model){
- List<User> user = userService.findAll();
- model.addAttribute("userList", user);
- request.setAttribute("userList", user);
- return "/findAllUser";
- }
- /**
- * 跳轉到新增使用者介面
- * @param request
- * @return
- */
- @RequestMapping("/toAddUser")
- public String toAddUser(){
- return "/addUser";
- }
- /**
- * 新增使用者並重定向
- * @param user
- * @param request
- * @return
- */
- @RequestMapping("/addUser")
- public String addUser(User user,Model model){
- userService.save(user);
- return "redirect:/user/getAllUser";
- }
- /**
- *編輯使用者
- * @param user
- * @param request
- * @return
- */
- @RequestMapping("/updateUser")
- public String updateUser(User user,HttpServletRequest request,Model model){
- if(userService.update(user)){
- user = userService.findById(user.getId());
- request.setAttribute("user", user);
- model.addAttribute("user", user);
- return "redirect:/user/getAllUser";
- }else{
- return "/error";
- }
- }
- /**
- * 根據id查詢單個使用者
- * @param id
- * @param request
- * @return
- */
- @RequestMapping("/getUser")
- public String getUser(int id,HttpServletRequest request,Model model){
- request.setAttribute("user", userService.findById(id));
- model.addAttribute("user", userService.findById(id));
- return "/editUser";
- }
- /**
- * 刪除使用者
- * @param id
- * @param request
- * @param response
- */
- @RequestMapping("/delUser")
- public void delUser(int id,HttpServletRequest request,HttpServletResponse response){
- String result = "{\"result\":\"error\"}";
- if(userService.delete(id)){
- result = "{\"result\":\"success\"}";
- }
- response.setContentType("application/json");
- try {
- PrintWriter out = response.getWriter();
- out.write(result);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
至此 大部分架構以及程式碼已經搭建完成
我們來做前臺頁面--修改index.jsp
- <%@ 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>
- <base href="<%=basePath%>">
- <title>首頁</title>
- </head>
- <body>
- <h5>
- <a href="<%=basePath%>user/getAllUser">進入使用者管理頁</a>
- </h5>
- </body>
- </html>
在 WEB-INF 下新建jsp資料夾【裡面新建以下檔案】【addUser.jsp】【allUser.jsp】【editUser.jsp】addUser.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"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- <title>新增使用者</title>
- <script type="text/javascript">
- function addUser(){
- var form = document.forms[0];
- form.action = "<%=basePath%>user/addUser";
- form.method="post";
- form.submit();
- }
- </script>
- </head>
- <body>
- <h1><%=path%>新增使用者<%=basePath%></h1>
- <form action="" name="userForm">
- 姓名:<input type="text" name="userName">
- 年齡:<input type="text" name="age">
- <input type="button" value="新增" onclick="addUser()">
- </form>
- </body>
- </html>
findAllUser.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"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- <script type="text/javascript" src="js/jquery-1.7.1.js"></script>
- <title>使用者列表</title>
- <script type="text/javascript">
- function del(id){
- $.get("<%=basePath%>user/delUser?id=" + id,function(data){
- if("success" == data.result){
- alert("刪除成功");
- window.location.reload();
- }else{
- alert("刪除失敗");
- }
- });
- }
- </script>
- </head>
- <body>
- <h6><a href="<%=basePath%>user/toAddUser">新增使用者</a></h6>
- <table border="1">
- <tbody>
- <tr>
- <th>姓名</th>
- <th>年齡</th>
- <th>操作</th>
- </tr>
- <c:if test="${!empty userList }">
- <c:forEach items="${userList}" var="user">
- <tr>
- <td>${user.userName }</td>
- <td>${user.age }</td>
- <td>
- <a href="<%=basePath%>user/getUser?id=${user.id}">編輯</a>
- <a href="javascript:del('${user.id }')">刪除</a>
- </td>
- </tr>
- </c:forEach>
- </c:if>
- </tbody>
- </table>
- </body>
- </html>
editUser.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"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- <title>編輯使用者</title>
- <script type="text/javascript">
- function updateUser(){
- var form = document.forms[0];
- form.action = "<%=basePath%>user/updateUser";
- form.method="post";
- form.submit();
- }
- </script>
- </head>
- <body>
- <h1>新增使用者</h1>
- <form action="" name="userForm">
- <input type="hidden" name="id" value="${user.id }"/>
- 姓名:<input type="text" name="userName" value="${user.userName }"/>
- 年齡:<input type="text" name="age" value="${user.age }"/>
- <input type="button" value="編輯" onclick="updateUser()"/>
- </form>
- </body>
- </html>
到此 簡單的SSM demo基本的操作內容已經完成對應的資料庫 表
- /*
- Navicat MySQL Data Transfer
- Source Server : localhost
- Source Server Version : 50515
- Source Host : localhost:3306
- Source Database : db_zsl
- Target Server Type : MYSQL
- Target Server Version : 50515
- File Encoding : 65001
- Date: 2016-05-16 16:10:51
- */
- SET FOREIGN_KEY_CHECKS=0;
- -- ----------------------------
- -- Table structure for `t_user`
- -- ----------------------------
- DROP TABLE IF EXISTS `t_user`;
- CREATE TABLE `t_user` (
- `user_id` int(11) NOT NULL AUTO_INCREMENT,
- `user_name` varchar(20) NOT NULL,
- `user_age` varchar(20) NOT NULL,
- PRIMARY KEY (`user_id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
- -- ----------------------------
- -- Records of t_user
- -- ----------------------------
- INSERT INTO `t_user` VALUES ('2', '狗蛋', '25');
- INSERT INTO `t_user` VALUES ('3', '二愣子', '150');
- INSERT INTO `t_user` VALUES ('4', '二狗', '23');
- INSERT INTO `t_user` VALUES ('5', '狗剩', '23');
- INSERT INTO `t_user` VALUES ('6', '狗狗', '23');
- INSERT INTO `t_user` VALUES ('7', '傻蛋', '23');
- INSERT INTO `t_user` VALUES ('9', '大傻', '23123');
- -- ----------------------------
- -- Table structure for `user_t`
- -- ----------------------------
- DROP TABLE IF EXISTS `user_t`;
- CREATE