通过SpringMVC和Mybatis的入门简单学习,我们可以自然而然的想到既然SpringMVC控制页面显示和控制流程,Mybatis可以存取数据库的数据,那么为什么不把两者结合各司其职。只要通过简单的堆积把业务接口方法的调用放在controller方法中,并且将获得的数据显示到相应的jsp上,不就能轻易实现两者的结合而不会产生功能的累余或者冲突吗。
下面就设置一个合适需求:通过界面的学号输入返回该生所有信息
实现思路:简单的jsp表单界面获得学号,controller获得学号后调用mapper接口通过sql映射获得学生信息之后在界面中显示
1、新建web项目,首先完成springMVC的搭建。主要有controller类的编写、web.xml、[servlet-name]-servlet.xml的配置和jsp界面,当然还有spring的支持jar包,也可以直接部署spring完成导包。
controller:
package com.controller;
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.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.mapper.InterStudentMapper;
import com.mapper.StudentMapperImpl;
import com.model.Student;
@Controller
//@RequestMapping("/jsp")
public class ServiceController {
@RequestMapping(value="/index",method=RequestMethod.GET)
public String showIndex(){
return "index";
}
@RequestMapping(value="/show",method=RequestMethod.POST)
public String getOneStudent(@RequestParam("sno")int sno){
System.out.println(sno);
return "show";
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>spingMVC_mybatis</display-name>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- <load-on-startup>1</load-on-startup> -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
<context:component-scan base-package="com.controller"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<form:form action="/springMVC_mybatis/show" method="post">
<label>请输入学号</label>
<input name="sno"/>
<input type="submit" value="submit"/>
</form:form>
</body>
</html>
到这里就可以输入http://localhost:8080/项目名/index测试一下springMVC是否部署正确
show.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<table>
<h3>Student info</h3>
<tr>
<td>sno:</td><td>${sno}</td>
</tr>
<tr>
<td>sname:</td><td>${sname}</td>
</tr>
<tr>
<td>score:</td><td>${score}</td>
</tr>
</table>
</body>
</html>
springMVC到此编写完成
2、在此基础上完成Mybatis的添加。这里需要注意的是不同于单独的mybatis工程,web项目lib目录下需要把mybatis、jdbc包导入不然会报错。完整的项目结构如下:
Student实体类
package com.model;
public class Student {
private int sno;
private String sname;
private double score;
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
@Override
public String toString() {
return "Student [sno=" + sno + ", sname=" + sname + ", score=" + score + "]";
}
}
mybatis.cfg.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="mysql.properties"/>
<environments default="devel">
<environment id="devel">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mapper/StudentMapper.xml"/>
</mappers>
</configuration>
mapper接口方法类、实现类、StudentMapper.xml配置
package com.mapper;
import com.model.Student;
public interface InterStudentMapper {
public Student getStudentBySno(int sno);
}
package com.mapper;
import org.apache.ibatis.session.SqlSession;
import com.model.Student;
import com.tool.DBtool;
public class StudentMapperImpl implements InterStudentMapper {
@Override
public Student getStudentBySno(int sno) {
SqlSession sqlSession=DBtool.getSqlSession();
InterStudentMapper mapper=sqlSession.getMapper(InterStudentMapper.class);
Student stu=mapper.getStudentBySno(sno);
sqlSession.commit();
sqlSession.close();
return stu;
}
}
<?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.mapper.InterStudentMapper">
<select id="getStudentBySno" parameterType="int" resultType="com.model.Student">
select * from student where sno=#{sno}
</select>
</mapper>
数据库连接的工具类
package com.tool;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class DBtool {
private static SqlSessionFactory sqlSessionFactoty;
static{
try {
Reader reader=Resources.getResourceAsReader("mybatis.cfg.xml");
sqlSessionFactoty=new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactoty.openSession();
}
}
完整的controller类
package com.controller;
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.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.mapper.InterStudentMapper;
import com.mapper.StudentMapperImpl;
import com.model.Student;
@Controller
//@RequestMapping("/jsp")
public class ServiceController {
@RequestMapping(value="/index",method=RequestMethod.GET)
public String showIndex(){
return "index";
}
@RequestMapping(value="/show",method=RequestMethod.POST,params="sno")
public String getOneStudent(@RequestParam("sno")int sno,Model model){
//System.out.println(sno);
InterStudentMapper interStudentMapper=new StudentMapperImpl();
Student stu=interStudentMapper.getStudentBySno(sno);
System.out.println(stu);
model.addAttribute("sno",stu.getSno());
model.addAttribute("sname",stu.getSname());
model.addAttribute("score",stu.getScore());
return "show";
}
}
结果测试