环境
- 操作系统: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&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();
}
}