Web项目框架搭建一(Servlet、Jsp、Spring、Spring MVC、Struts2、Mybatis、Hibernate)

环境

  • 操作系统:Win10
  • 开发工具:Eclipse IDE for Enterprise Java Developers Version: 2019-03 (4.11.0)
  • Web服务器:Tomcat8.0
  • 数据库:Mysql5.7

导言

有些东西,久了没接触,千头万绪,却不知道从何开始。本文目的是想快速重建对一个技术的感观认识,为千头万绪打开一个窗口,为之后进一步的工作做好铺垫。

脑图

在这里插入图片描述

正文

1.搭建Web项目

  • 新建一个maven项目
    在这里插入图片描述
    在这里插入图片描述
  • 这个项目还不是web项目,添加web结构
    在这里插入图片描述
    在这里插入图片描述
  • 添加tomcat运行环境的依赖和Junit环境依赖
    在这里插入图片描述
  • 至此,项目已新建完成,项目结构如下:
    在这里插入图片描述
    闲言闲语:说白了,web项目就是个放置于web容器上的一个组件,是个组件就要满足组件规范,不管用什么IDE,这是底层的思路,哪些是开发人员自主把控的,哪些是需要遵从规范的,边界要搞清楚,不要执著于IDE的操作上。
    其实此时直接在WebContent下创建html就可以直接被浏览器访问,但这样扩展性差,也不太安全,所以一般都是通过servlet来处理浏览器的请求。

2.集成Servlet(实现从页面显示当前时间的功能)

  • 新建TimeServlet类
    在这里插入图片描述
package topic01;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

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

public class TimeServlet extends HttpServlet{
	protected void service(
			HttpServletRequest req, 
			HttpServletResponse res) 
			throws ServletException, IOException {
			res.setContentType("text/html");
			PrintWriter out = res.getWriter();
			Date date = new Date();
			SimpleDateFormat sdf = 
				new SimpleDateFormat("HH:mm:ss");
			String now = sdf.format(date);
			out.println("<h1>"+now+"</h1>");
			out.close();
		}
}
  • 配置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>Demo01</display-name>
  //通过浏览器端传来的url匹配到url-pattern,再通过url-pattern找到servlet-name,再通过servlet-name找到servlet-class,而servlet-class就是一个实现了serlvet的类路径,来处理具体的业务逻辑
  <servlet>
  	 <servlet-name>time</servlet-name>
  	 <servlet-class>topic01.TimeServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	 <servlet-name>time</servlet-name>
  	 <url-pattern>/tm</url-pattern>
  </servlet-mapping>
</web-app>
  • 部署到tomcat上,验证功能
    在这里插入图片描述

3.集成Jsp(实现查询员工数据的功能)

  • 新建两个java类
    在这里插入图片描述
package topic02.dao;

import java.util.ArrayList;
import java.util.List;

import topic02.entity.Emp;

public class EmpDao {
	
	/**
	 * 模拟查询员工
	 */
	public List<Emp> findAll() {
		List<Emp> list = new ArrayList<Emp>();
		
		Emp e1 = new Emp();
		e1.setEmpno(1);
		e1.setEname("张三");
		e1.setJob("项目经理");
		e1.setSal(9000.0);
		list.add(e1);
		
		Emp e2 = new Emp();
		e2.setEmpno(2);
		e2.setEname("李四");
		e2.setJob("技术开发");
		e2.setSal(5000.0);
		list.add(e2);
		
		Emp e3 = new Emp();
		e3.setEmpno(3);
		e3.setEname("王五");
		e3.setJob("需求");
		e3.setSal(6000.0);
		list.add(e3);
		
		return list;
	}

	/**
	 * 模拟增加员工
	 */
	public void save(Emp e) {
		System.out.println(e.getEmpno());
		System.out.println(e.getEname());
	}
}
package topic02.entity;

import java.io.Serializable;

public class Emp implements Serializable{
	
	private Integer empno;
	private String ename;
	private String job;
	private Double sal;
	
	public Integer getEmpno() {
		return empno;
	}
	public void setEmpno(Integer empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public Double getSal() {
		return sal;
	}
	public void setSal(Double sal) {
		this.sal = sal;
	}
}
  • 新建jsp文件
    在这里插入图片描述
<%@page pageEncoding="utf-8"
	import="java.util.*,topic02.entity.*,topic02.dao.*"%>
<!doctype html>
<html>
	<head>
		<meta charset="utf-8">
		<title>员工查询</title>
	</head>
	<body>
		<table border="1px" cellspacing="0" width="40%">
			<tr>
				<th>编号</th>
				<th>姓名</th>
				<th>职位</th>
				<th>工资</th>
			</tr>
			<%
				EmpDao dao = new EmpDao();
				List<Emp> list = dao.findAll();
				for(Emp e : list) {
			%>
				<tr>
					<td><%=e.getEmpno() %></td>
					<td><%=e.getEname() %></td>
					<td><%=e.getJob() %></td>
					<td><%=e.getSal() %></td>
				</tr>
			<%		
				}
			%>
		</table>
	</body>
</html>
  • 部署到tomcat上,验证。
    在这里插入图片描述
    多说几句:jsp其实就是把页面、web.xml配置的映射功能、Servlet整合在一起的一个语言规范。相应的文档就是jsp文档。Web容器会把jsp拆分成这些东西来处理的。

4.集成Spring

PS:这里所说的Spring就是Spring核心,功能上主要有管理bean的Spring容器和依赖注入。

  • 通过maven添加相应的依赖
    在这里插入图片描述
<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>xzt</groupId>
  <artifactId>frame01</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>xzt</name>
  <description>xzt</description>
  <dependencies>
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-webmvc</artifactId>
  		<version>3.2.8.RELEASE</version>
  	</dependency>
  </dependencies>
</project>

在这里插入图片描述

  • 创建java类
    在这里插入图片描述
package topic03.bean;

import java.io.Serializable;

public class MobilePhone implements Serializable {
	private String cpu;
	private String ram;
	public MobilePhone(String cpu, String ram) {
		this.cpu = cpu;
		this.ram = ram;
	}
	public String getCpu() {
		return cpu;
	}
	public void setCpu(String cpu) {
		this.cpu = cpu;
	}
	public String getRam() {
		return ram;
	}
	public void setRam(String ram) {
		this.ram = ram;
	}
}
  • 创建spring的配置文件
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context" 
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"  
	xmlns:jee="http://www.springframework.org/schema/jee" 
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
	
	<!-- Spring创建对象 -->
	<bean class="java.util.Calendar" 
		factory-method="getInstance" id="obj1">
	</bean>
	<bean factory-bean="obj1"
		factory-method="getTime" id="obj2">
	</bean>
	
	<!-- Spring IOC依赖注入(DI) -->
	<bean class="topic03.bean.MobilePhone" id="phone">
		<constructor-arg index="0" value="ARM"/>
		<constructor-arg index="1" value="2G"/>
	</bean>
</beans>
  • 创建java测试类
    在这里插入图片描述
package topic03_test;

import java.util.Date;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import topic03.bean.MobilePhone;

public class TestCase {
	@Test
	public void test1() {
		//创建Spring容器,容器自动加载配置文件,
		//自动创建文件中所声明的bean。
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");	
		Date date = (Date) ctx.getBean("obj2");
		System.out.println("当前时间:"+date);
	}
	@Test
	public void test2() {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");			
		MobilePhone phone = (MobilePhone) ctx.getBean("phone");
		System.out.println("手机处理器:"+phone.getCpu());
		System.out.println("手机内存:"+phone.getRam());
	}
}
  • 做测试
    在这里插入图片描述
    在这里插入图片描述
    至此,Spring能正常工作了,接下来是SpringMVC了

5.集成SpringMVC (页面显示:Hello,SpringMVC! )

  • 创建java类(Controller)
    在这里插入图片描述
package topic04.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class HelloController implements Controller{
	public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res)throws Exception {			
		return new ModelAndView("hello");
	}
}
  • 创建SpringMVC配置文件
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
	<!-- 配置HandlerMapping -->
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<prop key="/hello.do">helloController</prop>
            </props>
         </property>
 	</bean>
	<bean id="helloController" class="topic04.controller.HelloController" />
	<!-- 配置视图解析器  -->
	<bean 
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" 
		value="/WEB-INF/"/>
		<property name="suffix" 
		value=".jsp"/>
	</bean>
</beans>
  • 修改web.xml(配置前端控制器DispatcherServlet)
<?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>Demo01</display-name>
  <servlet>
  	 <servlet-name>time</servlet-name>
  	 <servlet-class>topic01.TimeServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	 <servlet-name>time</servlet-name>
  	 <url-pattern>/tm</url-pattern>
  </servlet-mapping>
  
   <!-- 配置前端控制器 -->
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- DispatcherServlet的初始化方法会启动spring容器,所以,需要配置初始化参数来 指定spring配置文件的位置 -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
</web-app>
  • 创建jsp
    在这里插入图片描述
<%@ page contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<html>
<head>
	<title>Insert title here</title>
</head>
<body style="font-size:30px;font-style:italic;">
	Hello,SpringMVC!
</body>
</html>
  • 部署到tomcat做验证
    这里有个坑,默认maven添加的依赖部署的时候是不被加载到最终项目里的,需要做设置:
    在这里插入图片描述
    验证:
    在这里插入图片描述
    接下来,搭建Struts2。因为Struts2从功能上来说,也是实现了mvc的一个框架,联系比较紧密。

6.集成Struts2 (页面显示:Hello,Struts2 ! )

  • 通过maven添加依赖
<dependency>
	  <groupId>org.apache.struts</groupId>
	  <artifactId>struts2-core</artifactId>
	  <version>2.3.8</version>
</dependency>
  • 修改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>Demo01</display-name>
  <servlet>
  	 <servlet-name>time</servlet-name>
  	 <servlet-class>topic01.TimeServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	 <servlet-name>time</servlet-name>
  	 <url-pattern>/tm</url-pattern>
  </servlet-mapping>
  
  
   <!-- 配置前端控制器 -->
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- DispatcherServlet的初始化方法会启动spring容器,所以,需要配置初始化参数来 指定spring配置文件的位置 -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
  <!-- Struts2 MVC 配置 -->
  <!-- filter 会自动找package中的struts.xml -->
  <filter>
  	<filter-name>mvc</filter-name>
  	<filter-class>
  	org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  	</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>mvc</filter-name>
  	<url-pattern>*.action</url-pattern>
  </filter-mapping>
</web-app>
  • 创建struts配置文件
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8"?>
<!-- struts.xml -->
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<!-- 用于配置请求路径与控制器的匹配关系 -->
	<!-- /test 请求被这个包进行处理 -->
	<package name="test" namespace="/test"
		extends="struts-default"> 
		<!-- 请求/test/hello.action时候执行HelloAction的execute()方法 -->
		<!-- package里可以包含多个action-->
		<action name="hello"
			class="topic05.action.HelloAction">
			<!-- execute方法返回success时候,转发到msg.jsp-->
			<result name="success">
				/WEB-INF/msg.jsp
			</result>
		</action>
	</package>
</struts>
  • 新建一个java类
    在这里插入图片描述
package topic05.action;

public class HelloAction {
	private String message;
	public String getMessage() {
		return message;
	}
	/**
	 * 方法名必须是execute
	 */
	public String execute(){
		message = "Hello Struts2!";
		//返回值时候success
		return "success";
	}
}
  • 新建一个jsp
    在这里插入图片描述
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello</title>
</head>
<body style="font-size:30px;font-style:italic;">
	<!-- 自动调用getMessage方法获取信息 -->
	${message}
</body>
</html>
  • 部署到tomcat上,验证
    在这里插入图片描述

7.集成Mybatis(在emp表中增加条记录,并查看表中数据)

  • 通过Maven引入依赖
 <dependency>
  	<groupId>org.mybatis</groupId>
  	<artifactId>mybatis</artifactId>
  	<version>3.2.5</version>
 </dependency>
 <dependency>
  	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.30</version>
 </dependency>
  • 数据库Mysql相关设置
    数据库:Mysql5.7
    服务端口:localhost:3306
    库名:framedb
    用户名/密码:root/123456
    相关表和数据:
    在这里插入图片描述
  • 创建java类
    在这里插入图片描述
package topic06.dao;

import java.util.List;

import topic06.entity.Emp;

/**
 * Mapper接口
 *
 */
public interface EmpDAO {
	public void save(Emp emp);
	public List<Emp> findAll();	
}
package topic06.entity;

public class Emp {
	private String id;
	private String name;
	private Integer age;
	private String sex;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
		@Override
	public String toString() {
		return "Emp [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + "]"+"\r";
	}
}
  • 创建Mybatis配置文件
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" 
	"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
	<environments default="environment">
		<environment id="environment">
			<transactionManager type="JDBC" />
			<!-- mybatis使用自己的数据源,需要提供数据库的连接参数值 -->
			<!-- Oracle数据库-->
			<!--
			<dataSource type="POOLED">
				<property name="driver" value="oracle.jdbc.OracleDriver" />
				<property name="url" value="jdbc:oracle:thin:@localhost:1521:framedb" />	
				<property name="username" value="root" />
				<property name="password" value="123456" />
			</dataSource>
			-->
			<!-- Mysql数据库-->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/framedb" />
				<property name="username" value="root" />
				<property name="password" value="123456" />
			</dataSource>
		</environment>
	</environments>
	<!-- 配置映射文件的位置 -->
	<mappers>
		<mapper resource="topic06/entity/EmpMapper.xml" />
	</mappers>
</configuration> 
  • 创建Mybatis的Sql映射文件
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"      
 "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<!-- 
	namespace:命名空间,用来区分同名的sql。
	id:在同一个文件里面唯一。
	parameterType:参数类型。
	resultType:返回的结果类型。
	#{name}: name是Emp的属性(mybatis会利用反射机制读取emp对象的属性值)。
	注意:如果使用Mapper映射器,namespace必须为Mapper接口的完整的名称。
 -->
<mapper namespace="topic06.dao.EmpDAO">
	<insert id="save" parameterType="topic06.entity.Emp">
		INSERT INTO emp VALUES(#{id},#{name},#{age},#{sex})
	</insert>
	
	<select id="findAll" resultType="topic06.entity.Emp">
		SELECT * FROM emp
	</select>
</mapper>
  • 创建java测试类,测试结果
    在这里插入图片描述
package topic06_test;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import topic06.entity.Emp;

public class TestCase {
	private SqlSession session;
	@Before //执行unit测试前会执行此声明下的方法
	public void init(){
		SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml"));
		//SqlSession是执行sql的容器
		session = ssf.openSession();
	}
	@Test
	public void test1(){
		Emp emp = new Emp();
		emp.setName("zhaoliu");
		emp.setAge(30);
		emp.setId("00004");
		emp.setSex("fale");
		session.insert("save", emp);
		//插入,修改和删除操作,必须要提交事务。
		session.commit();
		//使用完必须关闭
		session.close();
		System.out.println("插入数据成功!!!");
	}
	@Test
	public void test2(){
		List<Emp> emps = session.selectList("findAll");
		System.out.println(emps);
	}
}

在这里插入图片描述
如下图,数据确实是有了。
在这里插入图片描述

8.集成Hibernate(根据ID查找emp表中的数据)

大方向跟Mybatis差不多的,只是不需要写接口文件,因为需要的方法Hibernate已经做了封装,所以映射文件里也不需要写Sql,只需要指明实体类属性同数据库表列之间的映射关系即可,一般一个实体类对应一个映射文件。

  • 通过maven添加依赖
	<dependency>
	  <groupId>org.hibernate</groupId>
	  <artifactId>hibernate-core</artifactId>
	  <version>3.6.9.Final</version>
	</dependency>
	<dependency>
      <groupId>org.slf4j</groupId>
       <artifactId>slf4j-nop</artifactId>
      <version>1.7.2</version>
	</dependency>

PS:不加slf4j-nop会报错
在这里插入图片描述

  • 创建Hibernate配置文件
    在这里插入图片描述
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		<property name="connection.url">
			jdbc:mysql://localhost:3306/framedb?useUnicode=true&amp;characterEncoding=utf8
		</property>
		<property name="connection.username">root</property>
		<property name="connection.password">123456</property>
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 加载映射描述文件 -->
		<mapping resource="Emp.hbm.xml" />
	</session-factory>
</hibernate-configuration>
  • 创建Hibernate映射文件
    在这里插入图片描述
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!-- 配置实体与表的对应关系 -->
	<!-- name: 完整类名    table:数据库表名 -->
	<class name="topic06.entity.Emp" table="emp">
			
		<!-- 定义主键映射 -->
		<!-- name:主键对应属性名  column(可选):表中的主键列名,默认会使用属性名  column(可选):列(属性)的类型-->
		<id name="id" column="id" type="string"></id>
			
		<!-- 定义非主键映射 -->
		<property name="name" column="name" type="string"></property>
		<property name="age" column="age" type="int"></property>
		<property name="sex" column="sex" type="string"></property>
		
	</class>
</hibernate-mapping>
  • 创建java测试类,验证结果
    在这里插入图片描述
package topic06_test_hb;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import topic06.entity.Emp;

public class TestCase {
	@Test
	public void test1(){
		Configuration cfg = new Configuration();
		//读取数据库连接参数
		cfg.configure("hibernate.cfg.xml");
		SessionFactory factory = cfg.buildSessionFactory();
		Session session = factory.openSession();
		//session可以自动生成SQL查询DB
		String id = "00004";
		Emp e=(Emp)session.get(Emp.class, id);
		System.out.println(e); 
		session.close();
	}
}

在这里插入图片描述

9.通过Spring整合Mybatis

  • 实现的功能:之前Mybatis都是直接搭建在项目里的。其实最好交给Spring做统一的管理,开发的精髓就是封装。然后基于注解自动扫描指定路径下的Mybatis接口文件。

  • 思路:
    把Mybatis的配置文件更改成对应的Spring的bean,在Spring配置文件里统一做配置即可。之前的配置文件也没用了,调用的时候获取对应bean对象就是。

  • 创建配置文件db.properties(为了方便,把数据库配置写在一个文件里)
    在这里插入图片描述

#db.properties
driverclass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/framedb
user=root
password=123456
maxActive=1
initSize=1
  • 修改配置文件applicationContext.xml。读取db.properties文件部分。
<!-- 读db.properties文件 -->
	<util:properties id="jdbc" location="classpath:db.properties"/>
	<!-- 配置DataSource -->
	<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	  <property name="driverClassName" value="#{jdbc.driverclass}" />
	  <property name="url"  value="#{jdbc.url}" />
	  <property name="username" value="#{jdbc.user}" />
	  <property name="password" value="#{jdbc.password}" />
	</bean>
  • 修改配置文件applicationContext.xml。整合Mybatis部分。
<!-- Mybatis配置 -->
	<!-- 配置SqlSessionFactoryBean 作用:为mybatis提供两个信息:a. 数据源 b. 映射文件的位置-->
 	<bean id="ssfb" class="org.mybatis.spring.SqlSessionFactoryBean">
	 	<property name="dataSource" ref="ds"/>
	 	<!-- 映射文件的位置 -->
	 	<property name="mapperLocations" value="classpath:topic06/entity/*.xml"/>
 	</bean>
 	<!-- 配置MapperScannerConfigurer
 		作用:负责将mybatis生成的Mapper对象放到spring容器里面。
 		Mapper对象是 SqlSession.getMapper()的返回值,即Mapper接口的实现。-->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	 	<!-- 指定Mapper接口所在的包 -->
	 	<property name="basePackage" value="topic06.dao"/>
	 	<!-- 只扫描带有特定注解的Mapper接口 即:@MyBatisRepository-->
	 	<property name="annotationClass" value="annotation.MyBatisRepository"/>
	</bean>
  • 增加依赖
	 <dependency>
  		<groupId>org.mybatis</groupId>
  		<artifactId>mybatis-spring</artifactId>
  		<version>1.2.2</version>
  	</dependency>
  	<dependency>
  		<groupId>commons-dbcp</groupId>
  		<artifactId>commons-dbcp</artifactId>
  		<version>1.4</version>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-jdbc</artifactId>
  		<version>3.2.8.RELEASE</version>
  	</dependency>
  • 增加注解文件
    在这里插入图片描述
package topic06.annotation;

public @interface MyBatisRepository {

}

  • 为接口文件增加注解
    在这里插入图片描述
    在这里插入图片描述

  • 增加测试方法
    在这里插入图片描述
    在这里插入图片描述

  • 做测试
    这里有个坑,直接执行会报错

 org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [E:\eclipse-workspace\frame01\target\classes\topic06\dao\EmpDAO.class];

原因是JRE版本不对。我用的Spring3 兼容JRE1.7。而我现在是JRE1.8。修改JRE,再测试即可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.通过Spring整合hibernate(实现按ID查询某条记录)

  • 修改配置文件
    在这里插入图片描述
<!-- Hibernate配置 -->
	<!-- 配置Hibernate SessionFactory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<!-- 连接到的数据库 -->
		<property name="dataSource" ref="ds" />
		<!-- Hibernate 参数 -->
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
			</props>
		</property>
		<!-- 映射文件参数 -->
		<property name="mappingLocations">
			<list>
				<value>classpath:Emp.hbm.xml</value>
			</list>
		</property>
	</bean>	
	<!-- 配置事务管理器 -->
	<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>	
	<!-- 打开注解驱动的事务管理 -->
	<tx:annotation-driven transaction-manager="txManager"/>
	<!-- 配置Hibernate 模板Bean -->
	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	<!-- 打开自动扫描功能-Spring的配置 -->
	<context:component-scan base-package="topic06"/>
  • 增加依赖
 	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-orm</artifactId>
  		<version>3.0.5.RELEASE</version>
  	</dependency>
  • 增加Dao类
    在这里插入图片描述
package topic06.dao;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import topic06.entity.Emp;

@Repository(value="hbEmpDao")
@Transactional
public class HibernateEmpDao{
	@Autowired
	private HibernateTemplate hibernateTemplate;
	public Emp findById(String id) {
		String hql = "from Emp where id=?";
		List list = hibernateTemplate.find(hql, id);
		if(list.size()==0){
			return null;
		}else{
			return (Emp)list.get(0);
		}
	}
}

  • 修改测试Java类,验证
    在这里插入图片描述
//通过Spring调用Hibernate
	@Test
	public void test2(){
		try {
			HibernateEmpDao dao = ctx.getBean("hbEmpDao",HibernateEmpDao.class);
			Emp emp = dao.findById("00004");
			System.out.println(emp);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

在这里插入图片描述

发布了11 篇原创文章 · 获赞 0 · 访问量 497

猜你喜欢

转载自blog.csdn.net/weixin_42426099/article/details/103876577