天天看點

Spring MVC MyBatis [A]SpringMVC MyBatis

Spring MVC MyBatis [A]

  • SpringMVC MyBatis
    • SpringMVC MyBatis 1: SpringMVC
    • SpringMVC MyBatis 2: MyBatis
    • SpringMVC MyBatis 3: Maven
    • SpringMVC MyBatis 4: SpringMVC ORM

SpringMVC MyBatis

Spring MVC MyBatis [A]SpringMVC MyBatis

SpringMVC MyBatis 1: SpringMVC

Spring MVC MyBatis [A]SpringMVC MyBatis
  • spring-framework
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • View ( JSP, Velocity, Xslt)
  • HandlerMapping: BeanNameUrlHandlerMapping : using Bean to project to url
  • HandlerMapping: SimpleUrlHandlerMapping
  • HandlerMapping: DefaultAnnotationHandlerMapping : request uses @RequestMapping controller
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • < !-- 使用處理器映射器 -->
  • < bean class=“org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping”/>
  • < !-- 處理器擴充卡 -->
  • < bean class=“org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter”/>
  • < !-- 這個類用于Spring MVC視圖解析 -->
  • < bean class=“org.springframework.web.servlet.view.InternalResourceViewResolver”/>
  • Spring MVC environment
  • spring release
  • SPRING MVC --Environment Setup
  • import JAR : struts2-spring-plugin-2.5.5.jar ; struts2-core-2.5.5.jar
    Spring MVC MyBatis [A]SpringMVC MyBatis
    1. import jar
    1. allocate web.xml : < servlet-class>org.springframework.web.servlet.DispatcherServlet… < servlet-mapping>
    1. WEB-INF> right click> new>XML Configuration File>Spring Config> “helloServelet.xml”
    1. public class HelloController extends AbstractController (implement in new java file)
  • add D:\Program Files\Tomcat9\lib\servlet-api.jar to lib > right click >add as library
  • run/debug configurations>+> add Tomcat> local server> deployment>+>add artifact
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • hello_springmvc
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • HelloController.java
package com.abc.springmvc.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.AbstractCollection;
public class HelloController extends AbstractController {
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest req,  HttpServletResponse resp)
        throws Exception{
        System.out.println("hello controller...");
        return null;
    }
}
           
  • hello-servlet.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/beans ">
    <!--mapping-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--handler-->
  <!--  <bean name="/hello.action" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>-->
    <bean name="/hello.action" class="com.abc.springmvc.controller.HelloController"></bean>
</beans>
           
  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!--  <load-on-startup>1</load-on-startup> -->
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
           
  • run result
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • method 1: - < bean class=“org.springframework.web.servlet.handler.SimpleUrlHandlerMapping”>
  • hello-servlet.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/beans ">
    <bean id="hello" class="com.abc.springmvc.controller.HelloController"></bean>
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="urlMap">
            <map>
                <entry key="/hi.action" value-ref="hello"></entry>
            </map>
        </property>
    </bean>
</beans>
           
Spring MVC MyBatis [A]SpringMVC MyBatis
  • method 2: < bean class=“org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping”/>
  • ERROR java.lang.ClassNotFoundException: org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping
  • Solve: use SimpleUrlHandlerMapping
  • hello-servlet.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/beans ">
<!--    <bean id="hello" class="com.abc.springmvc.controller.HelloController"></bean>-->
    <bean id="message" class="com.abc.springmvc.controller.MessageController"></bean>
<!--    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>-->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="urlMap">
                <map>
                    <entry key="/message" value-ref="message"></entry>
                </map>
            </property>
    </bean>
</beans>
           
  • MessageController
package com.abc.springmvc.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MessageController implements Controller {


    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        System.out.println("Message Controller...");
        return null;
    }
}
           
  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!--  <load-on-startup>1</load-on-startup> -->
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
           
  • result
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • method 3: @autowired controller
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • hello-servlet.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:context="http://www.springframework.org/schema/context"
       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-3.0.xsd">
    <context:component-scan base-package="com.abc.springmvc.controller"/>
</beans>
           
  • WelcomeController.java
package com.abc.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class WelcomeController {
    @RequestMapping("/welcome")
//  @RequestMapping({"/welcome","wel"})
    public String welcome(){
        System.out.println("base annotation welcome...");
        return"";
    }
}
           
  • result
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
  • InternalResourceViewResolver: prefix+viewName+suffix
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • WelcomeController.java
package com.abc.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class WelcomeController {
//    @RequestMapping("/welcome")
    @RequestMapping({"/welcome","wel"})
    public String welcome(){
        System.out.println("base annotation welcome...");
        return "welcome"; //WEB-INF/page/welcome.jsp
    }
}
           
  • welcome.jsp
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/4/1
  Time: 13:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Welcome</title>
</head>
<body>
<H3>WELCOME!!!</H3>
</body>
</html>
           
  • hello-servlet.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:context="http://www.springframework.org/schema/context"
       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-3.0.xsd">

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

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--mapping-->
<!--    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>-->
<!--    &lt;!&ndash;handler&ndash;&gt;-->
<!--    <bean name="/hello.action" class="com.abc.springmvc.controller.HelloController"></bean>-->
</beans>
           
Spring MVC MyBatis [A]SpringMVC MyBatis
  • welcome.jsp doesn’t work anymore
  • HelloController.java
package com.abc.springmvc.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.AbstractCollection;

public class HelloController extends AbstractController {
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest req,
                                                  HttpServletResponse resp)
        throws Exception{
        System.out.println("hello controller...");
        return new ModelAndView("hello");
    }
}
           
  • hello.jsp
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/4/1
  Time: 13:14
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Hello</title>
</head>
<body>
<h3>HELLO!!!</h3>
</body>
</html>
           
  • hello-servlet.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:context="http://www.springframework.org/schema/context"
       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-3.0.xsd">
    <context:component-scan base-package="com.abc.springmvc.controller"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--mapping-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--handler-->
    <bean name="/hello.action" class="com.abc.springmvc.controller.HelloController"></bean>
</beans>
           
  • @RequestParam :must pass value
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • WelcomeController.java
package com.abc.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class WelcomeController {
//    @RequestMapping("/welcome")
    @RequestMapping({"/welcome","wel"})
    public String welcome(@RequestParam String username){
//        public String welcome( String username){
        System.out.println("base annotation welcome...");
        System.out.println(username);
        return "welcome"; //WEB-INF/page/welcome.jsp
    }
}
           
  • hello-servlet.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:context="http://www.springframework.org/schema/context"
       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-3.0.xsd">

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

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>
           
  • result
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
    if model.addAttribute(value) does not have key for the value, then the type for value is the key
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • WelcomeController.java
package com.abc.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
@Controller
public class WelcomeController {
    //    @RequestMapping("/welcome")
    @RequestMapping({"/welcome", "wel"})
//    public String welcome(@RequestParam String username){
    public String welcome(String username) {
        System.out.println("base annotation welcome...");
        System.out.println(username);
        return "welcome"; //WEB-INF/page/welcome.jsp
    }
    @RequestMapping("/login")
    public String login(String username, Map<String, Object> ctx) {
        ctx.put("username", username);
        return "welcome";
    }
}
           
  • WelcomeController.java Alternative
package com.abc.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
@Controller
public class WelcomeController {
    @RequestMapping("/login")
    public String login(String username, Model model) {
        //model.addAttribute("username", username);
        //Welcome.jsp Username:${username}
        model.addAttribute(username);
        return "welcome";
    }
}
           
  • welcome.jsp
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/4/1
  Time: 13:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Welcome</title>
</head>
<body>
<H3>WELCOME!!!</H3>
Username:${String}
</body>
</html>
           
  • result
    Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
  • WelcomeController.java
package com.abc.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.HashMap;
import java.util.Map;
@Controller
public class WelcomeController {
    @RequestMapping("/login")
//    public String login(String username, Map<String, Object> ctx) {
    public String login(String username, Model model) {
      //  model.addAttribute("username", username);
        model.addAttribute(username);
        Map<String,String> maps=new HashMap<>();
        maps.put("abc","admin");
        maps.put("cba","admin2");
        maps.put("ccc","admin3");
        model.addAttribute( "map",maps);
        return "welcome";
    }
}
           
  • welcome.jsp
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/4/1
  Time: 13:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Welcome</title>
</head>
<body>
<H3>WELCOME!!!</H3>
Username:${string}
Maps: map.abc: ${map.abc}
Maps: map.cba: ${map.cba}
Maps: map.ccc: ${map.ccc}
</body>
</html>
           
  • Use Spring MVC (Model View Controller) for user management: add, edit, delete, query
    Spring MVC MyBatis [A]SpringMVC MyBatis
UserAction extends ActionSupport
public String addInput(){ //Jump to added page}
public String add(){ //Save Step}
public String add(){} //get
public String add(User user){} //post

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>  
<sf:form modelAttribute="">//modelAttribute same as ModelDriven in Struts2
class UserAction implements ModelDriven<User>{
getModel(){
if(user==null{
user=new USER();}}}
           
Spring MVC MyBatis [A]SpringMVC MyBatis
  • add jstl-1.2.jar to lib folder
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • UserController.java
package com.abc.springmvc.controller;
import com.abc.springmvc.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.HashMap;
import java.util.Map;
@Controller
@RequestMapping("/user")
public class UserController {
    Map<String, User> users = new HashMap<>();

    public UserController() {
        users.put("abc", new User(1, "abc", "bob", "[email protected]"));
        users.put("cba", new User(2, "cba", "abe", "[email protected]"));
        users.put("ccc", new User(3, "ccc", "cole", "[email protected]"));
        users.put("aaa", new User(4, "aaa", "avi", "[email protected]"));
    }
    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public String list(Model model) {
        //add into map
        model.addAttribute("users", users);
        return "user/list";
    }
    @RequestMapping(value = "/add", method = RequestMethod.GET)
    public String add(Model model) {
        //must add model.addAttribute for modelAttribute in sf:form
        model.addAttribute(new User());
        return "user/add";
    }
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String add(@Validated User user) {
        //add into map
        users.put(user.getUsername(), user);
        return "redirect:/user/list";
    }
    @RequestMapping(value = "/{username}/show", method = RequestMethod.GET)
    public String show(@PathVariable String username, Model model) {
        User user = users.get(username);
        model.addAttribute(user);
        return "user/show";
    }
    @RequestMapping(value="/{username}/update",method=RequestMethod.GET)
    public String update(@PathVariable String username, Model model){
        User user=users.get(username);
        model.addAttribute(user);
        return "user/update";
    }
    @RequestMapping(value="/update",method=RequestMethod.POST)
    public String update(User user){
        //same key
        users.put(user.getUsername(),user);
        return "redirect:/user/list";
    }
    @RequestMapping(value="/{username}/delete",method=RequestMethod.GET)
    public String delete(@PathVariable String username){
        users.remove(username);
        return "redirect:/user/list";
    }
}
           
  • WelcomeController.java
package com.abc.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.HashMap;
import java.util.Map;
@Controller
public class WelcomeController {
    @RequestMapping("/login")
//    public String login(String username, Map<String, Object> ctx) {
    public String login(String username, Model model) {
      //  model.addAttribute("username", username);
        model.addAttribute(username);
        Map<String,String> maps=new HashMap<>();
        maps.put("abc","admin");
        maps.put("cba","admin2");
        maps.put("ccc","admin3");
        model.addAttribute( "map",maps);
        return "welcome";
    }
}
           
  • add.jsp
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/4/2
  Time: 13:19
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
    <title>User Add</title>
</head>
<body>
<sf:form action="/user/add" method="post" modelAttribute="user">
    id: <sf:input path="id"  /><br/>
    username: <sf:input path="username"  /><br/>
    nickname: <sf:input path="nickname"  /><br/>
    email: <sf:input path="email"  /><br/>
    <sf:button value="SAVE USER">Save User</sf:button>
</sf:form>
</body>
</html>
           
  • list.jsp
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/4/2
  Time: 13:00
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>User List</title>
</head>
<body>
<a  href="/user/add">add user</a><br/><br/>
<c:forEach var="user" items="${users}">
    ${user} <br/>
    ---${user.value.id}<br/>
    ---${user.value.username}<br/>
    ---${user.value.nickname}<br/>
    ---${user.value.email} <br/>
    <a  href="/user/${user.value.username}/show">show user</a><br/><br/>
    <a  href="/user/${user.value.username}/update">update user</a><br/><br/>
    <a  href="/user/${user.value.username}/delete">delete user</a><br/><br/>
</c:forEach>
</body>
</html>
           
  • show.jsp
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/4/3
  Time: 13:04
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Show User Info</title>
</head>
<body>
${user.id}---${user.nickname}---${user.username}---${user.email}
</body>
</html>

           
  • update.jsp
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/4/3
  Time: 18:42
  To change this template use File | Settings | File Templates.
--%>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>update</title>
</head>
<body>
<sf:form action="/user/update"   modelAttribute="user">
    id: <sf:input path="id"  /><br/>
    username: <sf:input path="username"  /><br/>
    nickname: <sf:input path="nickname"  /><br/>
    email: <sf:input path="email"  /><br/>
    <sf:button value="update USER">update User</sf:button>
</sf:form>
</body>
</html>
           
  • welcome.jsp
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/4/1
  Time: 13:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Welcome</title>
</head>
<body>
<H3>WELCOME!!!</H3>
Username:${string}
Maps: map.abc: ${map.abc}
Maps: map.cba: ${map.cba}
Maps: map.ccc: ${map.ccc}
</body>
</html>
           
  • hello-servlet.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:context="http://www.springframework.org/schema/context"
       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-3.0.xsd">

    <context:component-scan base-package="com.abc.springmvc.controller"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--mapping-->
<!--    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>-->
    <!--handler-->
<!--    <bean name="/hello.action" class="com.abc.springmvc.controller.HelloController"></bean>-->
</beans>
           
  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!--  <load-on-startup>1</load-on-startup> -->
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--char encoding-->
    <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>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
           
Spring MVC MyBatis [A]SpringMVC MyBatis
  • REST
  • JSR-303
  • add jars: IMPORTANT!
  • bean-validator.jar
  • classmate 1.5.1
  • add()
  • validateAdd(){addFieldError(“id”,“id cannot be empty”} < s:fieldError…>
  • ConstrantValidator Hibernate validator
  • annotation-driven
  • @Validated
  • @NonNull (message=“username cannot be empty”)
  • @Size (min=1 max=6)
  • @Email
  • @AssertTrue
  • @AssertFalse
  • @Min
  • @Max
  • @DecimalMin
  • @DecimalMax
  • @Digits (Number & String)
  • @Past (Date & Calendar)
  • @Future (Date & Calendar)
  • @Pattern (String)
  • @Length
  • @NotEmpty
  • @Range
  • ERROR: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean#0’: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
  • ERROR: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean#0’: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
  • ERROR: java.lang.NoSuchMethodError: javax.validation.Configuration.getDefaultParameterNameProvider()Ljavax/validation/ParameterNameProvider;
  • MAYBE? SOLVE?
  • issue: wrong validation version or hibernate validation version, or file already included that contains the wrong version and is being used
  • make sure has bean-validator and classmate jar
Spring MVC MyBatis [A]SpringMVC MyBatis
  • UserController.java
package com.abc.springmvc.controller;
import com.abc.springmvc.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.HashMap;
import java.util.Map;
@Controller
@RequestMapping("/user")
public class UserController {
    Map<String, User> users = new HashMap<>();
    private User user;
    private BindingResult br;
    public UserController() {
        users.put("abc", new User(1, "abc", "bob", "[email protected]"));
        users.put("cba", new User(2, "cba", "abe", "[email protected]"));
        users.put("ccc", new User(3, "ccc", "cole", "[email protected]"));
        users.put("aaa", new User(4, "aaa", "avi", "[email protected]"));
    }
    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public String list(Model model) {
        //add into map
        model.addAttribute("users", users);
        return "user/list";
    }
    @RequestMapping(value = "/add", method = RequestMethod.GET)
    public String add(Model model) {
        //must add model.addAttribute for modelAttribute in sf:form
        model.addAttribute(new User());
        return "user/add";
    }
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String add( @Validated User user, BindingResult br) {
        this.user = user;
        this.br = br;
        //check
        if(br.hasErrors()){
            return "user/add";
        }
        //add into map
        users.put(user.getUsername(), user);
        return "redirect:/user/list";
    }
    @RequestMapping(value = "/{username}/show", method = RequestMethod.GET)
    public String show(@PathVariable String username, Model model) {
        User user = users.get(username);
        model.addAttribute(user);
        return "user/show";
    }
    @RequestMapping(value="/{username}/update",method=RequestMethod.GET)
    public String update(@PathVariable String username, Model model){
        User user=users.get(username);
        model.addAttribute(user);
        return "user/update";
    }
    @RequestMapping(value="/update",method=RequestMethod.POST)
    public String update(User user){
        //same key
        users.put(user.getUsername(),user);
        return "redirect:/user/list";
    }
    @RequestMapping(value="/{username}/delete",method=RequestMethod.GET)
    public String delete(@PathVariable String username){
        users.remove(username);
        return "redirect:/user/list";
    }
}
           
  • User.java
package com.abc.springmvc.model;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.Size;
public class User {
    private int id;
    @NotEmpty(message ="username must be Empty")
    private String username;
    @Size(min=1, max=6, message = "min=1, max=6")
    private String nickname;
    @Email(message = "email incorrect")
    private String email;
    public User(){}
    public User(int id, String username, String nickname, String email) {
        this.id = id;
        this.username = username;
        this.nickname = nickname;
        this.email = email;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getNickname() {
        return nickname;
    }
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}
           
  • add.jsp
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/4/2
  Time: 13:19
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
    <title>User Add</title>
</head>
<body>
<sf:form action="/user/add"  modelAttribute="user">
    id: <sf:input path="id"  /><br/>
    username: <sf:input path="username"  />    <sf:errors path="username"/><br/>
    nickname: <sf:input path="nickname"  />   <sf:errors path="nickname"/><br/>
    email: <sf:input path="email"  />    <sf:errors path="email"/><br/>
    <sf:button value="SAVE USER">Save User</sf:button>
</sf:form>
</body>
</html>
           
  • hello-servlet.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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       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-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!--    <context:annotation-config/>-->
<!--    controller-->
    <context:component-scan base-package="com.abc.springmvc.controller"/>
<!-- Spring MVC-->
     <mvc:annotation-driven/>
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>
           
Spring MVC MyBatis [A]SpringMVC MyBatis
    1. create custom Exception (UserException)
    1. Create Controller (@ExceptionHandler(UserException.class) public String handlerException(UserException ex, Model model) { model.addAttribute(“ex”, ex); return “inc/error”; }
    1. throw exceptino (throw new UserException(“ERROR”)
    1. show error on jsp page (${ex.message})
      Spring MVC MyBatis [A]SpringMVC MyBatis
  • IndexController.java
package com.abc.springmvc.controller;
import com.abc.springmvc.exception.UserException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class IndexController {
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String login(String username, String password) {
        if ("admin".equals(username)) {
            if ("12345".equals(password)) {
                //Login success
                //Save Session
            } else {
                //throw exception password
                throw new UserException("PASSWORD INCORRECT");
            }
        } else {
            //throw exception username
            throw new UserException("USER NAME INCORRECT");
        }
        return "redirect:/user/list";
    }
    @ExceptionHandler(UserException.class)
    public String handlerException(UserException ex, Model model) {
        model.addAttribute("ex", ex);
        return "inc/error";
    }
}
           
  • UserExceptin.java (generate override all runtimeException methods)
package com.abc.springmvc.exception;
public class UserException  extends RuntimeException{
    public UserException() {
        super();
    }
    public UserException(String message) {
        super(message);
    }
    public UserException(String message, Throwable cause) {
        super(message, cause);
    }
    public UserException(Throwable cause) {
        super(cause);
    }
    protected UserException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}
           
  • error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Error Page</title>
</head>
<body>
Error Info: ${ex.message}
</body>
</html>
           
  • login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>login</title>
</head>
<body>
<form action="/login" method="post">
    Username: <input type="text" name="username" /><br/>
    Password: <input type="password" name="password"/><br/>
    <input type="submit" value="LOGIN">
</form>
</body>
</html>
           
  • Use Mapping
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • IndexController.java
package com.abc.springmvc.controller;
import com.abc.springmvc.exception.UserException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class IndexController {
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String login(String username, String password) {
        if ("admin".equals(username)) {
            if ("12345".equals(password)) {
                //Login success
                //Save Session
            } else {
                //throw exception password
                throw new UserException("PASSWORD INCORRECT");
            }
        } else {
            //throw exception username
            throw new UserException("USER NAME INCORRECT");
        }
        return "redirect:/user/list";
    }
}
           
  • error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Error Page</title>
</head>
<body>
<%--Error Info: ${ex.message}--%>
ERROR : ${exception.message}
</body>
</html>
           
  • hello-servlet.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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       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-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!--    <context:annotation-config/>-->
<!--    controller-->
    <context:component-scan base-package="com.abc.springmvc.controller"/>
<!-- Spring MVC-->
     <mvc:annotation-driven/>
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
<!--    exception mapping-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="com.abc.springmvc.exception.UserException">
                    inc/error
                </prop>
            </props>
        </property>
    </bean>
</beans>
           
  • Use Servlet API
    1. use HttpSession session.setAttribute
    1. in @Controller class add @SessionAttributes({“attr1”} in method: model.asMap().put(“attr1”, attr);
      Spring MVC MyBatis [A]SpringMVC MyBatis
  • IndexController.java
package com.abc.springmvc.controller;
import com.abc.springmvc.exception.UserException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import javax.servlet.http.HttpSession;
@Controller
@SessionAttributes({"curUser"})
public class IndexController {
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String login(String username, String password,
                       // HttpSession session) {
                        Model model){
        if ("admin".equals(username)) {
            if ("12345".equals(password)) {
                //Login success
                //Save Session
                model.asMap().put("curUser", username);
//                session.setAttribute("curUser",username);
            } else {
                //throw exception password
                throw new UserException("PASSWORD INCORRECT");
            }
        } else {
            //throw exception username
            throw new UserException("USER NAME INCORRECT");
        }
        return "redirect:/user/list";
    }
           
  • list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    WELCOME ${curUser} TO list.jsp PAGE
    <title>User List</title>
</head>
<body>
<a  href="/user/add">add user</a><br/><br/>
<c:forEach var="user" items="${users}">
    ${user} <br/>
    ---${user.value.id}<br/>
    ---${user.value.username}<br/>
    ---${user.value.nickname}<br/>
    ---${user.value.email} <br/>
    <a  href="/user/${user.value.username}/show">show user</a><br/><br/>
    <a  href="/user/${user.value.username}/update">update user</a><br/><br/>
    <a  href="/user/${user.value.username}/delete">delete user</a><br/><br/>
</c:forEach>
</body>
</html>
           
  • add css
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • style.css
a{
font-size:15px;
text-decoration: none;
color: red;
}
a:hover{
    text-decoration: underline;
}
           
  • list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    WELCOME ${curUser} TO list.jsp PAGE
    <title>User List</title>
    <link rel="stylesheet" type="text/css" href="/resources/css/style.css">
</head>
<body>
<a  href="/user/add">add user</a><br/><br/>
<c:forEach var="user" items="${users}">
    ${user} <br/>
    ---${user.value.id}<br/>
    ---${user.value.username}<br/>
    ---${user.value.nickname}<br/>
    ---${user.value.email} <br/>
    <a  href="/user/${user.value.username}/show">show user</a><br/>
    <a  href="/user/${user.value.username}/update">update user</a><br/>
    <a  href="/user/${user.value.username}/delete">delete user</a><br/><br/>
</c:forEach>
</body>
</html>
           
  • hello-servlet.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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       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-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!--    <context:annotation-config/>-->
<!--    controller-->
    <context:component-scan base-package="com.abc.springmvc.controller"/>
<!-- Spring MVC -->
     <mvc:annotation-driven/>
<!--process static files-->
<!--    * one star per folder level-->
<mvc:resources mapping="/resources/**" location="/resources/"/>
<!--               servlet mapping-->
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
<!--    exception mapping-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="com.abc.springmvc.exception.UserException">
                    inc/error
                </prop>
            </props>
        </property>
    </bean>
    <!--servlet mapping-->
    <!--    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>-->
    <!--handler-->
    <!--    <bean name="/hello.action" class="com.abc.springmvc.controller.HelloController"></bean>-->
</beans>
           
Spring MVC MyBatis [A]SpringMVC MyBatis
    1. import jar
  • commons-fileupload
  • commons-io
  • spring web portlet
    1. change form enctype=“multipart/form-data” , add < bean> in servlet.xml
    1. add file uploaded to method MultipartFile photo
    1. add file io in method controller java file
      Spring MVC MyBatis [A]SpringMVC MyBatis
  • UserController.java
package com.abc.springmvc.controller;

import com.abc.springmvc.model.User;
import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Controller
@RequestMapping("/user")
public class UserController {
    Map<String, User> users = new HashMap<>();
    private User user;
    private BindingResult br;
    public UserController() {
        users.put("abc", new User(1, "abc", "bob", "[email protected]"));
        users.put("cba", new User(2, "cba", "abe", "[email protected]"));
        users.put("ccc", new User(3, "ccc", "cole", "[email protected]"));
        users.put("aaa", new User(4, "aaa", "avi", "[email protected]"));
    }
    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public String list(Model model) {
        //add into map
        model.addAttribute("users", users);
        return "user/list";
    }
    @RequestMapping(value = "/add", method = RequestMethod.GET)
    public String add(Model model) {
        //must add model.addAttribute for modelAttribute in sf:form
        model.addAttribute(new User());
        return "user/add";
    }
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String add(@Validated User user, BindingResult br,
                      MultipartFile photo, HttpSession session) throws IOException {
        System.out.println(photo.getOriginalFilename());
        System.out.println(photo.getContentType());
        System.out.println(photo.getName());
        //begin uploading file
        String filename = photo.getOriginalFilename();
        String path = session.getServletContext().getRealPath("/resources/upload/");
        System.out.println(path+":"+filename);
        File file = new File(path +File.separator+filename);
        FileUtils.copyInputStreamToFile(photo.getInputStream(),file);
        //find errors
        this.user = user;
        this.br = br;
        //check
        if (br.hasErrors()) {
            return "user/add";
        }
        //add into map
        users.put(user.getUsername(), user);
        return "redirect:/user/list";
    }
    @RequestMapping(value = "/{username}/show", method = RequestMethod.GET)
    public String show(@PathVariable String username, Model model) {
        User user = users.get(username);
        model.addAttribute(user);
        return "user/show";
    }
    @RequestMapping(value = "/{username}/update", method = RequestMethod.GET)
    public String update(@PathVariable String username, Model model) {
        User user = users.get(username);
        model.addAttribute(user);
        return "user/update";
    }
    @RequestMapping(value = "/update", method = RequestMethod.POST)
    public String update(User user) {
        //same key
        users.put(user.getUsername(), user);
        return "redirect:/user/list";
    }
    @RequestMapping(value = "/{username}/delete", method = RequestMethod.GET)
    public String delete(@PathVariable String username) {
        users.remove(username);
        return "redirect:/user/list";
    }
}
           
  • upload (folder creation)
  • add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
    <title>User Add</title>
</head>
<body>
<sf:form action="/user/add"  modelAttribute="user"
enctype="multipart/form-data">
    id: <sf:input path="id"  /><br/>
    username: <sf:input path="username"  />    <sf:errors path="username"/><br/>
    nickname: <sf:input path="nickname"  />   <sf:errors path="nickname"/><br/>
    email: <sf:input path="email"  />    <sf:errors path="email"/><br/>
    file upload<input type="file" name="photo"/>
    <sf:button value="SAVE USER">Save User</sf:button>
</sf:form>
</body>
</html>
           
  • hello-servlet.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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       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-3.0.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
    <!--    <context:annotation-config/>-->
    <!--    controller-->
    <context:component-scan base-package="com.abc.springmvc.controller"/>
    <!-- Spring MVC -->
    <mvc:annotation-driven/>
    <!--process static files-->
    <!--    * one star per folder level-->
    <mvc:resources mapping="/resources/**" location="/resources/"/>
    <!--               servlet mapping-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--    exception mapping-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="com.abc.springmvc.exception.UserException">
                    inc/error
                </prop>
            </props>
        </property>
    </bean>
    <!--    file upload mapping-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="1024000000"/>
    </bean>
</beans>
           
  • Multifile upload
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • UserController.java
package com.abc.springmvc.controller;
import com.abc.springmvc.model.User;
import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@Controller
@RequestMapping("/user")
public class UserController {
    Map<String, User> users = new HashMap<>();
    private User user;
    private BindingResult br;
...
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    //or use @RequestParam("photos") MultipartFile[] photos
    public String add(@Validated User user, BindingResult br,
                      MultipartFile[] photos, HttpSession session) throws IOException {
//        System.out.println(photo.getOriginalFilename());
//        System.out.println(photo.getContentType());
//        System.out.println(photo.getName());
        //begin uploading file
        for (MultipartFile photo : photos) {
            if(photo.isEmpty()) continue; //empty files skipped
            String filename = photo.getOriginalFilename();
            String path = session.getServletContext().getRealPath("/resources/upload/");
            System.out.println(path + ":" + filename);
            File file = new File(path + File.separator + filename);
            FileUtils.copyInputStreamToFile(photo.getInputStream(), file);
        }//find errors
        this.user = user;
        this.br = br;
        //check
        if (br.hasErrors()) {
            return "user/add";
        }
        //add into map
        users.put(user.getUsername(), user);
        return "redirect:/user/list";
    }
    ...
}
           
  • add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
    <title>User Add</title>
</head>
<body>
<sf:form action="/user/add"  modelAttribute="user"
enctype="multipart/form-data">
    id: <sf:input path="id"  /><br/>
    username: <sf:input path="username"  />    <sf:errors path="username"/><br/>
    nickname: <sf:input path="nickname"  />   <sf:errors path="nickname"/><br/>
    email: <sf:input path="email"  />    <sf:errors path="email"/><br/>
    file upload<input type="file" name="photos"/><br/>
    file upload<input type="file" name="photos"/><br/>
    file upload<input type="file" name="photos"/><br/>
    file upload<input type="file" name="photos"/><br/>
    file upload<input type="file" name="photos"/><br/>
    <sf:button value="SAVE USER">Save User</sf:button>

</sf:form>
</body>
</html>
           
Spring MVC MyBatis [A]SpringMVC MyBatis
  • jackson-core
  • jackson-annotation
  • jackson-databind
  • UserController.java
...
    /*
     * @param username
     * @param model
     * @return Json*/
    @RequestMapping(value = "/{username}/show", method = RequestMethod.GET, params = "json")
    @ResponseBody
//    public String show(@PathVariable String username, Model model) {
    public User show(@PathVariable String username) {
        User user = users.get(username);
        System.out.println(user);
        return user;
    }
...
           
Spring MVC MyBatis [A]SpringMVC MyBatis

SpringMVC MyBatis 2: MyBatis

  • Object-relational mapping (ORM) is a programming technique in which a metadata descriptor is used to connect object code to a relational database.
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • MYBATIS
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • mysql connector java
  • configuration
  • junit
  • hamcrest
  • ERROR Can’t connect to MySQL server on ‘localhost’ (10061)
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • result
D:\Program Files\mysql\bin>mysql -u root -p
Enter password: *****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.19 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
           
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
  • User.java
package com.abc.mybatis.model;
public class User {
    private int id;
    private String username;
    private String password;
    private String email;
    public User(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}
           
  • 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">
<mapper namespace="com.abc.mybatis.model.User">
    <select id="addUser">
    insert into t_user(username,password, email)
    values (#{username},#{password},#{email})
   </select>
</mapper>
           
  • TestMyBatis.java
package com.abc.mybatis.test;
import com.abc.mybatis.model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class TestMyBatis {
   @Test
   public void test01(){
      try {
         InputStream is= Resources.getResourceAsStream("mybatis.xml");
         SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
         SqlSession session=factory.openSession();
         User user= new User("abc","word","[email protected]");
         session.insert("com.abc.mybatis.model.User.addUser",user);
         session.commit();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}
           
  • mybatis.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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
                <property name="username" value="root"/>
                <property name="password" value="12345"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/abc/mybatis/model/UserMapper.xml"/>
    </mappers>
</configuration>
           
Spring MVC MyBatis [A]SpringMVC MyBatis
  • TestMyBatis
package com.abc.mybatis.test;
import com.abc.mybatis.util.MyBatisUtil;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class TestMyBatis {
    @Test
    public void test01(){
//        try {
 /*           //create Mybatis xml inputstream
            InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
            //inputstream creates sqlsessionfactory
            SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
            //get SqlSession*/
//            SqlSession session=factory.openSession();
            //execute
            SqlSession session= MyBatisUtil.getSession();
            long count=session.selectOne("com.abc.mybatis.model.User.getUserCount");
            System.out.println(count);
            Assert.assertEquals(1,count);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        finally{
//            session.close();
//        }
        MyBatisUtil.close(session);
    }
}
           
  • MyBatisUtil.java
package com.abc.mybatis.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MyBatisUtil {
   private static SqlSessionFactory factory=null;
    static{
        //create Mybatis xml inputstream
        InputStream is= null;
        try {
            is = Resources.getResourceAsStream("mybatis-config.xml");
            //inputstream creates sqlsessionfactory
             factory=new SqlSessionFactoryBuilder().build(is);
            //get SqlSession
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
//get sqlsession
    public static SqlSession getSession(){
        return factory.openSession();
    }
    public static void close(SqlSession session){
        if(session !=null){
            session.close();
        }
    }
}
           
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
  • MyBatis environment
    1. import jars
    1. create mybatis.xml
  • builder pattern : starbucks vs seattle best, guest:test
  • factory pattern:OCP (Open/Closed Principle); 裡氏替換原則(Liskov Substitution principle)Liskov Spring (IS)
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
    JDBC>MyBatis>Hibernate
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
  • CoffeeBuilder.java
package com.abc.mybatis.design;
public class CoffeeBuilder extends StarbucksBuilder {
    @Override
    public StarbucksProduct DrinkBuilder() {
        StarbucksProduct pro = new StarbucksProduct();
        pro.setDrink("Coffee");
        System.out.println("coffeeBuilder done");
        return pro;
    }
}
           
  • Customer.java
package com.abc.mybatis.design;
public class Customer {
    public static void main(String[] args) {
        Waiter w=new Waiter();
       StarbucksProduct pro= w.getProduct();
        System.out.println( pro.getDrink());
    }
}
           
  • StarbucksBuilder.java
package com.abc.mybatis.design;
//Builder
public abstract class StarbucksBuilder {
    public abstract StarbucksProduct DrinkBuilder();
}
           
  • StarbucksProduct.java
package com.abc.mybatis.design;
//product
public class StarbucksProduct {
    private String drink;
    public StarbucksProduct(){}
    public StarbucksProduct(String drink) {
        this.drink = drink;
    }
    public String getDrink() {
        return drink;
    }
    public void setDrink(String drink) {
        this.drink = drink;
    }
}
           
  • TeaBuilder.java
package com.abc.mybatis.design;
public class TeaBuilder  extends StarbucksBuilder {
    @Override
    public StarbucksProduct DrinkBuilder() {
        StarbucksProduct pro = new StarbucksProduct();
        pro.setDrink("Tea");
        System.out.println("TeaBuilder done");
        return pro;
    }
}
           
  • Waiter.java
package com.abc.mybatis.design;
import org.apache.ibatis.session.SqlSessionFactory;
public class Waiter {
    public StarbucksProduct getProduct(){
        StarbucksBuilder cBuilder=new CoffeeBuilder();
       StarbucksProduct pro= cBuilder.DrinkBuilder();
       return pro;
    }
}
           
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
  • jdbc.properties
driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/mydb
username = root
password = 12345
           
  • 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>
    <properties resource="jdbc.properties"/>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/abc/mybatis/model/UserMapper.xml"/>
    </mappers>
</configuration>
           
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
  • IntelliJ surround with … (Ctrl + Alt + T)
    Spring MVC MyBatis [A]SpringMVC 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">
<!--<mapper namespace="com.abc.mybatis.model.User">-->
<mapper namespace="User">
<!--    count-->
    <select id="getUserCount" resultType="long">
        select count(id) from t_user
  </select>
<!--    select all from user-->
<!--    <select id="getUserList" resultType="com.abc.mybatis.model.User">-->
<!--   use alias-->
    <select id="getUserList" resultType="User" parameterType="User">
        select * from t_user
    </select>
</mapper>
           
  • TestMyBatis.java
package com.abc.mybatis.test;
import com.abc.mybatis.model.User;
import com.abc.mybatis.util.MyBatisUtil;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestMyBatis {
    @Test
    public void test01(){
            SqlSession session= MyBatisUtil.getSession();
            long count=session.selectOne("User.getUserCount");
            System.out.println(count);
            Assert.assertEquals(1,count);
        MyBatisUtil.close(session);
    }
    @Test
    public void testGetUserList(){
        SqlSession session=null;
        try {
            System.out.println(User.class.getName());
             session=MyBatisUtil.getSession();
            System.out.println(session.getConfiguration());
            System.out.println(session.getConnection());
            // List<User> list=session.selectList(User.class.getName()+".getUserList");
            List<User> list=session.selectList("User.getUserList");
            for(User user:list){
                System.out.println(user.getUsername()+";"+ user.getEmail());
            }
        } catch (Exception e) {
          //  session.rollback();
            e.printStackTrace();
        }finally {
            MyBatisUtil.close(session);
        }
    }
}
           
  • 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>
    <!--    link properties to file-->
    <properties resource="jdbc.properties"/>
    <!--    aliases-->
    <typeAliases>
        <typeAlias type="com.abc.mybatis.model.User" alias="User"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <!--            manager-->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--                datasource attributes-->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/abc/mybatis/model/UserMapper.xml"/>
    </mappers>
</configuration>
           
Spring MVC MyBatis [A]SpringMVC MyBatis
  • log4j.properties
  • log4j.jar
  • #{ data}: send whatever type through
  • ${ data}: send string through
    Spring MVC MyBatis [A]SpringMVC 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">
<!--<mapper namespace="com.abc.mybatis.model.User">-->
<mapper namespace="User">
    <!--    count-->
    <select id="getUserCount" resultType="long">
        select count(id) from t_user
  </select>
    <!--    select all from user-->
    <!--    <select id="getUserList" resultType="com.abc.mybatis.model.User">-->
    <!--   use alias-->
    <select id="getUserList" resultType="User" parameterType="User">
        select * from t_user
    </select>
    <!--    new user-->
    <insert id="addUser" parameterType="User">
        insert into t_user(username, password,email)
        values(#{username},#{password},#{email})
    </insert>
    <!--    update user-->
    <update id="updateUser" parameterType="User">
        update t_user set username=#{username},password=#{password},email=#{email}
        where id=#{id}
    </update>
    <!--    load user-->
    <select id="loadUser" resultType="User" parameterType="int">
        select * from t_user where id=#{id}
    </select>
    <!--    delete User-->
    <delete id="delUser" parameterType="int">
        delete from t_user where id=#{id}
    </delete>
    <!--    search by page-->
    <!--     select * from t_user order by id desc limit 1,2-->
    <!--    #{ data}: send whatever type through-->
    <!--     ${ data}: send string through-->
    <select id="pageUserList" parameterType="Pager" resultType="User">
        select * from t_user order by ${order} ${sort} limit #{pageOffset} , #{pageSize}
    </select>
</mapper>
           
  • TestMyBatis.java
package com.abc.mybatis.test;
import com.abc.mybatis.model.User;
import com.abc.mybatis.util.MyBatisUtil;
import com.abc.mybatis.util.Pager;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.logging.Logger;
public class TestMyBatis {
    private  Logger log= Logger.getLogger(String.valueOf(TestMyBatis.class));
    @Test
    public void test01() {
//        try {
 /*           //create Mybatis xml inputstream
            InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
            //inputstream creates sqlsessionfactory
            SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
            //get SqlSession*/
//            SqlSession session=factory.openSession();
        //execute
        SqlSession session = MyBatisUtil.getSession();
        long count = session.selectOne("User.getUserCount");
        System.out.println(count);
        Assert.assertEquals(1, count);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        finally{
//            session.close();
//        }
        MyBatisUtil.close(session);
    }
    //getUserList
    @Test
    public void testGetUserList() {
        SqlSession session = null;
        try {
            System.out.println(User.class.getName());
            session = MyBatisUtil.getSession();
            System.out.println(session.getConfiguration());
            System.out.println(session.getConnection());
            // List<User> list=session.selectList(User.class.getName()+".getUserList");
            List<User> list = session.selectList("User.getUserList");
            for (User user : list) {
                System.out.println(user.getUsername() + ";" + user.getEmail());
            }
            log.info("here is the logger");
        } catch (Exception e) {
            //  session.rollback();
            e.printStackTrace();
        } finally {
            MyBatisUtil.close(session);
        }
    }
    //AddUser
    @Test
    public void testAdd() {
        SqlSession session = null;
        try {
            session = MyBatisUtil.getSession();
            User u = new User("ccc", "123", "[email protected]");
            int result = session.insert("User.addUser", u);
            System.out.println(result);
            session.commit();
        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            MyBatisUtil.close(session);
        }
    }
    //update user
    @Test
    public void testUpdateUser() {
        SqlSession session = null;
        try {
            session = MyBatisUtil.getSession();
            //load user
            int id = 2;
            User u = session.selectOne("User.loadUser", id);
            u.setEmail("[email protected]");
            session.update("User.updateUser", u);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        } finally {
            MyBatisUtil.close(session);

        }
    }
    //delete
    @Test
    public void testDel() {
        SqlSession session = null;
        try {
            session = MyBatisUtil.getSession();
            int id = 2;
            session.delete("User.delUser", id);
            session.commit();
        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            MyBatisUtil.close(session);

        }
    }
    //page
    @Test
    public void testPager() {
        SqlSession session = null;
        try {
            session = MyBatisUtil.getSession();
            Pager p=new Pager();
            p.setOrder("id");
            p.setSort("desc");
            p.setPageIndex(2);;
            p.setPageSize(2);
            System.out.println(p.getPageOffset()+";"+p.getPageIndex()+";"+p.getPageSize()+
                    ";"+p.getOrder()+";"+p.getSort());
           List<User> pageList= session.selectList("User.pageUserList",p);
            System.out.println("pageList.size()="+pageList.size());
            for(User user:pageList){
                System.out.println(user.getUsername()+":"+user.getId()+user.getEmail());
            }
            session.commit();

        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            MyBatisUtil.close(session);
        }
    }
}
           
  • Pager.java
package com.abc.mybatis.util;
public class Pager {
    //limit ? ? order by ? ?
    private int pageIndex;
    private int pageOffset;
    private int pageSize;
    private String order;
    private String sort;
    public Pager(){}
    public Pager(int pageIndex, int pageOffset, int pageSize, String order, String sort) {
        this.pageIndex = pageIndex;
        this.pageOffset = pageOffset;
        this.pageSize = pageSize;
        this.order = order;
        this.sort = sort;
    }
    public int getPageIndex() {
        return pageIndex;
    }
    public void setPageIndex(int pageIndex) {
        this.pageIndex = pageIndex;
    }
    public int getPageOffset() {
       pageOffset=(pageIndex-1)*pageSize;
        return pageOffset;
    }
    public void setPageOffset(int pageOffset) {
        this.pageOffset = pageOffset;
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public String getOrder() {
        return order;
    }
    public void setOrder(String order) {
        this.order = order;
    }
    public String getSort() {
        return sort;
    }
    public void setSort(String sort) {
        this.sort = sort;
    }
}
           
  • log4j.properties
#out destination
log4j.rootLogger= INFO, stdout
#log4j.rootLogger= DEBUG, stdout
log4j.logger.com.fiscal = DEBUG  
log4j.logger.com.system = DEBUG  
#show sql
log4j.logger.com.mybatis = DEBUG  
log4j.logger.com.mybatis.common.jdbc.SimpleDataSource = DEBUG  
log4j.logger.com.mybatis.common.jdbc.ScriptRunner = DEBUG  
log4j.logger.com.mybatis.sqlmap.engine.impl.SqlMapClientDelegate = DEBUG  
log4j.logger.java.sql.Connection = DEBUG  
log4j.logger.java.sql.Statement = DEBUG  
log4j.logger.java.sql.PreparedStatement = DEBUG   
log4j.logger.java.sql.ResultSet = DEBUG
#send out log to controller
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} :%m%n    
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout    
log4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH:mm:ss} :%m%n  
log4j.appender.fileout=org.apache.log4j.RollingFileAppender
log4j.appender.fileout.File=D:/IJ/log/mybatis.log
log4j.appender.fileout.MaxFileSize=10000KB
#log4j.logger.org=info
           
  • 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>
    <!--    link properties to file-->
    <properties resource="jdbc.properties"/>
<!--    <properties resource="log4j.properties"/>-->
    <!--    aliases-->
    <typeAliases>
        <typeAlias type="com.abc.mybatis.model.User" alias="User"/>
        <typeAlias type="com.abc.mybatis.util.Pager" alias="Pager"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <!--            manager-->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--                datasource attributes-->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/abc/mybatis/model/UserMapper.xml"/>
    </mappers>
</configuration>
           
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
  • mapper: session.getMapper() 1. Mapper class created with same param as in Xxxmapper.xml
    1. Change Xxxmapper.xml namespace into Mapper class name
    1. use session.getMapper(Mapper.class).method
      Spring MVC MyBatis [A]SpringMVC MyBatis
  • FIFO
  • FILO
  • LIFO
  • first/second cache
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • UserMapper.java
package com.abc.mybatis.mapper;
import com.abc.mybatis.model.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserMapper {
    int getUserCount();
    User loadUser(int id);
    public List<User> getUserList();
    @Select("select * from t_user where username=#{username}")
    public List<User> getUser(String username);
}
           
  • Blog.java
package com.abc.mybatis.model;
public class Blog {
    private int id;
    private String titleName;
    private String content;
    private User user;
    public Blog(){
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public Blog(int id, String titleName, String content, User user) {
        this.id = id;
        this.titleName = titleName;
        this.content = content;
        this.user = user;
    }
    @Override
    public String toString() {
        return "Blog{" +
                "id=" + id +
                ", titleName='" + titleName + '\'' +
                ", content='" + content + '\'' +
                ", user=" + user +
                '}';
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public void setTitleName(String titleName) {
        this.titleName = titleName;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String getTitleName() {
        return titleName;
    }
}
           
  • BlogMapper.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="com.abc.mybatis.model.Blog">
    <!--    getBlog list-->
    <select id="getBlogList" resultType="Blog">
select id,title as titleName, content from t_blog
</select>
    <!--    getMap-->
    <select id="resultMapList" resultMap="blogMap">
        select b.id,  title, content, u.id as uid,  username, password, email
        from t_blog b, t_user u
        where b.user_id=u.id
    </select>
    <resultMap id="blogMap" type="Blog">
        <id property="id" column="id"/>
        <result property="titleName" column="title"/>
        <result property="content" column="content"/>
        <association property="user" javaType="User">
            <id property="id" column="uid"/>
            <result property="username" column="username"/>
            <result property="password" column="password"/>
            <result property="email" column="email"/>
        </association>
    </resultMap>
    <!--    addBlog-->
<insert id="addBlog" parameterType="Blog">
insert into t_blog(title,content, user_id)
values(#{titleName},#{content},#{user.id})
</insert>
</mapper>
           
  • User.java
package com.abc.mybatis.model;
import java.util.Set;
public class User {
    private int id;
    private String username;
    private String password;
    private String email;
    private Set<Blog> blogs;
    public User(int id, String username, String password, String email, Set<Blog> blogs) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
        this.blogs = blogs;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                ", blogs=" + blogs +
                '}';
    }
    public User() {
    }
    public User(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }
    public Set<Blog> getBlogs() {
        return blogs;
    }
    public void setBlogs(Set<Blog> blogs) {
        this.blogs = blogs;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}
           
  • 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">
<!--<mapper namespace="com.abc.mybatis.model.User">-->
<!--<mapper namespace="com.abc.mybatis.mapper.UserMapper" >-->
<mapper namespace="User">
    <!-- enable the second level cache under the namespace of this mapper
    Type: Specifies the type of the implementation class of the cache interface. Mybatis uses perpetual cache by default
    To integrate with ehcache, you need to configure ehcache as the type of cache interface -->
    <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
    <!--    count-->
    <select id="getUserCount" resultType="int">
        select count(id) from t_user
  </select>
    <!--    select all from user-->
    <!--    <select id="getUserList" resultType="com.abc.mybatis.model.User">-->
    <!--   use alias-->
    <select id="getUserList" resultType="User" parameterType="User" useCache="true">
        select * from t_user
    </select>
    <!--    conditional-->
    <!--    select * from t_user where username like '%%' or 1=1 -->
    <!--    select * from t_user where username like concat( '%c%'  )-->
    <!--                    select * from t_user where username like concat ('%',{#username},'%')-->
    <select id="getUserListConditional" resultType="User" parameterType="User">
        select * from t_user
        <where>
            <!--            <if test="_parameter!=null">-->
            <if test="username!=null">
                <!-- use and infront of statement-->
                and username like concat('%',#{username},'%')
            </if>
            <if test="id!=0">
                and id=#{id}
            </if>
        </where>
        <!--  -->
        <!--                    select * from t_user where-->
        <!--        <choose>-->
        <!--            <when test="username!=null">-->
        <!--                username like concat('%',#{username},'%')-->
        <!--            </when>-->
        <!--            <when test="id!=0">-->
        <!--                and id=#{id}-->
        <!--            </when>-->
        <!--            <otherwise></otherwise>-->
        <!--        </choose>-->
    </select>
    <!--    new user-->
    <insert id="addUser" parameterType="User">
        insert into t_user(username, password,email)
        values(#{username},#{password},#{email})
    </insert>
    <!--   batch new user-->
    <insert id="batchAddUser" >
        insert into t_user(username,password,email) values
        <foreach collection="list" item="item" separator=",">
           (#{item.username},#{item.password},#{item.email})
        </foreach>
    </insert>
    <!--    update user-->
    <update id="updateUser" parameterType="User">
        <!--  update t_user set username=#{username},password=#{password},email=#{email}-->
        update t_user
        <set>
            <if test="username!=null">username=#{username},</if>
            <if test="password!=null">password=#{password},</if>
            <if test="email!=null">email=#{email},</if>
        </set>
        where id=#{id}
    </update>
    <!--    load user-->
    <select id="loadUser" resultType="User" parameterType="int">
        select * from t_user where id=#{id}
    </select>
    <!--    delete User-->
    <delete id="delUser" parameterType="int">
        delete from t_user where id=#{id}
    </delete>
    <!--    search by page-->
    <!--     select * from t_user order by id desc limit 1,2-->
    <!--    #{ data}: send whatever type through-->
    <!--     ${ data}: send string through-->
    <select id="pageUserList" parameterType="Pager" resultType="User">
        select * from t_user order by ${order} ${sort} limit #{pageOffset} , #{pageSize}
    </select>
    <select id="resultMapList" resultMap="userMap">
        select u.id uid, username, password, email,b.id, title, content
        from t_user u, t_blog b where u.id=b.user_id
    </select>
    <resultMap id="userMap" type="User">
        <id property="id" column="uid"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <result property="email" column="email"/>
        <collection property="blogs" ofType="Blog">
            <id property="id" column="id"/>
            <result property="titleName" column="title"/>
            <result property="content" column="content"/>
            <association property="user" javaType="User">
                <id property="id" column="uid"/>
                <result property="username" column="username"/>
                <result property="password" column="password"/>
                <result property="email" column="email"/>
            </association>
        </collection>
    </resultMap>
</mapper>
           
  • TestBlogMapper.java
package com.abc.mybatis.test;
import com.abc.mybatis.model.Blog;
import com.abc.mybatis.model.User;
import com.abc.mybatis.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class TestBlogMapper {
    @Test
    public void testBlogList() {
        SqlSession session = null;
        try {
            System.out.println(Blog.class.getName());
            session = MyBatisUtil.getSession();
            System.out.println(session.getConfiguration());
            System.out.println(session.getConnection());
            List<Blog> list = session.selectList(Blog.class.getName()+".getBlogList");
            for (Blog blog : list) {
                System.out.println(blog.getId() + ":" + blog.getTitleName() + ":" + blog.getContent());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            MyBatisUtil.close(session);
        }
    }
    @Test
    public void testBlogMapList() {
        SqlSession session = null;
        try {
            session = MyBatisUtil.getSession();
            List<Blog> list = session.selectList(Blog.class.getName()+".resultMapList");
            for (Blog blog : list) {
                System.out.println(blog.getId() + ":" + blog.getTitleName() + ":" + blog.getContent());
                System.out.println(blog.getUser().getId()+ ":" + blog.getUser().getUsername()+ ":" + blog.getUser().getEmail());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            MyBatisUtil.close(session);
        }
    }
    @Test
    public void testBlogAdd() {
        SqlSession session = null;
        try {
            session = MyBatisUtil.getSession();
            Blog blog=new Blog();
            blog.setTitleName("Title New");
            blog.setContent("New Content");
           User user= session.selectOne("User.loadUser",1);
            blog.setUser(user);
            session.insert(Blog.class.getName()+".addBlog",blog);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        } finally {
            MyBatisUtil.close(session);
        }
    }
}
           
  • TestMyBatis.java
package com.abc.mybatis.test;
import com.abc.mybatis.model.User;
import com.abc.mybatis.util.MyBatisUtil;
import com.abc.mybatis.util.Pager;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.logging.Logger;
public class TestMyBatis {
    private Logger log = Logger.getLogger(String.valueOf(TestMyBatis.class));
    @Test
    public void test01() {
//        try {
 /*           //create Mybatis xml inputstream
            InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
            //inputstream creates sqlsessionfactory
            SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
            //get SqlSession*/
//            SqlSession session=factory.openSession();
        //execute
        SqlSession session = MyBatisUtil.getSession();
        int count = session.selectOne("User.getUserCount");
        System.out.println(count);
        Assert.assertEquals(1, count);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        finally{
//            session.close();
//        }
        MyBatisUtil.close(session);
    }
    //getUserList
    @Test
    public void testGetUserList() {
        SqlSession session = null;
        SqlSession session2 = null;
        try {
            System.out.println(User.class.getName());
            session = MyBatisUtil.getSession();
            session2 = MyBatisUtil.getSession();
            System.out.println(session.getConfiguration());
            System.out.println(session.getConnection());
            System.out.println(session2.getConfiguration());
            System.out.println(session2.getConnection());
            // List<User> list=session.selectList(User.class.getName()+".getUserList");
            List<User> list = session.selectList("User.getUserList");
            for (User user : list) {
                System.out.println(user.getUsername() + ";" + user.getEmail());
            }
            session.commit();
            List<User> list2 = session2.selectList("User.getUserList");
            for (User user : list2) {
                System.out.println(user.getUsername() + ";" + user.getEmail());
            }
            session2.commit();
            log.info("here is the logger");
        } catch (Exception e) {
            //  session.rollback();
            e.printStackTrace();
        } finally {
            MyBatisUtil.close(session);
            MyBatisUtil.close(session2);
        }
    }
    //AddUser
    @Test
    public void testAdd() {
        SqlSession session = null;
        try {
            session = MyBatisUtil.getSession();
            User u = new User("ccc", "123", "[email protected]");
            int result = session.insert("User.addUser", u);
            System.out.println(result);
            session.commit();
        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            MyBatisUtil.close(session);
        }
    }
    //update user
    @Test
    public void testUpdateUser() {
        SqlSession session = null;
        try {
            session = MyBatisUtil.getSession();
            //load user
            int id = 3;
            User u = session.selectOne("User.loadUser", id);
            u.setUsername("admin");
            u.setPassword("12345");
            u.setEmail("[email protected]");
            session.update("User.updateUser", u);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        } finally {
            MyBatisUtil.close(session);

        }
    }
    //delete
    @Test
    public void testDel() {
        SqlSession session = null;
        try {
            session = MyBatisUtil.getSession();
            int id = 2;
            session.delete("User.delUser", id);
            session.commit();
        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            MyBatisUtil.close(session);

        }
    }
    //page
    @Test
    public void testPager() {
        SqlSession session = null;
        try {
            session = MyBatisUtil.getSession();
            Pager p = new Pager();
            p.setOrder("id");
            p.setSort("desc");
            p.setPageIndex(5);
            ;
            p.setPageSize(2);
            System.out.println(p.getPageOffset() + ";" + p.getPageIndex() + ";" + p.getPageSize() +
                    ";" + p.getOrder() + ";" + p.getSort());
            List<User> pageList = session.selectList("User.pageUserList", p);
            System.out.println("pageList.size()=" + pageList.size());
            for (User user : pageList) {
                System.out.println(user.getUsername() + ":" + user.getId() + user.getEmail());
            }
            session.commit();

        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            MyBatisUtil.close(session);
        }
    }
}
           
  • TestUserMapper.java
package com.abc.mybatis.test;
import com.abc.mybatis.mapper.UserMapper;
import com.abc.mybatis.model.User;
import com.abc.mybatis.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class TestUserMapper {
    //getMapUser
    @Test
    public void testMapUser() {
        SqlSession session = null;
        try {
            session = MyBatisUtil.getSession();
            List<User> list = session.selectList("User.resultMapList");
            for (User user : list) {
                System.out.println(user);
            }
        } catch (Exception e) {
            //  session.rollback();
            e.printStackTrace();
        } finally {
            MyBatisUtil.close(session);
        }
    }
    //conditional select
    @Test
    public void testUserCondition() {
        SqlSession session = null;
        try {
            session = MyBatisUtil.getSession();
//            String username="%c%";
            User u = new User();
            u.setId(1);
            u.setUsername("c");
            List<User> list = session.selectList("User.getUserListConditional", u);
            for (User user : list) {
                System.out.println(user);
            }
        } catch (Exception e) {
            //  session.rollback();
            e.printStackTrace();
        } finally {
            MyBatisUtil.close(session);
        }
    }
    //update user
    @Test
    public void testUpdateUserMapper() {
        SqlSession session = null;
        try {
            session = MyBatisUtil.getSession();
            //load user
            int id = 4;
            User u = session.selectOne("User.loadUser", id);
            u.setUsername("admin");
            u.setPassword("12345");
            u.setEmail("[email protected]");
            session.update("User.updateUser", u);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        } finally {
            MyBatisUtil.close(session);

        }
    }
    //AddUser
    @Test
    public void testBatchAdd() {
        SqlSession session = null;
        try {
            session = MyBatisUtil.getSession();
            List<User> users = new ArrayList<>();
            User u1 = new User("fff", "333", "[email protected]");
            User u2 = new User("fff2", "333", "[email protected]");
            User u3 = new User("fff3", "333", "[email protected]");
            users.add(u1);
            users.add(u2);
            users.add(u3);
            System.out.println(users);
            int result = session.insert("User.batchAddUser", users);
            System.out.println(result);
            session.commit();
        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            MyBatisUtil.close(session);
        }
    }
    //<!--<mapper namespace="com.abc.mybatis.mapper.UserMapper" >--> turn on
@Test
    public void testGetUserCountByMapper(){
    SqlSession session = null;
    try {
        session = MyBatisUtil.getSession();
        int count= session.getMapper(UserMapper.class).getUserCount();
        System.out.println(count);
    } catch (Exception e) {
        //  session.rollback();
        e.printStackTrace();
    } finally {
        MyBatisUtil.close(session);
    }
}
    //<!--<mapper namespace="com.abc.mybatis.mapper.UserMapper" >--> turn on
    //getUser
    @Test
    public void testGetUser() {
        SqlSession session = null;
        try {
            session = MyBatisUtil.getSession();
            String n="ccc";
            List<User> list= (List<User>) session.getMapper(UserMapper.class).getUser(n);
            for (User user : list) {
                System.out.println(user);
            }
        } catch (Exception e) {
            //  session.rollback();
            e.printStackTrace();
        } finally {
            MyBatisUtil.close(session);
        }
    }
}
           

SpringMVC MyBatis 3: Maven

  • maven
  • refer to Maven blog for more installation steps (environment setup)
D:\Program Files\apache-maven-3.8.1\bin>mvn -v
Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d)
Maven home: D:\Program Files\apache-maven-3.8.1\bin\..
Java version: 1.8.0_112, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8
.0_112\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 8", version: "6.2", arch: "amd64", family: "windows"
D:\Program Files\apache-maven-3.6.3\bin>java -version
java version "9"
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
           
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
  • spring context
  • Spring Core
  • Spring Beans
  • Spring aop
  • Spring Expression Language (SpEL)
  • commons logging
  • spring transaction
  • spring web
  • spring web mvc
  • spring orm
  • spring context support
  • … see list…image
  • Idea: view> tools> maven
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
    1. Spring + Spring MVC + Hibernate
    1. Spring + Spring MVC + Mybatis
    1. Maven
    1. Git
    1. download maven
    1. Maven (idea) deployment, edit setting.xml D:\rep pom.xml
  • GroupId: package > com.abc.ssh
  • ArtifactId: module> ssh
  • Version: 0.0.1
  • Web: springMVC
  • Service:spring ioc aop
  • Dao:spring jdbcTemplate
  • Maven Structure
  • src
  • -main
  • –java: source
  • –resource: (jdbc.properties/spring.xml/mybatis-config.xml etc)
  • dependencies http://mvnrepository.com
  • c3po: druid:dbcp
  • Aspect Oriented Progamming (map: field> surface >point programming)
  • Joinpoint; Pointcut; Advice; Introduction; Target, Weaving, Proxy , Aspect
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • ssh: sping spring mvc hibernate
  • NOT SSH, also known as Secure Shell or Secure Socket Shell, is a network protocol that gives users, particularly system administrators, a secure way to access a computer over an unsecured network. Symmetrical encryption; Asymmetrical encryption; Hashing.
  • ERROR: org.springframework.beans.factory.BeanInitializationException: Invalid key ‘url’: expected ‘beanName.property’
  • solve:
  • jdbc.properties
dataSource.driver = com.mysql.cj.jdbc.Driver
dataSource.url = jdbc:mysql://localhost:3306/empmgr_db
dataSource.username = root
dataSource.password = 12345
           
  • spring.xml
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <!--        driver-->
        <property name="driverClassName" value="${dataSource.driverClassName}"/>
        <property name="url" value="${dataSource.url}"/>
        <property name="username" value="${dataSource.username}"/>
        <property name="password" value="${dataSource.password}"/>
        ...
     </bean>
           
  • ERROR: Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
  • solve: add to pom
  • pom.xml
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.6</version>
</dependency>
           
  • ERROR org.springframework.web.context.ContextLoader.initWebApplicationContext Context initialization failed

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘userController’: Injection of resource dependencies failed;…;…Error creating bean with name ‘dataSource’ defined in class path resource [spring.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property ‘driver’ of bean class [org.apache.commons.dbcp.BasicDataSource]: Bean property ‘driver’ is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

  • spring.xml
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${dataSource.driverClassName}"/>
    </bean>
           
Spring MVC MyBatis [A]SpringMVC MyBatis
  • ssh: spring spring mvc hibernate
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • UserController.java
package com.abc.ssh.controller;
import com.abc.ssh.model.User;
import com.abc.ssh.service.IUserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import java.util.List;
@Controller
@RequestMapping("/page/user")
public class UserController {
    private IUserService userService;
    @Resource
    public void setUserService(IUserService userService){
        System.out.println(" @Resource:UserController.setUserService");
        System.out.println("@Resource:UserController.setUserService:"+userService.toString());
        this.userService=userService;
    }
    @RequestMapping("/list")
    public String list(Model model){
        System.out.println("@RequestMapping:UserController.list No json");
        List<User> users= userService.list();
        model.addAttribute("users",users);
        return "list";
    }
    @RequestMapping(value="/list", method = RequestMethod.GET, params="json")
    @ResponseBody
    public List<User> list(Model model, String param){
        System.out.println("@RequestMapping:UserController.list json");
        List<User> users= userService.list();
        model.addAttribute("users",users);
        return users;
    }
}
           
  • IUserDao.java
package com.abc.ssh.dao;
import com.abc.ssh.model.User;
import java.util.List;
public interface IUserDao  {
    List<User> list();
}
           
  • UserDao.java
package com.abc.ssh.dao;
import com.abc.ssh.model.User;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import java.util.List;
@Repository
public class UserDao extends HibernateDaoSupport implements IUserDao {
    @Resource(name = "sessionFactory")
    public void setSuperSessionFactory(SessionFactory sessionFactory) {
        System.out.println("@Resource:UserDao.setSuperSessionFactory");
        System.out.println("@Resource:UserDao.setSuperSessionFactory: sessionFactory:"+sessionFactory.toString());
        super.setSessionFactory(sessionFactory);
    }
    @Override
    public List<User> list() {
        System.out.println("@Override:UserDao.list");
        DetachedCriteria criteria = DetachedCriteria.forClass(User.class);
        return (List<User>) this.getHibernateTemplate().findByCriteria(criteria);
    }
}
           
  • User.java
package com.abc.ssh.model;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "t_emp")
public class User {
    private int id;
    private String username;
    public User() {
    }
    public User(int id, String username) {
        this.id = id;
        this.username = username;
        System.out.println("created User");
    }
    @Id
    @GeneratedValue(generator = "increment")
    @GenericGenerator(strategy = "increment", name = "increment")
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
}
           
  • IUserService.java
package com.abc.ssh.service;
import com.abc.ssh.model.User;
import java.util.List;
public interface IUserService {
    List<User> list();
}
           
  • UserService.java
package com.abc.ssh.service;
import com.abc.ssh.dao.IUserDao;
import com.abc.ssh.model.User;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class UserService implements IUserService{
    private IUserDao userDao;
    @Resource
    public void setUserDao(IUserDao userDao) {
        System.out.println("@Resource:UserService.setUserDao");
        System.out.println("@Resource:UserService.setUserDao: userDao: "+userDao.toString());
        this.userDao = userDao;
    }
    @Override
    public List<User> list() {
        System.out.println("@Override:UserService.list");
        return userDao.list();
    }
}
           
  • jdbc.properties
dataSource.driverClassName = com.mysql.cj.jdbc.Driver
dataSource.url = jdbc:mysql://localhost:3306/empmgr_db
dataSource.username = root
dataSource.password = 12345
           
  • spring.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:aop="http://www.springframework.org/schema/aop"
       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.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.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!--  spring-->
    <context:annotation-config/>
    <!-- spring package-->
    <context:component-scan base-package="com.abc.ssh"/>
    <!-- aop Aspect Oriented Programming-->
    <bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
        <property name="locations" value="classpath*:jdbc.properties"/>
    </bean>
    <!--    datasource-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <!--        driver-->
        <property name="driverClassName" value="${dataSource.driverClassName}"/>
        <property name="url" value="${dataSource.url}"/>
        <property name="username" value="${dataSource.username}"/>
        <property name="password" value="${dataSource.password}"/>
        <property name="maxIdle" value="40"/>
        <property name="minIdle" value="1"/>
        <property name="initialSize" value="1"/>
        <property name="maxWait" value="60"/>
    </bean>
    <!--    sessionFactory-->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <!--          Session factory-->
        <property name="dataSource" ref="dataSource"/>
        <!--        hibernate-->
        <property name="packagesToScan">
            <list>
                <!--   package path-->
                <value>com.abc.ssh.model</value>
            </list>
        </property>
        <!--        Hibernate properties-->
        <property name="hibernateProperties">
            <!--        Properties-->
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>
    <!--spring aop-->
    <bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <!--  aop  surface-->
    <aop:config>
        <!--        point-->
        <aop:pointcut id="allMethods" expression="execution(* com.abc.ssh.dao.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods"/>
    </aop:config>
    <!--    txAdvice-->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="del*" propagation="REQUIRED"/>
            <tx:method name="*" read-only="true"/>
        </tx:attributes>
    </tx:advice>
</beans>
           
  • list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>!Hello List World!</h2>
</body>
</html>
           
  • spring-servlet.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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       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-3.0.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
    <!--    controller-->
    <context:component-scan base-package="com.abc.ssh"/>
    <!-- Spring MVC -->
    <mvc:annotation-driven/>
    <!--process static files-->
    <!--    * one star per folder level-->
    <mvc:resources mapping="/resources/*" location="/"/>
    <!--               servlet mapping-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="1024000000"/>
    </bean>
</beans>
           
  • web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--    -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!--    add spring.xml-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/spring.xml</param-value>
    </context-param>
    <!---->
    <filter>
        <filter-name>CharacterEncodingFilter</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>
        <filter-name>osiv</filter-name>
        <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <!--    -->
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>osiv</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!---->
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <!--    -->
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

           
  • index.jsp
<html>
<body>
<h2>!Hello World!</h2>
</body>
</html>
           
  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.abc.ssh</groupId>
    <artifactId>ssh</artifactId>
    <version>0.0.1</version>
    <packaging>war</packaging>
    <name>ssh Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc-portlet</artifactId>
            <version>4.3.30.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>
        <!--    database-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version>
        </dependency>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.30.Final</version>
        </dependency>
        <!--    json-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.12.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.12.3</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>ssh</finalName>
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>
           
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
  • or…
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • output
@Resource:UserDao.setSuperSessionFactory
@Resource:UserDao.setSuperSessionFactory: sessionFactory:[email protected]
@Resource:UserService.setUserDao
@Resource:UserService.setUserDao: userDao: [email protected]
@Resource:UserController.setUserService
@Resource:UserController.setUserService:[email protected]
@RequestMapping:UserController.list json
@Override:UserService.list
@Override:UserDao.list
Hibernate: select this_.id as id1_0_0_, this_.username as username2_0_0_ from t_emp this_
           

SpringMVC MyBatis 4: SpringMVC ORM

  • Spring + Spring MVC + Mybatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
  • classpath: class; classpath*: class, jar
  • map xml : < mapper resource=“sqlmap/UserMapper.xml”/>
  • map class: < mapper class=“com.mo.mapper.UserMapper”/>
  • map package: < package name=“com.mo.mapper”/>
  • Error : Error creating bean with name ‘sqlSessionFactory’ defined in class path resource [spring.xml]: Invocation of init method failed; nested exception is java.io.FileNotFoundException: class path resource [classpath*:mybatis-config.xml] cannot be opened because it does not exist
  • solve:
  • spring.xml
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="mybatis-config.xml"/>
    </bean>
           
  • Error : Error creating bean with name ‘sqlSessionFactory’ defined in class path resource [spring.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse config resource: class path resource [mybatis-config.xml]; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource /com/abc/ssm/mapper/UserMapper.xml
  • solve: mapper folder in java folder
  • add to pom.xml ( BETTER but maybe not as fast)
<!--recources-->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <!--src/main/java .xml files-->
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <!--src/main/resources-->
                    <include>**/*</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
           
  • mybatis-config.xml
<mappers>
        <mapper resource="com/abc/ssm/mapper/UserMapper.xml"/>
    </mappers>
           
  • !!!or put mapper folder under resources
  • spring.xml add
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="/mapper/UserMapper.xml" />
    </bean>
           
  • mybatis-config.xml delete
<mappers>
        <mapper resource="/resources/mapper/UserMapper.xml"/>
    </mappers>
           
  • ERROR : Error querying database. Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.abc.ssm.model.User. Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.abc.ssm.model.User
  • solve:
  • TestSSm.java
  • UserMapper.xml
<mapper namespace="com.abc.ssm.model.User">
    <select id="getUserList" resultType="User" parameterType="User" useCache="true">
        select * from t_emp
    </select>
</mapper>
           
  • maven default does not put static source files into packaged maven (.war)
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • Error: address in use
C:\Users\Administrator>netstat -ano|findstr "1099"
  TCP    0.0.0.0:1099           0.0.0.0:0              LISTENING       11392
  TCP    [::]:1099              [::]:0                 LISTENING       11392
C:\Users\Administrator>taskkill /f -pid 11392
成功: 已終止 PID 為 11392 的程序。
           
  • Error: Injection of resource dependencies failed; nested exception is org.springframework.beans.factory
  • add to spring.xml
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.abc.ssm.mapper"/>
    </bean>
           
  • ssm2
    Spring MVC MyBatis [A]SpringMVC MyBatis
  • UserController.java
package com.abc.ssm.controller;
import com.abc.ssm.model.User;
import com.abc.ssm.service.IUserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import java.util.List;
@Controller
@RequestMapping("/page/user")
public class UserController {
    private IUserService userService;
    @Resource
    public void setUserService(IUserService userService) {
        this.userService = userService;
    }
    @RequestMapping(value = "/list",  params = "json")
    @ResponseBody
    public List<User> list(Model model, String param) {
        System.out.println("@RequestMapping:UserController.list json");
        List<User> users = userService.findUsers();
        model.addAttribute("users", users);
        return users;
    }
}
           
  • IUserDao.java
package com.abc.ssm.dao;
import com.abc.ssm.model.User;
import java.util.List;
public interface IUserDao {
    public List<User> getUserList();
}
           
  • UserDao.java
package com.abc.ssm.dao;
import com.abc.ssm.mapper.UserMapper;
import com.abc.ssm.model.User;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import java.util.List;
@Repository
public class UserDao implements IUserDao{
    private UserMapper userMapper;
    @Resource
    public void setUserMapper(UserMapper userMapper) {
        System.out.println("@Resource:UserDao.setUserMapper:"+userMapper.toString());
        this.userMapper = userMapper;
    }
    @Override
    public List<User> getUserList() {
        System.out.println("@Override:UserDao.list");
        return userMapper.getUserList();
    }
}
           
  • UserMapper.java
package com.abc.ssm.mapper;
import com.abc.ssm.model.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
public interface UserMapper {
    public List<User> getUserList();
}
           
  • 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">
<mapper namespace="com.abc.ssm.mapper.UserMapper">
    <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
    <!--    select all from user-->
    <!--   use alias-->
    <select id="getUserList" resultType="User" parameterType="User" useCache="true">
        select * from t_emp
    </select>
</mapper>
           
  • User.java
package com.abc.ssm.model;
public class User {
    private int id;
    private String username;
public User(){}
    public User(int id, String username) {
        this.id = id;
        this.username = username;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                '}';
    }
}
           
  • IUserService.java
package com.abc.ssm.service;
import com.abc.ssm.model.User;
import java.util.List;
public interface
IUserService {
    public List<User> findUsers();
}
           
  • UserService.java
package com.abc.ssm.service;
import com.abc.ssm.dao.IUserDao;
import com.abc.ssm.model.User;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class UserService implements IUserService{
    private IUserDao userDao;
    @Resource
    public void setUserDao(IUserDao userDao) {
        this.userDao = userDao;
    }
    @Override
    public List<User> findUsers() {
        return userDao.getUserList();
    }
}
           
  • TestSSM.java
package com.abc.ssm.test;
import com.abc.ssm.model.User;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import javax.annotation.Resource;
import java.util.List;
public class TestSSM {
    private SqlSessionTemplate sqlSessionTemplate;
    @Resource
    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }
    //test01 runs when spring.xml set to
//        <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
//            <constructor-arg index="0" ref="sqlSessionFactory"/>
//        </bean>
    @Test
    public void test01() {
        BeanFactory factory = new ClassPathXmlApplicationContext("spring.xml");
        sqlSessionTemplate = factory.getBean("sqlSessionTemplate", SqlSessionTemplate.class);
        List<User> list = sqlSessionTemplate.selectList("com.abc.ssm.mapper.UserMapper.getUserList");
        System.out.println(list);
    }
}
           
  • jdbc.properties
dataSource.driverClassName = com.mysql.cj.jdbc.Driver
dataSource.url = jdbc:mysql://localhost:3306/empmgr_db
dataSource.username = root
dataSource.password = 12345
           
  • mybatis-config.xml
<configuration>
    <!--mapper-->
    <mappers>
        <mapper resource="com/abc/ssm/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
           
  • spring.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:aop="http://www.springframework.org/schema/aop"
       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.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.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!--application context-->
    <!--  spring-->
    <context:annotation-config/>
    <!-- spring package @Service @Controller-->
    <context:component-scan base-package="com.abc.ssm"/>
    <!-- aop Aspect Oriented Programming-->
    <bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
        <property name="locations" value="classpath*:jdbc.properties"/>
    </bean>
    <!--    datasource-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <!--        driver-->
        <property name="driverClassName" value="${dataSource.driverClassName}"/>
        <property name="url" value="${dataSource.url}"/>
        <property name="username" value="${dataSource.username}"/>
        <property name="password" value="${dataSource.password}"/>
        <property name="maxIdle" value="40"/>
        <property name="minIdle" value="1"/>
        <property name="initialSize" value="1"/>
        <property name="maxWait" value="60"/>
    </bean>
    <!--    sessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--          Session factory-->
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="typeAliasesPackage" value="com.abc.ssm.model"/>
    </bean>
    <!--        mapper must refer to an Interface-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.abc.ssm.mapper"/>
    </bean>
    <!--             sqlsessionFactory @Test-->
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>
    <!--    <bean class="org.mybatis.spring.mapper.MapperFactoryBean">-->
    <!--        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>-->
    <!--    </bean>-->
    <!--spring aop-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--  aop  field-->
    <aop:config>
        <!--        point-->
        <aop:pointcut id="allMethods" expression="execution(* com.abc.ssm.dao.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods"/>
    </aop:config>
    <!--    txAdvice-->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="del*" propagation="REQUIRED"/>
            <tx:method name="*" read-only="true"/>
        </tx:attributes>
    </tx:advice>
</beans>
           
  • list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>!Hello List World!</h2>
</body>
</html>
           
  • spring-servlet.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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       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-3.0.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
    <!--    controller-->
    <context:component-scan base-package="com.abc.ssm"/>
    <!-- Spring MVC -->
    <mvc:annotation-driven/>
    <!--process static files-->
    <!--    * one star per folder level-->
    <mvc:resources mapping="/resources/*" location="/"/>
    <!--               servlet mapping-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="1024000000"/>
    </bean>
</beans>
           
  • web.xml
<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
  <!--    -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!--    add spring.xml-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/spring.xml</param-value>
  </context-param>
  <!---->
  <filter>
    <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!---->
  <servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <!--    -->
  <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>
           
  • index.jsp
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
           
  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.abc</groupId>
  <artifactId>ssm2</artifactId>
  <version>0.0.1</version>
  <packaging>war</packaging>
  <name>ssm2 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.6</version>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.5</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.3.5</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.3.5</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.5</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>5.3.5</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>5.3.5</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>5.3.5</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc-portlet</artifactId>
      <version>4.3.30.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>
    <!--    database-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.23</version>
    </dependency>
    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.4</version>
    </dependency>
    <!-- mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.6</version>
    </dependency>
    <!--    json-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.12.3</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.12.1</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.12.3</version>
    </dependency>
<!--    junit-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>RELEASE</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
  <build>
    <!--resources-->
      <resources>
        <resource>
          <directory>src/main/java/</directory>
          <!--   .xml-->
<!--          <includes>-->
<!--            <include>**/*.xml</include>-->
<!--          </includes>-->
        </resource>
        <resource>
          <directory>src/main/resources</directory>
          <includes>
            <!--src/main/resources   other files-->
            <include>**/*</include>
          </includes>
          <filtering>false</filtering>
        </resource>
      </resources>
    <finalName>ssm2</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>
           
  • result:
    Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
Spring MVC MyBatis [A]SpringMVC MyBatis
  • OSIV: OSIV tackles this problem by ensuring that the Hibernate session is kept open all the way up to the rendering of the view - hence the name of the pattern. When the view rendering starts, the transaction manager will then check if there is already an entity manager binded to the thread, and if so use it instead of creating a new one. The end result is that the same entity manager used to commit the business transaction was kept around in the request thread, allowing the view rendering code to lazy load the needed data.
  • ssh
    1. pom.xml: add dependencies
    1. spring.xml: spring context, hibernate: datasource, put datasource into SessionFactory, put sessionFactory into session, find mapper in sessionFactory
    1. spring-servlet.xml: springMVC context, view parse < bean class=“org.springframework.web.servlet.view.InternalResourceViewResolver”>
    1. web.xml: add spring.xml context-param, filter, OSIV, servlet, listener
  • ssm
    1. pom.xml: no deed for hibernate
    1. spring.xml: spring context, hibernate: datasource, put datasource into SessionFactory, put sessionFactory into session, find mapper in sessionFactory: add alias < property name=“typeAliasesPackage” value=“com.abc.ssm.model”/>
    1. spring-servlet.xml: same as ssh remove alias
    1. web.xml: same as ssh, no OSIV
  • packaging: war
  • add
<resources>
        <resource>
          <directory>src/main/java/</directory>
        </resource>
        <resource>
          <directory>src/main/resources</directory>
          <includes>
            <!--src/main/resources   other files-->
            <include>**/*</include>
          </includes>
          <filtering>false</filtering>
        </resource>
      </resources>
           

繼續閱讀