前提: 如何要整合 SpringMVC 与 Mybatis, 首先要会配置 SpringMVC
第一部分: 配置 SpringMVC
第一步: 导入 jar 包
第二步: 构建一个请求
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <HTML>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>
- Insert title here
- </title>
- </head>
- <body>
- <a href="${pageContext.request.contextPath }/say.do">
- say
- </a>
- </body>
- </HTML>
第三步: 配置核心控制器
- <?xml version="1.0" encoding="UTF-8"?>
- <web-App version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
- <!-- 配置核心控制器拦截所有的请求 -->
- <servlet>
- <servlet-name>dispatcherServlet</servlet-name>
- <servlet-class>org.springframework.Web.servlet.DispatcherServlet</servlet-class>
- <!-- 指定配置文件的路径 -->
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:spring-mvc.xml</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>dispatcherServlet</servlet-name>
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
- </Web-App>
第四步: 创建一个业务控制器
- @Controller // 组件注解
- public class HelloController {
- @RequestMapping(value="/say")
- public String say(){
- System.out.println("HelloWorld!");
- return "/hello.jsp";
- }
- }
第五步: 创建 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"
- 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.3.xsd">
- <!-- 配置组件扫描器 -->
- <context:component-scan base-package="cn.px.controller"></context:component-scan>
- </beans>
第六步: 创建一个返回页面
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <HTML>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>
- Insert title here
- </title>
- </head>
- <body>
你好世界
</body>
</HTML>
问题: 为什么需要配置核心控制器.
答: 因为我们只能在网站的入口 (Web.xml) 拦截了所有的请求, 我们才能做到请求与方法的一一对应!!
问题: 为什么需要配置 < init-param>
答: 因为我们希望指定自定义的配置文件路径. 如果使用框架默认的路径可以不配置
问题: 为什么需要配置 < context:component-scan>
答: 因为我们是通过组件注解 (@Controller) 的方式, 将类的对象加载到容器里面. 所以必须要配置
第二部分: 配置 Mybatis
第一步: 导入 jar 包
第二步: 创建配置文件
-- 注意: Mybatis 的配置文件使用 DTD 规范文件的. 所以需要通过 DTD 规则文件生成.
问题: 为什么配置文件使用 xml
答: 就是因为大部分的 IDE(开发工具)对 xml 有提示功能的.
问题: 为什么 xml 会有提示功能呢?
答: 因为 xml 的标签有约束文件来约束标签与标签之间的关系. 开发工具通过约束文件来提供对应的标签.
问题: xml 的约束文件有哪些呢?
答: DTD 以及 schema
问题: 为什么有一些 xml 文件 Eclipse 直接支持提示了呢?
答: 因为这个 xml 的文件的规则文件已经内置在 Eclipse 开发工具里面了.
问题: Mybatis 的 DTD,Eclipse 工具默认是没有的, 怎么办?
答: 那么我们需要在 Eclipse 里面配置它!!!
这也告诉了我们, 任何框架, 只要使用 xml 配置, 它就必须要提供 DTD 或者 Schema.
<?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd">
- <configuration>
- <environments default="sms">
- <!-- 任何配置文件, 的参数都可以在框架代码里面找到!! -->
- <!-- 大部分的框架, 对配置文件的解释的所在类的分包的包名, configuration 以及缩写, builder 以及缩写 -->
- <environment id="sms">
- <transactionManager type="JDBC"></transactionManager>
- <dataSource type="POOLED">
- <!-- property 对应的就是 set 方法 -->
- <property name="driver" value="org.gjt.mm.mysql.Driver"/>
- <property name="url" value="jdbc:mysql://localhost:3306/sms"/>
- <property name="username" value="root"/>
- <property name="password" value="123456"/>
- </dataSource>
- </environment>
- </environments>
- </configuration>
第三步: 创建帮助类 MybatisUtils
- public class MybatisUtils {
- public static final SqlSessionFactory SSF=MybatisUtils.getSSF();
- private static final ThreadLocal<SqlSession> THREAD_LOCAL=new ThreadLocal<>();
- /**
- * 获得会话工厂
- * @return
- */
- private static SqlSessionFactory getSSF() {
- try {
- Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
- SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
- return builder.build(reader);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
- /**
- * 获得会话
- * @return
- */
- public static SqlSession getSession(){
- if(THREAD_LOCAL.get()==null){
- SqlSession session = SSF.openSession();
- THREAD_LOCAL.set(session);
- }
- return THREAD_LOCAL.get();
- }
- /**
- * 关闭会话
- */
- public static void close(){
- if(THREAD_LOCAL.get()!=null){
- SqlSession session = THREAD_LOCAL.get();
- session.close();
- THREAD_LOCAL.remove();
- }
- }
- public static void main(String[] args) {
- System.out.println(MybatisUtils.getSession());
- }
- }
第四步: 创建映射接口
- public interface StudentMapper {
- /**
- * 插入学生
- * @param student
- * @return
- */
- int insert(Student student);
- }
第五步: 创建并加载映射文件
<?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd">
- <mapper namespace="cn.px.mapper.StudentMapper">
- <insert id="insert">
- INSERT INTO tb_student (stu_name, stu_age, stu_password) VALUES (#{stuName}, #{stuAge}, #{stuPassword})
- </insert>
- </mapper>
- <mappers>
- <mapper resource="cn/px/mapper/xml/StudentMapper.xml"/>
- </mappers>
第六步: 测试插入数据
- public class StudentMapperTest {
- @Test
- public void insert(){
- // 第一步: 获得操作对象
- SqlSession session = MybatisUtils.getSession();
- StudentMapper studentMapper = session.getMapper(StudentMapper.class);
- Student student=new Student();
- student.setStuName("张三");
- int count = studentMapper.insert(student);
- System.out.println(count);
- session.commit();
- MybatisUtils.close();
- }
实体类
- public class Student {
- private String stuId;
- private String stuName;
- private String stuAge;
- private String stuPassword;
- public String getStuId() {
- return stuId;
- }
- public void setStuId(String stuId) {
- this.stuId = stuId;
- }
- public String getStuName() {
- return stuName;
- }
- public void setStuName(String stuName) {
- this.stuName = stuName;
- }
- public String getStuAge() {
- return stuAge;
- }
- public void setStuAge(String stuAge) {
- this.stuAge = stuAge;
- }
- public String getStuPassword() {
- return stuPassword;
- }
- public void setStuPassword(String stuPassword) {
- this.stuPassword = stuPassword;
- }
- }
第三部分: 整合 SpringMVC 与 Mybatis
问题: 为什么需要 SpringMVC 整合 Mybatis?
答: 因为我们希望 Mybatis 可以使用 Spring 框架里面的事务代理机制.
问题: Spring 框架的事务代理依赖什么东西?
答: Spring JDBC 里面的数据源!!
所以所谓的 SpringMVC 整合 Mybatis 就是, 就是让 Mybatis 抛弃自己实现的数据源, 在使用 Spring 提供的数据源.
那么整合步骤:
第一步: 导入 jar 包
第二步: 配置文件
- <?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: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/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
- <!-- 1. 配置数据源 -->
- <bean name="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
- <!-- 四要素 -->
- <property name="driverClassName" value="org.gjt.mm.mysql.Driver" />
- <property name="url" value="jdbc:mysql://localhost:3306/sms" />
- <property name="username" value="root" />
- <property name="password" value="123456" />
- </bean>
- <!-- 2. 配置会话工厂 -->
- <!-- 默认情况下: mybatis 是不支持 spring 的数据源的 -->
- <!-- 问题: 那么我们如何可以让 mybatis 支持 spring 的数据源呢? -->
- <!-- 答: 需要一个整合包 mybatis-spirng.jar
- SqlSessionFactoryBean: 作用就是让 Mybatis 可以通过 Spring 的数据源创建会话工厂的
- -->
- <bean name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <!-- 指定数据源 -->
- <property name="dataSource" ref="dataSource"></property>
- <!-- 加载映射文件的路径 -->
- <property name="mapperLocations" value="classpath:cn/px/mapper/xml/*Mapper.xml"></property>
- </bean>
- <!-- 3. 配置扫描器, 将映射接口的动态对象创建, 并且注入到 spring 容器里面 -->
- <!-- 默认情况下: spring 是不支持通过接口创建对象!! 而 Mybatis 就是通过接口创建对象的
- 问题: Spring 必须要实现类创建可以注入到容器, 而 Mybatis 就是使用接口创建动态对象的. 不能兼容 Spring 的要求. 怎么办呢?
- 答: 整合包提供了一个映射接口扫描器, 用于通过映射接口创建了对象, 并且可以创建的对象注入到容器里面
- - 根据表述扫描器必要要的两个条件
- 1. 需要会话工厂
- 2. 必须要指定映射接口的路径
- -->
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
- <property name="basePackage" value="cn.px.mapper"></property>
- <!-- 指定扫描注解 -->
- <property name="annotationClass" value="org.apache.ibatis.annotations.Mapper"></property>
- </bean>
- <!-- 4. 配置事务代理, 编程式事务 -->
- <!-- 注意: Mybatis 是的 spring jdbc 的事务代理 -->
- <!-- 创建事务代理对象 -->
- <bean name="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <!-- 指定数据源 -->
- <property name="dataSource" ref="dataSource"></property>
- </bean>
- <!-- 启动事务代理 -->
- <tx:annotation-driven/>
- </beans>
来源: http://www.bubuko.com/infodetail-3025163.html