Mybatis学习笔记-Mybatis高级应用

  • 知识回顾
  1. log4j日志没有显示

配置环境升级jdk1.6升级为jdk1.7;(log4j-1.2.17.jar)

 

  1. mybatis作用

持久层框架

特点:半自动ORM映射,将数据库中的数据封装到对象中

 

  1. 怎么获得mybatis?

SqlSessionFactory 线程安全性

SqlSession 线程非安全,不能做类的公用变量

 

4)Mybatis核心配置文件 sqlMapConfig.xml

配置内容:

  1. 配置事务
  2. 配置数据源
  3. 声明mapper文件

 

5)Mapper文件

  1. 命名空间,在不同的mapper,但mapper中的方法同名,靠命名空间区分
  2. resultMap不是必须,可以不写,前提:表和实体的属性一样。(mybatis底层自动生成resultMap)
  3. 它通过数据结果集来映射的。Hibernate它是通过数据库表字段来映射的。
  4. 关联关系:

A.对一association  javaType

B.对多 collection   ofType

jdbcType 

它是指定当NAME为null时,给jdbc驱动程序告诉它,它针对的数据库字段的类型。(Oracle)

        <update id="update" parameterType="cn.itcast.domain.Person">

                 update person

                 <set>

                       <if test="name!=null">user_name=#{name,jdbcType=VARCHAR},</if>

                         <if test="age!=null">age=#{age},</if>

                         <if test="remark!=null">remark=#{remark},</if>

                 </set>

                 where id = #{id}

        </update>

 

6)Mapper中写SQL

获取参数

#{} 它会自动根据参数类型做封装。例如对字符串类型,两边加单撇;对整数类型直接使用;好处防止SQL注入(推荐)

 

${} 将用户填入的参数直接拼接到SQL。(字符串直接拼接)坏处:SQL注入;例如:拼接order by条件(特殊的地方)

 

7)SQL中含有特殊字符

<if test="ageEnd!=null"><![CDATA[and age <=]]> #{ageEnd}</if>

 

8)动态SQL

<if>  判断条件

<where> 自动删除最前面的and 或者or,实际开发中常用where 1=1

<set> 它自动删除最后一个set值的逗号,修改时,修改参数不同

<foreach> 主要应用在in子查询,批量删除时候,array,list,map

 

9)常规的标签

<select>   查询,参数map;返回值List(selectList),可以是一个值(selectOne)

<insert> 新增,参数po;新增时习惯写所有的字段

<update> 修改,参数po;修改时习惯使用动态sql语句

<delete> 删除,参数 int,string,array,list,map

 

10)参数:

        1. parameterMap 废除,早期使用
        2. parameterType 简单变量int/string/double/po/map

 

11)返回值:

  1. resultType 简单变量int/string/double/po/map
  2. resultMap 它是mybatis核心;实际resultType使用时,底层自动转为resultMap;在数据库结果集和实体对象加了一层。例如:数据库字段USER_NAME,实体中name;通过它mybatis可以找到映射的规则;它可以配置关联关系;mybatis自动将大大的结果集分拆到各个对象中。(难点)

SQL返回的结果集中字段不能有重名的,如果有,必须设置别名,通过resultMap映射时进行转化。

 

12)类中调用mybatis

sqlSession提供很多方法

selectList          查询多条,返回结果集封装到List

selectOne        查询一条,必须返回一个值,如果不是,报错;

insert                新增

update             修改

delete               删除

 

13)两种调用形式:

  1. 不带参数,命名空间+.+id
  2. 带参数,命名空间+.+id,封装到对应mapper中声明的类型
  • 高级应用
  1. 接口开发

使用sqlsession提供selectList…,它们调用方式不习惯,它命名空间.id,如果字母写错,在编译时无法提示。运行报错。

 

通过命名空间找的mapper文件,在通过id去找到一个具体sql去执行。

 

    1. 规则:
  1. 接口名称必须和mapper文件名称相同
  2. 接口包路径和命名空间一致(接口文件和mapper文件在一起)
  3. 接口中要声明的方法名和某个sql配置的id属性一致
  4. 参数和返回值,要按java规则写

 

package cn.itcast.mapper;

 

import java.util.List;

import java.util.Map;

 

import cn.itcast.domain.Person;

 

/**

 * @Description:

 * @Author:            传智播客 java学院       陈子枢

 * @Company:       http://java.itcast.cn

 * @CreateDate:    2014年11月17日

 */

public interface PersonMapper {

        public List<Person> find(Map map);

        public Person get(Integer id);

        public void insert(Person person);

        public void update(Person person);

        public void deleteById(Integer id);

       

        public void deleteList(List list);

        public void deleteMap(Map map);

        public Integer count();

}

    1. 调用:面向对象的开发方式(推荐)

 

package test;

 

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

 

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.Before;

import org.junit.Test;

 

import cn.itcast.domain.Person;

import cn.itcast.mapper.PersonMapper;

 

/**

 * @Description:

 * @Author:            传智播客 java学院       陈子枢

 * @Company:       http://java.itcast.cn

 * @CreateDate:    2014年11月17日

 */

public class TestMapperInterface {

        private SqlSessionFactory factory;

       

        @Before  //最先执行,初始化SessionFactory

        public void init() throws IOException{

                 String resource = "sqlMapConfig.xml";

                 InputStream is = Resources.getResourceAsStream(resource);

                 factory = new SqlSessionFactoryBuilder().build(is);

        }

       

        @Test

        public void testFind(){

                 SqlSession session = factory.openSession();

                 //获取接口对象

                 PersonMapper mapper = session.getMapper(PersonMapper.class);

                 Map map = new HashMap();

                 map.put("name", "'t%'");

                

                 List<Person> pList = mapper.find(map);

                 System.out.println(pList.size());

        }

       

        @Test

        public void testGet(){

                 SqlSession session = factory.openSession();

                 PersonMapper mapper = session.getMapper(PersonMapper.class);

                 Person p = mapper.get(1);

                 System.out.println(p.getName());

                

        }

       

        @Test

        public void testInsert(){

                 SqlSession session = factory.openSession();

                 PersonMapper mapper = session.getMapper(PersonMapper.class);

                

                 Person p = new Person();

                 p.setId(4);

                 p.setName("tom");

                 p.setAge(8);

                

                 mapper.insert(p);

                 session.commit();

        }

       

        @Test

        public void testUpdate(){

                 SqlSession session = factory.openSession();

                 PersonMapper mapper = session.getMapper(PersonMapper.class);

                

                 Person p = mapper.get(4);

                 p.setAge(9);

                

                 mapper.update(p);

                 session.commit();

        }

       

        @Test

        public void testDeleteById(){

                 SqlSession session = factory.openSession();

                 PersonMapper mapper = session.getMapper(PersonMapper.class);

                

                 mapper.deleteById(4);

                 session.commit();

        }

       

        @Test

        public void testDeleteList(){

                 SqlSession session = factory.openSession();

                 PersonMapper mapper = session.getMapper(PersonMapper.class);

                

                 List<Integer> list = new ArrayList();

                 list.add(5);

                 list.add(6);

                

                 mapper.deleteList(list);

                 session.commit();

        }

       

        @Test

        public void testDeleteMap(){

                 SqlSession session = factory.openSession();

                 PersonMapper mapper = session.getMapper(PersonMapper.class);

                

                 Map map = new HashMap();

                 map.put("ids", new Integer[]{4,5,6,7});

                

                 mapper.deleteMap(map);

                 session.commit();

        }

       

        @Test

        public void testCount(){

                 SqlSession session = factory.openSession();

                 PersonMapper mapper = session.getMapper(PersonMapper.class);

                

                 int i = mapper.count();

                 System.out.println(i);

        }

}

  1. Mybatis自动生成映射文件和PO对象和调用示例代码工具
    1. 安装myeclipse插件

    1. 配置文件:

 

可以随意放在任何一个工程中,它可以通过配置指向要生成的工程

 

在配置文件中自己指定当前环境中的驱动jar

 

工具如果再次生成会覆盖之前的内容

 

 

 

    1. 优点:

大量减少写代码的工作量,代码比较规范。

日常就拷贝insert,update,delete和字段;实体

 

    1. 缺点:

关联关系它不会生成,手工修改;

项目组的规范不同,手工修改;

生成的example内容都要手工清除

 

  1. 缓存

一级缓存Hibernate,session级别

二级缓存Hibernate,sessionFactory级别

Mybatis它和hibernate一样

 

    1. 一级缓存:

   @Test //一级缓存

   public void cacheLevel1(){

      SqlSession session = factory.openSession();

      PersonMapper mapper = session.getMapper(PersonMapper.class);

      Map map = new HashMap();

      map.put("name", "'tony'");

     

      List<Person> personList = mapper.find(map);

      System.out.println(personList.size());

     

      PersonMapper mapper2 = session.getMapper(PersonMapper.class);

     

      List<Person> personList2 = mapper2.find(map);

      System.out.println(personList2.size());

  

   }

  

 

    1. 二级缓存

默认Mybatis二级缓存不开启,

如何开启

 

 

 

使用

<?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="cn.itcast.mapper.PersonMapper">

   <!-- 使用二级缓存 -->

   <cache/>

 

 

   @Test //二级缓存

   public void cacheLevel2(){

      SqlSession session = factory.openSession();

      PersonMapper mapper = session.getMapper(PersonMapper.class);

      Map map = new HashMap();

      map.put("name", "'tony'");

     

      List<Person> personList = mapper.find(map);

      System.out.println(personList.size());

     

      session.close();   //关闭session

      session = factory.openSession();

     

      PersonMapper mapper2 = session.getMapper(PersonMapper.class);

     

      List<Person> personList2 = mapper2.find(map);

      System.out.println(personList2.size());

     

   }

 

 

    1. 【面试】二级缓存怎么优化

参数配置

在实际开发中,经过在线上压力测试,找到一个符合当前客户运行环境下最恰当的值。

 

默认mybatis二级缓存一般

    1. 第三方Ehcache

第三方cache中有两个佼佼者;

Ehcache 单机

Momeycache 集群

 

 

 

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

 

 

修改为ehcache.xml即可

 

 

拦截器interceptor

Mybatis           分页

          1. 自定义一个拦截器类,实现interceptor接口
          2. 插件,在sqlMapConfig.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>

        <!-- 分页拦截器,拦截用户提交的查询,只查询当前页数据;提高响应速度。 -->

        <plugins> 

                 <plugin interceptor="cn.itcast.jk.pagination.PageInterceptor"> 

                         <property name="databaseType" value="oracle"/> 

                 </plugin> 

        </plugins> 

</configuration>    

       

Springmvc        性能监控

开发步骤:

1、编写拦截器,记录Controller方法执行时间

 

 

package cn.itcast.jk.interceptor;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.springframework.core.NamedThreadLocal;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

 

 

/**

 * @Description:

 * @Author:   nutony

 * @Company:       http://java.itcast.cn

 * @CreateDate:    2014-3-6

 */

public class TimerInterceptor implements HandlerInterceptor {

        private NamedThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<Long>("WatchExecuteTime");

       

        public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {

                 long beginTime = System.currentTimeMillis();                        //开始时间

                 startTimeThreadLocal.set(beginTime);

                 return true;

        }

       

        public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object arg2, Exception arg3) throws Exception {

                 long endTime = System.currentTimeMillis();

                 long executeTime = endTime - startTimeThreadLocal.get();

                 System.out.println(String.format("%s execute %d ms." , req.getRequestURI() , executeTime));

        }

       

        public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,

                         Object arg2, ModelAndView arg3) throws Exception {

        }

}

 

2、在springmvc-servlet.xml文件中配置拦截器

 

 

对多个controller进行指定方法的拦截

        <mvc:interceptors>

                 <mvc:interceptor>

                         <mvc:mapping path="/cargo/export/list.action"/>

                         <bean class="cn.itcast.jk.interceptor.TimerInterceptor"/>

                 </mvc:interceptor>

                 <mvc:interceptor>

                         <mvc:mapping path="/cargo/packinglist/list.action"/>

                         <bean class="cn.itcast.jk.interceptor.TimerInterceptor"/>

                 </mvc:interceptor>

        </mvc:interceptors>

 

 

对多个controller的所有方法拦截

        <mvc:interceptors>

                 <mvc:interceptor>

                         <mvc:mapping path="/cargo/export/*"/>

                         <bean class="cn.itcast.jk.interceptor.TimerInterceptor"/>

                 </mvc:interceptor>

                 <mvc:interceptor>

                         <mvc:mapping path="/cargo/packinglist/*"/>

                         <bean class="cn.itcast.jk.interceptor.TimerInterceptor"/>

                 </mvc:interceptor>

        </mvc:interceptors>

 

 

对某目录下的controller进行拦截

 

        <mvc:interceptors>

                 <mvc:interceptor>

                         <mvc:mapping path="/cargo/**"/>

                         <bean class="cn.itcast.jk.interceptor.TimerInterceptor"/>

                 </mvc:interceptor>

        </mvc:interceptors>

 

 拦截整个项目的所有controller

 

        <mvc:interceptors>

                 <mvc:interceptor>

                         <mvc:mapping path="/**"/>

                         <bean class="cn.itcast.jk.interceptor.TimerInterceptor"/>

                 </mvc:interceptor>

        </mvc:interceptors>

 

 

 

  • SSM框架实现业务

Springmvc+spring+hibernate

Springmvc+spring+mybatis

 

开发步骤:

  1. 画草图

 

  1. 创建表
  2. 创建web工程
  3. 导入jar,mybatis包,spring(springmvc),数据库驱动…

aopalliance-1.0.jar

asm-3.3.1.jar

cglib-2.2.2.jar

com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

commons-fileupload-1.2.2.jar

commons-io-2.0.1.jar

commons-lang3-3.1.jar

commons-logging-1.1.1.jar

ehcache-core-2.6.5.jar

freemarker-2.3.19.jar

javassist-3.11.0.GA.jar

junit-4.9.jar

log4j-1.2.16.jar

mybatis-3.2.2.jar

mybatis-ehcache-1.0.2.jar

mybatis-spring-1.2.0.jar

mysql-connector-java-5.1.10-bin.jar

ognl-3.0.6.jar

slf4j-api-1.6.2.jar

slf4j-log4j12-1.6.2.jar

spring-aop-3.2.2.jar

spring-beans-3.2.2.jar

spring-context-3.2.2.jar

spring-core-3.2.2.jar

spring-expression-3.2.2.jar

spring-jdbc-3.2.2.jar

spring-orm-3.2.2.jar

spring-tx-3.2.2.jar

spring-web-3.2.2.jar

spring-webmvc-3.2.2.jar

 

  1. 创建PO实体对象

package cn.itcast.ssm.domain;

 

import java.io.Serializable;

import java.util.List;

 

/**

 * @Description:

 * @Author:            传智播客 java学院       陈子枢

 * @Company:       http://java.itcast.cn

 * @CreateDate:    2014年11月15日

 */

public class Person implements Serializable {

       

        private Integer id;

        private String name;

        private Integer age;

        private String remark;

        public Integer getId() {

                 return id;

        }

        public void setId(Integer 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 getRemark() {

                 return remark;

        }

        public void setRemark(String remark) {

                 this.remark = remark;

        }

 

 

}

  1. 创建mapper映射文件

<?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="cn.itcast.ssm.mapper.PersonMapper">

        <resultMap type="cn.itcast.ssm.domain.Person" id="personRM">

                 <id property="id" column="ID"/>

                 <result property="name" column="USER_NAME"/>

                 <result property="age" column="AGE"/>

                 <result property="remark" column="REMARK"/>

        </resultMap>

       

        <!-- 带条件查询 -->

        <select id="find" parameterType="map" resultMap="personRM">

                 select * from person

                 where 1=1

                 <if test="name!=null"> and user_name like #{name}</if>

                 <if test="ageStart!=null"> and age>#{ageStart}</if>

                 <if test="ageEnd!=null"><![CDATA[ and age<=#{ageEnd}]]></if>

        </select>

 

</mapper>

  1. 创建Mapper接口

package cn.itcast.ssm.mapper;

 

import java.util.List;

import java.util.Map;

 

import cn.itcast.ssm.domain.Person;

 

/**

 * @Description:

 * @Author:            传智播客 java学院       陈子枢

 * @Company:       http://java.itcast.cn

 * @CreateDate:    2014年11月17日

 */

public interface PersonMapper {

        public List<Person> find(Map map);

}

  1. 创建PersonDao接口

package cn.itcast.ssm.dao;

 

import java.util.List;

import java.util.Map;

 

import cn.itcast.ssm.domain.Person;

 

/**

 * @Description:

 * @Author:            传智播客 java学院       陈子枢

 * @Company:       http://java.itcast.cn

 * @CreateDate:    2014年11月17日

 */

public interface PersonDao {

 

        public List<Person> find(Map map);

 

}

  1. 创建PersonDaoImpl

package cn.itcast.ssm.dao.impl;

 

import java.util.List;

import java.util.Map;

 

import org.apache.ibatis.session.SqlSessionFactory;

import org.mybatis.spring.support.SqlSessionDaoSupport;

import org.springframework.stereotype.Repository;

 

import cn.itcast.ssm.domain.Person;

import cn.itcast.ssm.mapper.PersonMapper;

 

/**

 * @Description:PersonDao

 * @Author:            传智播客 java学院       陈子枢

 * @Company:       http://java.itcast.cn

 * @CreateDate:    2014年11月17日

 */

@Repository

public class PersonDaoImpl extends SqlSessionDaoSupport {

       

        /*

         * mybatis3.0.0+mybatis-psring1.0.0无需,整合包自己注入

         * mybatis3.2.2+mybatis-spring1.2.0 必须自己注入sqlSessionFactory;

         */

        public void setSqlSessiionFactory(SqlSessionFactory sqlSessiionFactory) {

                 super.setSqlSessionFactory(sqlSessiionFactory);

        }

       

        public List<Person> find(Map map){

                 PersonMapper mapper = this.getSqlSession().getMapper(PersonMapper.class);

                 return mapper.find(map);

        }

       

}

  1. 创建PersonService接口

package cn.itcast.ssm.service;

 

import java.util.List;

import java.util.Map;

 

import cn.itcast.ssm.domain.Person;

 

/**

 * @Description:

 * @Author:            传智播客 java学院       陈子枢

 * @Company:       http://java.itcast.cn

 * @CreateDate:    2014年11月17日

 */

public interface PersonService {

 

        public List<Person> find(Map map);

 

}

  1. 创建PersonServiceImpl

package cn.itcast.ssm.service.impl;

 

import java.util.List;

import java.util.Map;

 

import javax.annotation.Resource;

 

import org.springframework.stereotype.Service;

 

import cn.itcast.ssm.dao.PersonDao;

import cn.itcast.ssm.domain.Person;

import cn.itcast.ssm.service.PersonService;

 

/**

 * @Description:

 * @Author:            传智播客 java学院       陈子枢

 * @Company:       http://java.itcast.cn

 * @CreateDate:    2014年11月17日

 */

@Service

public class PersonServiceImpl implements PersonService {

        @Resource

        PersonDao personDao;

       

        public List<Person> find(Map map){

                 return personDao.find(map);

        }

}

  1. 创建PersonController

package cn.itcast.ssm.web.controller;

 

import java.util.List;

 

import javax.annotation.Resource;

 

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

 

import cn.itcast.ssm.domain.Person;

import cn.itcast.ssm.service.PersonService;

 

/**

 * @Description:

 * @Author:            传智播客 java学院       陈子枢

 * @Company:       http://java.itcast.cn

 * @CreateDate:    2014年11月17日

 */

@Controller

public class PersonController {

        @Resource

        PersonService personService;

       

        //查询,将查询结果传递到页面

        @RequestMapping("/person/list.action")      //Controller加载时会自动创建访问路径 /person/list;/person/list.action

        public String list(Model model){

                 List<Person> personList = personService.find(null);

                 model.addAttribute("personList", personList);               //传递到页面

                

                 return "/person/jPersonList.jsp";

        }

}

  1. 创建列表页面jPersonList.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>My JSP 'jPersonList.jsp' starting page</title>

  </head>

 

  <body>

    人员列表<br>

 

<table>

<tr>

        <td>序号</td>

        <td>姓名</td>

        <td>年龄</td>

        <td>备注</td>

</tr>

 

<c:forEach items="personList" var="p" varStatus="status">

<tr>

        <td>${status.index+1}</td>

        <td>${p.name}</td>

        <td>${p.age}</td>

        <td>${p.remark}</td>

</tr>

</c:forEach>

 

</table>   

   

  </body>

</html>

  1. 配置sqlMapConfig.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>

 

</configuration>

  1. 配置beans.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:aop="http://www.springframework.org/schema/aop"

        xmlns:tx="http://www.springframework.org/schema/tx"

        xsi:schemaLocation="http://www.springframework.org/schema/beans

                                           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

                                           http://www.springframework.org/schema/context

                                           http://www.springframework.org/schema/context/spring-context-3.0.xsd

                                           http://www.springframework.org/schema/tx

                                           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd

                                           http://www.springframework.org/schema/aop

                                           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

       

        <!-- 1.包扫描,service dao -->

        <context:component-scan base-package="cn.itcast.ssm.dao,cn.itcast.ssm.service"/>

       

        <!-- 2.jdbc.properties属性配置文件 -->

        <context:property-placeholder location="classpath:jdbc.properties"/>

       

        <!-- 3.数据源 DataSource -->

        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

                 <property name="driverClassName" value="${jdbc.driverclass}"/>

                 <property name="url" value="${jdbc.url}"/>

                 <property name="username" value="${jdbc.username}"/>

                 <property name="password" value="${jdbc.password}"/>

        </bean>

       

        <!-- 4.SqlSessionFactory -->

        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

                 <property name="dataSource" ref="dataSource"/>

                 <!-- spring和mybatis整合 -->

                 <!-- 1)引入mybatis核心配置文件 -->

               <property name="configLocation" value="classpath:sqlMapCongfig.xml"/>

                

                 <!-- 2)扫描指定目录下的所有Mapper.xml -->

                 <property name="mapperLocations" value="classpath:cn/itcast/ssm/mapper/*.xml"/>

        </bean>

       

        <!-- 5.事务 -->

        <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

                 <property name="dataSource" ref="dataSource"/>

        </bean>

        <tx:advice id="txAdvice" transaction-manager="txManager">

                 <tx:attributes>

                         <tx:method name="save*" propagation="REQUIRED"/>

                         <tx:method name="insert*" propagation="REQUIRED"/>

                         <tx:method name="update*" propagation="REQUIRED"/>

                         <tx:method name="delete*" propagation="REQUIRED"/>

                        

                         <tx:method name="find*" read-only="true"/>

                         <tx:method name="get*" read-only="true"/>

                         <tx:method name="view*" read-only="true"/>

                        

                         <tx:method name="*" read-only="true"/>

                 </tx:attributes>

        </tx:advice>

        <aop:config>

                 <aop:pointcut expression="execution(* cn.itcast.ssm.service.*.*(..))" id="pointCut"/>

                 <aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut"/>

        </aop:config>

       

                                 

</beans>

  1. 配置springmvc-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:mvc="http://www.springframework.org/schema/mvc"

        xmlns:context="http://www.springframework.org/schema/context"

        xmlns:aop="http://www.springframework.org/schema/aop"

        xmlns:tx="http://www.springframework.org/schema/tx"

        xsi:schemaLocation="http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

        http://www.springframework.org/schema/mvc

        http://www.springframework.org/schema/mvc/spring-mvc-3.0.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-3.0.xsd

        http://www.springframework.org/schema/tx

        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd ">

       

        <!-- 1.包扫描controller -->

        <context:component-scan base-package="cn.itcast.ssm.web.controller"/>

       

        <!-- 2.内部资源视图解析器  -->

        <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

                 <property name="prefix" value="/WEB-INF/pages"/>

                 <property name="suffix" value=""/>

        </bean>

       

</beans>

  1. 配置web.mxl

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

                 xmlns="http://java.sun.com/xml/ns/javaee"

                 xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

                 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

                 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

               id="WebApp_ID" version="3.0">

              

        <!-- 1.spring容器 listener -->

        <context-param>

                 <param-name>contextConfigLocation</param-name>

                 <param-value>classpath:beans.xml</param-value>

        </context-param>

        <listener>

                 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

        </listener>

       

        <!-- 2.springmvc servlet -->

        <servlet>

                 <servlet-name>springmvc</servlet-name>

                 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

                 <init-param>

                         <param-name>contextConfigLocation</param-name>

                         <param-value>classpath:springmvc-servlet.xml</param-value>

                 </init-param>

        </servlet>

       

        <servlet-mapping>

                 <servlet-name>springmvc</servlet-name>

                 <url-pattern>*.action</url-pattern>

        </servlet-mapping>

         

        <!-- 3.spring 中文乱码 filter -->

        <!-- 编码过滤器,解决中文乱码 -->

        <filter>

                 <filter-name>SpringEncoding</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>SpringEncoding</filter-name>

                 <url-pattern>/*</url-pattern>

        </filter-mapping>   

</web-app>

  1. 发布,测试

猜你喜欢

转载自blog.csdn.net/a5421901/article/details/88074233