SSM

Mybatis详解

简单实例

SSM_第1张图片

一个完整的Mybatis应该有的文件格式。entity包放置实体类,java中的mapper包放置mapper的接口,resources中的mapper包放置mapper接口的xml配置文件,这两个包的路径一定要一模一样。然后是util包中的工具类还有src下的核心配置文件。

环境配置



<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.0modelVersion>

  <groupId>com.xjjgroupId>
  <artifactId>Mybatis_002artifactId>
  <version>1.0-SNAPSHOTversion>

  <name>Mybatis_002name>
  
  <url>http://www.example.comurl>

  <properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    <maven.compiler.source>1.8maven.compiler.source>
    <maven.compiler.target>1.8maven.compiler.target>
  properties>

  <dependencies>

    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.12version>
      <scope>testscope>
    dependency>
    
    <dependency>
      <groupId>mysqlgroupId>
      <artifactId>mysql-connector-javaartifactId>
      <version>5.1.6version>
    dependency>
    
    <dependency>
      <groupId>org.mybatisgroupId>
      <artifactId>mybatisartifactId>
      <version>3.2.7version>
    dependency>

  dependencies>

  <build>
    <pluginManagement>
      <plugins>
        
        <plugin>
          <artifactId>maven-clean-pluginartifactId>
          <version>3.1.0version>
        plugin>
        
        <plugin>
          <artifactId>maven-resources-pluginartifactId>
          <version>3.0.2version>
        plugin>
        <plugin>
          <artifactId>maven-compiler-pluginartifactId>
          <version>3.8.0version>
        plugin>
        <plugin>
          <artifactId>maven-surefire-pluginartifactId>
          <version>2.22.1version>
        plugin>
        <plugin>
          <artifactId>maven-jar-pluginartifactId>
          <version>3.0.2version>
        plugin>
        <plugin>
          <artifactId>maven-install-pluginartifactId>
          <version>2.5.2version>
        plugin>
        <plugin>
          <artifactId>maven-deploy-pluginartifactId>
          <version>2.8.2version>
        plugin>
        
        <plugin>
          <artifactId>maven-site-pluginartifactId>
          <version>3.7.1version>
        plugin>
        <plugin>
          <artifactId>maven-project-info-reports-pluginartifactId>
          <version>3.0.0version>
        plugin>
      plugins>
    pluginManagement>
  build>
project>

核心配置文件(mybatis.cfg.xml)



<configuration>
    
    <properties resource="jdbc.properties"/>
  	<settings>
        
        <setting name="logImpl" value="LOG4J"/>
    settings>
    
    <typeAliases>
        <typeAlias type="com.xjj.entity.Student" alias="student"/>
        <package name="com.xjj.entity"/>
    typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driverClassName}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            dataSource>
        environment>
    environments>
    <mappers>
        
        <mapper resource="com/xjj/mapper/StudentMapper.xml"/>
    mappers>
configuration>

实体类(Student)

package com.xjj.entity;

public class Student {

    private Integer student_id;
    private String student_name;

    public Integer getStudent_id() {
        return student_id;
    }

    public void setStudent_id(Integer student_id) {
        this.student_id = student_id;
    }

    public String getStudent_name() {
        return student_name;
    }

    public void setStudent_name(String student_name) {
        this.student_name = student_name;
    }

}

mapper的接口类(StudentMapper)

package com.xjj.mapper;

import com.xjj.entity.Student;
import org.apache.ibatis.annotations.Param;

import java.util.Map;

public interface StudentMapper {
    Student querybyname(String student_name);
    Student querybyidname(@Param("student_id") int student_id,@Param("student_name") String student_name);
    Student querybystudent(Student student);
    Student querybymap(Map<String,Object> map);
    Student querybymanystudent(@Param("student1") Student student1,@Param("student2") Student student2);
}

mapper接口类的xml文件(StudentMapper.xml)




<mapper namespace="com.xjj.mapper.StudentMapper">
    
    <select id="querybyname" resultType="com.xjj.entity.Student">
        select * from student where student_name=#{student_name}
    select>
    
    <select id="querybyidname" resultType="com.xjj.entity.Student">
        select * from student where student_name=#{student_name} and student_id=#{student_id}
    select>
    
    <select id="querybystudent" resultType="com.xjj.entity.Student">
        select * from student where student_id=#{student_id} and student_name=#{student_name}
    select>
    
    <select id="querybymap" resultType="com.xjj.entity.Student">
        select * from student where student_id=#{map_student_id} and student_name=#{map_student_name}
    select>
    
    <select id="querybymanystudent" resultType="com.xjj.entity.Student">
        select * from student where student_id=#{student1.student_id} and student_name=#{student2.student_name}
    select>
mapper>

工具类(Util)

package com.xjj.util;

import java.io.IOException;
import java.io.InputStream;

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 Util {
    private static SqlSessionFactory  sqlSessionFactory;       //保证是一个单例
    static {
        String resource="mybatis.cfg.xml";
        InputStream in=null;
        try {
            in=Resources.getResourceAsStream(resource);
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(in!=null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public static SqlSession getSession() {
        return sqlSessionFactory.openSession();
    }
}

jdbc连接配置

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8
username=root
password=123

log4j配置

log4j.rootLogger=ERROR, stdout
log4j.logger.com.xjj.mapper=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

测试类(AppTest)

package com.xjj;

import com.xjj.entity.Student;
import com.xjj.mapper.StudentMapper;
import com.xjj.util.Util;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;


public class AppTest 
{
    @Test
    public void demo() {
        SqlSession sqlSession= Util.getSession();
        StudentMapper studentmapper=sqlSession.getMapper(StudentMapper.class);
        Student stu;
        stu=studentmapper.querybyname("上");
        System.out.println("学生id:"+stu.getStudent_id()+",学生姓名:"+stu.getStudent_name());
        stu=studentmapper.querybyidname(2,"上山");
        System.out.println("学生id:"+stu.getStudent_id()+",学生姓名:"+stu.getStudent_name());
        Student student1=new Student();
        student1.setStudent_id(4);
        student1.setStudent_name("上杉");
        stu=studentmapper.querybystudent(student1);
        System.out.println("学生id:"+stu.getStudent_id()+",学生姓名:"+stu.getStudent_name());
        Student student2=new Student();
        student2.setStudent_id(5);
        student2.setStudent_name("上杉");
        stu=studentmapper.querybymanystudent(student1,student2);
        System.out.println("学生id:"+stu.getStudent_id()+",学生姓名:"+stu.getStudent_name());
        Map<String,Object> map=new HashMap<>();
        map.put("map_student_id",3);
        map.put("map_student_name","上山越");
        stu=studentmapper.querybymap(map);
        System.out.println("学生id:"+stu.getStudent_id()+",学生姓名:"+stu.getStudent_name());
        sqlSession.commit();
        sqlSession.close();
    }
}

标签使用(在简单实例上进行修改)

mapper接口类(StudentMapper)

package com.xjj.mapper;

import com.xjj.entity.Student;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface StudentMapper {
    List<Student> query_where(@Param("student_id")int student_id, @Param("student_name")String student_name);
    void update_set(Student student);
    Student query_choose(Student student);
    List<Student> query_trim(@Param("student_id")int student_id, @Param("student_name")String student_name);
    List<Student> query_foreach(List<Integer> list);
    List<Student> query_like1(@Param("student_name")String student_name);
    List<Student> query_like2(@Param("student_name")String student_name);
    List<Student> query_like3(@Param("student_name")String student_name);
}

mapper接口类的xml文件(StudentMapper.xml)




<mapper namespace="com.xjj.mapper.StudentMapper">
    
    <sql id="baseColumn">
        student_id,student_name
    sql>
    
    <select id="query_where" resultType="com.xjj.entity.Student">
        select 
        <include refid="baseColumn"/>
        from student
        <where>
            <if test="student_id!=0 and student_id!=''">
                and student_id=#{student_id}
            if>
            <if test="student_name!=null">
                and student_name=#{student_name}
            if>
        where>
    select>
    
    <update id="update_set">
        update student
        <set>
            <if test="student_name!='' and student_name!=null">
                student_name=#{student_name},
            if>
        set>
        where student_id=#{student_id}
    update>
    
    <select id="query_choose" resultType="com.xjj.entity.Student">
        select * from student
        <where>
            <choose>
                <when test="student_id!=0 and student_id!=null">
                    and student_id=#{student_id}
                when>
                <when test="student_name!=null and student_name!=''">
                    and student_name=#{student_name}
                when>
                <otherwise>
                    and student_id=1
                otherwise>
            choose>
        where>
    select>
    
    <select id="query_trim" resultType="com.xjj.entity.Student">
        select * from student
        <trim prefix="where" suffixOverrides="and">
            <if test="student_id!=0 and student_id!=null">
                student_id=#{student_id} and
            if>
            <if test="student_name!=null and student_name!=''">
                student_name=#{student_name} and
            if>
        trim>
    select>
    
    <select id="query_foreach" resultType="com.xjj.entity.Student">
        select * from student
        <where>
            student_id in 
            <foreach collection="list" open="(" close=")" item="item" separator=",">
                #{item}
            foreach>
        where>
    select>
    
    <select id="query_like1" resultType="com.xjj.entity.Student">
        select * from student
        where student_name like #{student_name}
    select>
    
    <select id="query_like2" resultType="com.xjj.entity.Student">
        select * from student
        where student_name like concat('%',#{student_name},'%')
    select>
    
    <select id="query_like3" resultType="com.xjj.entity.Student">
            <bind name="student_name" value="'%'+student_name+'%'"/>
        select * from student 
        where student_name like #{student_name} 
    select>
mapper>

测试类(AppTest)

package com.xjj;

import com.xjj.entity.Student;
import com.xjj.mapper.StudentMapper;
import com.xjj.util.Util;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;

public class AppTest 
{
    @Test
    public void query_where() {
        SqlSession sqlSession= Util.getSession();
        StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
        List<Student> stu1=mapper.query_where(0,"上杉越");
        System.out.println(stu1);
        List<Student> stu2=mapper.query_where(5,null);
        System.out.println(stu2);
        List<Student> stu3=mapper.query_where(5,"上杉越");
        System.out.println(stu3);
        sqlSession.close();
    }
    @Test
    public void update_set(){
        SqlSession sqlSession=Util.getSession();
        StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
        Student stu=new Student();
        stu.setStudent_id(1);
        stu.setStudent_name("路明非");
        mapper.update_set(stu);
        System.out.println(mapper.query_where(1,"路明非"));
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void query_choose(){
        SqlSession sqlSession=Util.getSession();
        StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
        Student stu1=new Student();
        stu1.setStudent_id(1);
        System.out.println(mapper.query_choose(stu1));
        Student stu2=new Student();
        stu2.setStudent_name("上杉越");
        System.out.println(mapper.query_choose(stu2));
        Student stu3=new Student();
        System.out.println(mapper.query_choose(stu3));
        sqlSession.close();
    }
    @Test
    public void query_trim(){
        SqlSession sqlSession=Util.getSession();
        StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
        List<Student> stu1=mapper.query_trim(0,"上杉越");
        System.out.println(stu1);
        List<Student> stu2=mapper.query_trim(5,null);
        System.out.println(stu2);
        List<Student> stu3=mapper.query_trim(5,"上杉越");
        System.out.println(stu3);
        sqlSession.close();
    }
    @Test
    public void query_foreach(){
        SqlSession sqlSession=Util.getSession();
        StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
        List<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(5);
        System.out.println(mapper.query_foreach(list));
        sqlSession.close();
    }
    @Test
    public void query_like(){
        SqlSession sqlSession=Util.getSession();
        StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
        System.out.println(mapper.query_like1("%上%"));
        System.out.println(mapper.query_like2("上"));
        System.out.println(mapper.query_like3("上"));
        sqlSession.close();
    }
}

缓存(在简单实例上进行修改)

1、在核心配置中打开二级缓存

<settings>
   <setting name="cacheEnabled" value="true"/>
settings>

2、在mapper的接口类的xml文件中加上缓存标签

<cache/>

3、使实体类实现序列化

public class Student implements Serializable {
    
}

4、关于一级缓存和二级缓存的demo

mapper的接口类(StudentMapper)
package com.xjj.mapper;

import com.xjj.entity.Student;

import java.util.List;

public interface StudentMapper {
    List<Student> query(String student_name);
    void insert(Student student);
}
mapper的接口类的xml文件


<mapper namespace="com.xjj.mapper.StudentMapper">
    <cache/>
    <select id="query" resultType="com.xjj.entity.Student">
        select * from student
        where student_name like concat('%',#{student_name},'%')
    select>
    <insert id="insert">
        insert into student(student_name) values(#{student_name})
    insert>
mapper>
测试类
package com.xjj;
import com.xjj.entity.Student;
import com.xjj.mapper.StudentMapper;
import com.xjj.util.Util;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class AppTest 
{
    /*一级缓存是sqlSession级别的,只有在一个会话中才会生效。
      如果开启了二级缓存,先去二级缓存中尝试命中
      二级缓存未命中时,尝试去一级缓存中命中
      一级缓存也未命中时,再去数据库查询*/
    @Test
    public void cache(){
        SqlSession sqlSession=Util.getSession();
        StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
        System.out.println("未打开二级缓存时,对一级缓存的检测!(先后查询两次相同结果集)");
        System.out.println(mapper.query("山"));
        System.out.println("在一级缓存中未命中,发送了sql语句");
        System.out.println(mapper.query("山"));
        System.out.println("在一级缓存中命中成功,未发送sql语句");
        sqlSession.close();
    }
    @Test
    public void cache_invalid1(){
        System.out.println("未打开二级缓存时,一级缓存方式失效1(关闭sqlSession会话)");
        SqlSession sqlSession=Util.getSession();
        StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
        System.out.println(mapper.query("山"));
        System.out.println("在一级缓存中未命中,发送了sql语句");
        sqlSession.close();
        System.out.println("关闭了sqlSession会话,清空了一级缓存");
        sqlSession=Util.getSession();
        mapper=sqlSession.getMapper(StudentMapper.class);
        System.out.println(mapper.query("山"));
        System.out.println("在一级缓存中未命中,发送了sql语句");
        sqlSession.close();
    }
    @Test
    public void cache_invalid2(){
        System.out.println("未打开二级缓存时,一级缓存方式失效2(两次查询之间加入增删改操作)");
        SqlSession sqlSession=Util.getSession();
        StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
        System.out.println(mapper.query("山"));
        System.out.println("在一级缓存中未命中,发送sql语句");
        Student student=new Student();
        student.setStudent_name("昂热");
        mapper.insert(student);
        System.out.println("出现了增删改操作,导致一级缓存失效");
        System.out.println(mapper.query("山"));
        System.out.println("在一级缓存中未命中,发送sql语句");
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void cache_invalid3(){
        System.out.println("未打开二级缓存时,一级缓存方式失效3(强制清空缓存)");
        SqlSession sqlSession=Util.getSession();
        StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
        System.out.println(mapper.query("山"));
        System.out.println("在一级缓存中未命中,发送了sql语句");
        sqlSession.clearCache();
        System.out.println("强制清空了缓存");
        System.out.println(mapper.query("山"));
        System.out.println("在一级缓存中未命中,发送了sql语句");
        sqlSession.close();
    }
    @Test
    public  void cache2(){
        System.out.println("打开二级缓存");

        SqlSession sqlSession1=Util.getSession();
        StudentMapper mapper1=sqlSession1.getMapper(StudentMapper.class);
        System.out.println(mapper1.query("上"));
        System.out.println("在二级和一级缓存中都未命中,发送sql语句,关闭sqlSession对话,相当于清除了一级缓存");
        sqlSession1.close();
        SqlSession sqlSession2=Util.getSession();
        StudentMapper mapper2=sqlSession2.getMapper(StudentMapper.class);
        System.out.println(mapper2.query("上"));
        System.out.println("在二级缓存中命中成功,不发送sql语句");
        sqlSession2.close();
    }
}

表和表之间的关系

1对1

地址表Address
package com.xjj.entity;

import java.io.Serializable;

public class Address implements Serializable {
    /*如果存在外键,就让外键作为一个对象类的属性。*/
    private Integer address_id;
    private String address_country;
    private Person person_id;
    public Integer getAddress_id() {
        return address_id;
    }

    public void setAddress_id(Integer address_id) {
        this.address_id = address_id;
    }

    public String getAddress_country() {
        return address_country;
    }

    public void setAddress_country(String address_country) {
        this.address_country = address_country;
    }

    public Person getPerson_id() {
        return person_id;
    }

    public void setPerson_id(Person person_id) {
        this.person_id = person_id;
    }

}
个人表Person
package com.xjj.entity;

import java.io.Serializable;

public class Person implements Serializable {
    private Integer person_id;
    private String person_name;
    private Integer person_age;
    public Integer getPerson_id() {
        return person_id;
    }

    public void setPerson_id(Integer person_id) {
        this.person_id = person_id;
    }

    public String getPerson_name() {
        return person_name;
    }

    public void setPerson_name(String person_name) {
        this.person_name = person_name;
    }

    public Integer getPerson_age() {
        return person_age;
    }

    public void setPerson_age(Integer person_age) {
        this.person_age = person_age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "person_id=" + person_id +
                ", person_name='" + person_name + '\'' +
                ", person_age=" + person_age +
                '}';
    }
}
详细个人表PersonAndAddress
package com.xjj.entity;

public class PersonAndAddress extends Person{
    /*如果想要查询人的时候同时查到详细信息,就调用这个类。
    否则只调用个人表就行了。*/
    private Address address;

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person{" +
                "person_id=" + getPerson_id() +
                ", person_name='" + getPerson_name() + '\'' +
                ", person_age=" + getPerson_age() +
                '}'+"PersonAndAddress{" +
                "address=" + address +
                '}';
    }
}

PersonMapper.java
package com.xjj.mapper;

import com.xjj.entity.PersonAndAddress;
import org.apache.ibatis.annotations.Param;

public interface PersonMapper {
    PersonAndAddress QueryByPersonId(@Param("person_id")int person_id);     /*直接1对1两表之间查询*/
    PersonAndAddress QueryByStep(@Param("person_id")int person_id);     /*分步查询*/
}

PersonMapper.xml


<mapper namespace="com.xjj.mapper.PersonMapper">
    <cache/>
    
    <resultMap id="Person" type="com.xjj.entity.PersonAndAddress">
        
        <id property="person_id" column="person_id"/>
        <result property="person_name" column="person_name"/>
        <result property="person_age" column="person_age"/>
    resultMap>
    <resultMap id="PersonAndAddress" extends="Person" type="com.xjj.entity.PersonAndAddress">
        
        <association property="address" javaType="com.xjj.entity.Address">
            
            <id property="address_id" column="address_id"/>
            <result property="address_country" column="address_country"/>
        association>
    resultMap>
    <select id="QueryByPersonId" resultMap="PersonAndAddress">
        select
        person.person_id,person.person_name,person.person_age,
        address.address_id,address.address_country
        from
        person,address
        where
        person.person_id=address.person_id
        and
        person.person_id=#{person_id}
    select>
    
    <resultMap id="Step1" extends="Person" type="com.xjj.entity.PersonAndAddress">
        <association property="address" column="person_id" select="com.xjj.mapper.AddressMapper.queryByStep"/>
    resultMap>
    <select id="QueryByStep" resultMap="Step1">
        select
        person_id,person_name,person_age
        from
        person
        where
        person_id=#{person_id}
    select>
mapper>
AddressMapper.java
package com.xjj.mapper;

import com.xjj.entity.Address;
import org.apache.ibatis.annotations.Param;

public interface AddressMapper {
    Address queryByStep(@Param("person_id")int person_id);
}

AddressMapper.xml


<mapper namespace="com.xjj.mapper.AddressMapper">
    <cache/>
    <select id="queryByStep" resultType="com.xjj.entity.Address">
        select *
        from address
        where
        person_id=#{person_id}
    select>
mapper>

1对多

个人表Person
package com.xjj.entity;

import java.io.Serializable;

public class Person implements Serializable {
    private Integer person_id;
    private String person_name;
    private Integer person_age;
    public Integer getPerson_id() {
        return person_id;
    }

    public void setPerson_id(Integer person_id) {
        this.person_id = person_id;
    }

    public String getPerson_name() {
        return person_name;
    }

    public void setPerson_name(String person_name) {
        this.person_name = person_name;
    }

    public Integer getPerson_age() {
        return person_age;
    }

    public void setPerson_age(Integer person_age) {
        this.person_age = person_age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "person_id=" + person_id +
                ", person_name='" + person_name + '\'' +
                ", person_age=" + person_age +
                '}';
    }
}

任务表Task
package com.xjj.entity;


public class Task {
    private Integer task_id;
    private String task_content;
    private Person person;  /*逻辑外键用对象设置*/
    public Integer getTask_id() {
        return task_id;
    }

    public void setTask_id(Integer task_id) {
        this.task_id = task_id;
    }

    public String getTask_content() {
        return task_content;
    }

    public void setTask_content(String task_content) {
        this.task_content = task_content;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    @Override
    public String toString() {
        return "Task{" +
                "task_id=" + task_id +
                ", task_content='" + task_content + '\'' +
                ", person=" + person ;
    }
}

详细个人表PersonAndTask
package com.xjj.entity;

import java.util.List;

public class PersonAndTask extends Person{
    private List<Task> task;    /*对多的关系的时候用List*/

    public List<Task> getTask() {
        return task;
    }

    public void setTask(List<Task> task) {
        this.task = task;
    }

    @Override
    public String toString() {
        return "Person{" +
                "person_id=" + getPerson_id() +
                ", person_name='" + getPerson_name() + '\'' +
                ", person_age=" + getPerson_age() +
                '}'+"PersonAndTask{" +
                "task=" + task +
                '}';
    }
}

PersonMapper.java
package com.xjj.mapper;

import com.xjj.entity.PersonAndTask;
import org.apache.ibatis.annotations.Param;

public interface PersonMapper {
    PersonAndTask QueryByPersonId(@Param("person_id")int person_id);
}

PersonMapper.xml


<mapper namespace="com.xjj.mapper.PersonMapper">
    <resultMap id="Person" type="com.xjj.entity.Person">
        <id property="person_id" column="person_id"/>
        <result property="person_name" column="person_name"/>
        <result property="person_age" column="person_age"/>
    resultMap>
    <resultMap id="PersonAndTaskAndComment" extends="Person" type="com.xjj.entity.PersonAndTask">
        
        <collection property="task" ofType="com.xjj.entity.Task">
            <id property="task_id" column="task_id"/>
            <result property="task_content" column="task_content"/>
        collection>
    resultMap>
    <select id="QueryByPersonId" resultMap="PersonAndTaskAndComment">
        select
        person.person_id,person.person_name,person.person_age,
        task.task_id,task.task_content,
        comment.comment_id,comment.comment_content
        from  person,task,comment
        where
        person.person_id=task.person_id
        and
        task.task_id=comment.task_id
        and
        person.person_id=#{person_id}
    select>
mapper>

Spring详解

IOC

概念:控制反转(inverse of control)什么控制,谁反转了谁

控制:创建对象,彼此关系的权利

控制权是在开发者在程序代码中进行掌控。new

夺取控制权反转给Spring的容器。

在Spring容器中声明要什么,在Spring容器中进行具体的控制。

Spring标签和数据的注入

环境配置



<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.0modelVersion>

  <groupId>com.xjjgroupId>
  <artifactId>Spring_002artifactId>
  <version>1.0-SNAPSHOTversion>

  <name>Spring_002name>
  
  <url>http://www.example.comurl>

  <properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    <maven.compiler.source>1.8maven.compiler.source>
    <maven.compiler.target>1.8maven.compiler.target>
  properties>

  <dependencies>
    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.12version>
      <scope>testscope>
    dependency>
    
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-contextartifactId>
      <version>5.1.5.RELEASEversion>
    dependency>
    

  dependencies>

  <build>
    <pluginManagement>
      <plugins>
        
        <plugin>
          <artifactId>maven-clean-pluginartifactId>
          <version>3.1.0version>
        plugin>
        
        <plugin>
          <artifactId>maven-resources-pluginartifactId>
          <version>3.0.2version>
        plugin>
        <plugin>
          <artifactId>maven-compiler-pluginartifactId>
          <version>3.8.0version>
        plugin>
        <plugin>
          <artifactId>maven-surefire-pluginartifactId>
          <version>2.22.1version>
        plugin>
        <plugin>
          <artifactId>maven-jar-pluginartifactId>
          <version>3.0.2version>
        plugin>
        <plugin>
          <artifactId>maven-install-pluginartifactId>
          <version>2.5.2version>
        plugin>
        <plugin>
          <artifactId>maven-deploy-pluginartifactId>
          <version>2.8.2version>
        plugin>
        
        <plugin>
          <artifactId>maven-site-pluginartifactId>
          <version>3.7.1version>
        plugin>
        <plugin>
          <artifactId>maven-project-info-reports-pluginartifactId>
          <version>3.0.0version>
        plugin>
      plugins>
    pluginManagement>
  build>
project>

Person类

package com.xjj;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Person {
    private String name;
    private String ancestry;
    private Friend[] array_friends;
    private List<Friend> list_friends;
    private Set<Friend> set_friedns;
    private Map<String,Friend> map_friends;
    public Person(){

    }
    public Person(String name, String ancestry) {
        System.out.println(name+"出生....");
        this.name = name;
        this.ancestry = ancestry;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println(name+"出生....");
        this.name = name;
    }

    public String getAncestry() {
        return ancestry;
    }

    public void setAncestry(String ancestry) {
        this.ancestry = ancestry;
    }

    public Friend[] getArray_friends() {
        return array_friends;
    }

    public void setArray_friends(Friend[] array_friends) {
        this.array_friends = array_friends;
    }

    public List<Friend> getList_friends() {
        return list_friends;
    }

    public void setList_friends(List<Friend> list_friends) {
        this.list_friends = list_friends;
    }

    public Set<Friend> getSet_friedns() {
        return set_friedns;
    }

    public void setSet_friedns(Set<Friend> set_friedns) {
        this.set_friedns = set_friedns;
    }

    public Map<String, Friend> getMap_friends() {
        return map_friends;
    }

    public void setMap_friends(Map<String, Friend> map_friends) {
        this.map_friends = map_friends;
    }

    public void destory(){
        if(getName().equals("大地与山之王")){
            System.out.println("夏弥死了,师兄很伤心....");
        }
        else
            if(getName().equals("青铜与火之王")){
                System.out.println("老唐死了,路明非很伤心....");
            }
    }

    public void init(){
        if (getName().equals("路明非")){
            System.out.println("路明非的安然出生,是一种大家都不敢相信的奇迹....");
        }
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", ancestry='" + ancestry + '\'';
    }
}

Friend类

package com.xjj;

public class Friend {
    private String name;
    private String skill;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }

    @Override
    public String toString() {
        return "Friend{" +
                "name='" + name + '\'' +
                ", skill='" + skill + '\'' +
                '}';
    }
}

bean.xml


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="lw" class="com.xjj.Person" abstract="true">   
        <property name="ancestry" value="龙王"/>
    bean>
    
    <bean id="laotang" class="com.xjj.Person" parent="lw" destroy-method="destory">
        <property name="name" value="青铜与火之王"/>
    bean>
    <bean id="xiami" class="com.xjj.Person" parent="lw" destroy-method="destory">
        <property name="name" value="大地与山之王"/>
    bean>
    
    <bean id="lushanyan" class="com.xjj.Person">
        <constructor-arg name="name" value="路山彦"/>
        <constructor-arg name="ancestry" value="S"/>
    bean>
    
    <bean id="lulincheng" class="com.xjj.Person" depends-on="lushanyan">
        <property name="name" value="路麟成"/>
        <property name="ancestry" value="S"/>
    bean>
    
    <bean id="lumingfei" class="com.xjj.Person" depends-on="lulincheng" lazy-init="true" init-method="init">
        <property name="name" value="路明非"/>
        <property name="ancestry" value="S"/>
    bean>
    
    <bean id="yuanzhinv" class="com.xjj.Person" name="fengjianliuli egui">
        <property name="name" value="源稚女"/>
        <property name="ancestry" value=""/>
    bean>
    
    <bean id="heezuoge" class="com.xjj.Person" name="baiwang" scope="prototype">
        <property name="name" value="赫尔佐格"/>
        <property name="ancestry" value="A"/>
    bean>
    <bean id="chuzihang" class="com.xjj.Person">
        <property name="name" value="楚子航"/>
        <property name="ancestry" value="S"/>
        
        <property name="array_friends">
            <array>
                <bean class="com.xjj.Friend">
                    <property name="name" value="路明非"/>
                    <property name="skill" value="燃烧生命"/>
                bean>
                <bean class="com.xjj.Friend">
                    <property name="name" value="凯撒"/>
                    <property name="skill" value="镰鼬"/>
                bean>
                <bean class="com.xjj.Friend">
                    <property name="name" value="源稚生"/>
                    <property name="skill" value="王权"/>
                bean>
            array>
        property>
        
        <property name="list_friends">
            <list>
                <bean class="com.xjj.Friend">
                    <property name="name" value="路明非"/>
                    <property name="skill" value="燃烧生命"/>
                bean>
                <bean class="com.xjj.Friend">
                    <property name="name" value="凯撒"/>
                    <property name="skill" value="镰鼬"/>
                bean>
                <bean class="com.xjj.Friend">
                    <property name="name" value="源稚生"/>
                    <property name="skill" value="王权"/>
                bean>
            list>
        property>
        
        <property name="set_friedns">
            <set>
                <bean class="com.xjj.Friend">
                    <property name="name" value="路明非"/>
                    <property name="skill" value="燃烧生命"/>
                bean>
                <bean class="com.xjj.Friend">
                    <property name="name" value="凯撒"/>
                    <property name="skill" value="镰鼬"/>
                bean>
                <bean class="com.xjj.Friend">
                    <property name="name" value="源稚生"/>
                    <property name="skill" value="王权"/>
                bean>
            set>
        property>
        
        <property name="map_friends">
            <map>
                <entry key="lumingfei">
                    <bean class="com.xjj.Friend">
                        <property name="name" value="路明非"/>
                        <property name="skill" value="燃烧生命"/>
                    bean>
                entry>
                <entry key="kaisa">
                    <bean class="com.xjj.Friend">
                        <property name="name" value="凯撒"/>
                        <property name="skill" value="镰鼬"/>
                    bean>
                entry>
                <entry key="yuanzhisheng">
                    <bean class="com.xjj.Friend">
                        <property name="name" value="源稚生"/>
                        <property name="skill" value="王权"/>
                    bean>
                entry>
            map>
        property>
    bean>
    <bean id="huiliyi" class="com.xjj.Person" autowire="byName">
        <property name="name" value="绘梨衣"/>
        <property name="ancestry" value=""/>
    bean>
beans>

测试类

package com.xjj;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.Arrays;

public class AppTest 
{
    @Test
    public void test() {
        ApplicationContext ac=new ClassPathXmlApplicationContext(new String[]{"bean1.xml"});
        Person laotang=ac.getBean("laotang",Person.class);
        Person xiami=ac.getBean("xiami",Person.class);
        Person lushanyan=ac.getBean("lushanyan",Person.class);
        Person lulincheng=ac.getBean("lulincheng",Person.class);
        Person lumingfei=ac.getBean("lumingfei",Person.class);
        Person yuanzhinv=ac.getBean("yuanzhinv",Person.class);
        Person fengjianliuli=ac.getBean("fengjianliuli",Person.class);
        Person egui=ac.getBean("egui",Person.class);
        Person hheezuoge=ac.getBean("heezuoge",Person.class);
        Person baiwang=ac.getBean("baiwang",Person.class);
        Person chuzihang=ac.getBean("chuzihang",Person.class);
        System.out.println("老唐是:"+laotang);
        System.out.println("夏弥是:"+xiami);
        System.out.println(lushanyan);
        System.out.println(lulincheng);
        System.out.println(lumingfei);
        System.out.print("源稚女就是风间琉璃:");
        System.out.println(yuanzhinv==fengjianliuli);
        System.out.print("风间琉璃就是恶鬼:");
        System.out.println(fengjianliuli==egui);
        System.out.print("恶鬼就是源稚女:");
        System.out.println(egui==yuanzhinv);
        System.out.print("赫尔佐格就是白王:");
        System.out.println(hheezuoge==baiwang);
        System.out.println(chuzihang);
        System.out.println("楚子航的朋友:"+ Arrays.toString(chuzihang.getArray_friends()));
        System.out.println("楚子航的朋友:"+ chuzihang.getList_friends());
        System.out.println("楚子航的朋友:"+ chuzihang.getSet_friedns());
        System.out.println("楚子航的朋友:"+ chuzihang.getMap_friends());
        ((ClassPathXmlApplicationContext)ac).close();
    }
}

对于其他配置文件的注入

Person类

package com.xjj;

public class Person {
    private String name;
    private String ancestry;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAncestry() {
        return ancestry;
    }

    public void setAncestry(String ancestry) {
        this.ancestry = ancestry;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", ancestry='" + ancestry + '\'' +
                '}';
    }
}

Mysql类

package com.xjj;

public class Mysql {
    private String driverClassName;
    private String url;
    private String username;
    private String password;

    public String getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Mysql{" +
                "driverClassName='" + driverClassName + '\'' +
                ", url='" + url + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

jdbc.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///ssh
jdbc.username=root
jdbc.password=123

spring-bean1.xml


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="yuanzhisheng" class="com.xjj.Person">
        <property name="name" value="源稚生"/>
        <property name="ancestry" value=""/>
    bean>
beans>

spring-bean2.xml


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="yuanzhinv" class="com.xjj.Person">
            <property name="name" value="源稚女"/>
            <property name="ancestry" value=""/>
        bean>
beans>

bean.xml


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:lang="http://www.springframework.org/schema/lang"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:task="http://www.springframework.org/schema/task"
       xmlns:util="http://www.springframework.org/schema/util"

       xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
       http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
       http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">
    
    <context:property-placeholder location="classpath:jdbc.properties"/>
    
    <import resource="spring-bean1.xml"/>
    <import resource="spring-bean2.xml"/>
    <bean id="mysql" class="com.xjj.Mysql">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    bean>
beans>

AOP(XML版本)

Hunt

package com.xjj;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class Hunt {
    public void before(JoinPoint joinPoint){
        System.out.println("出门去准备猎杀:"+joinPoint.getSignature().getName());
    }
    public void afterreturnning(String returnning){
        System.out.println("猎杀成功,获得:"+returnning);
    }
    public void after(){
        System.out.println("成功交付任务物品....");
    }
    public Object around(ProceedingJoinPoint proceedingJoinPoint){
        try {
            System.out.println("检查自己的状态....");
            Object object=proceedingJoinPoint.proceed();
            return object;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            return null;
        }
    }
}

Monster

package com.xjj;

public class Monster {
    public String monster(String name,Integer age){
        System.out.println(age+"岁的"+name+"开始猎杀雷龙....");
        return "雷龙翼";
    }
}

bean.xml


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:lang="http://www.springframework.org/schema/lang"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:task="http://www.springframework.org/schema/task"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
       http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
       http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">
    
    <aop:aspectj-autoproxy/>
    <bean id="hunt" class="com.xjj.Hunt">       

    bean>
    <bean id="monster" class="com.xjj.Monster">        

    bean>
    <aop:config>
        
        <aop:aspect ref="hunt">
            
            
            
            <aop:before method="before" pointcut="execution(* com.xjj.Monster.monster(..))"/>
            
            <aop:after method="after" pointcut="execution(* com.xjj.Monster.monster(..))"/>
            
            <aop:after-returning method="afterreturnning" pointcut="execution(* com.xjj.Monster.monster(..))" returning="returnning"/>
            
            <aop:around method="around" pointcut="execution(* com.xjj.Monster.monster(..))"/>
        aop:aspect>
    aop:config>
beans>

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.0modelVersion>

  <groupId>com.xjjgroupId>
  <artifactId>Spring_002artifactId>
  <version>1.0-SNAPSHOTversion>

  <name>Spring_002name>
  
  <url>http://www.example.comurl>

  <properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    <maven.compiler.source>1.8maven.compiler.source>
    <maven.compiler.target>1.8maven.compiler.target>
  properties>

  <dependencies>
    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.12version>
      <scope>testscope>
    dependency>
    
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-contextartifactId>
      <version>5.1.5.RELEASEversion>
    dependency>
    
    
    <dependency>
      <groupId>org.aspectjgroupId>
      <artifactId>aspectjrtartifactId>
      <version>1.9.2version>
    dependency>
    
    <dependency>
      <groupId>org.aspectjgroupId>
      <artifactId>aspectjweaverartifactId>
      <version>1.9.2version>
    dependency>

  dependencies>

  <build>
    <pluginManagement>
      <plugins>
        
        <plugin>
          <artifactId>maven-clean-pluginartifactId>
          <version>3.1.0version>
        plugin>
        
        <plugin>
          <artifactId>maven-resources-pluginartifactId>
          <version>3.0.2version>
        plugin>
        <plugin>
          <artifactId>maven-compiler-pluginartifactId>
          <version>3.8.0version>
        plugin>
        <plugin>
          <artifactId>maven-surefire-pluginartifactId>
          <version>2.22.1version>
        plugin>
        <plugin>
          <artifactId>maven-jar-pluginartifactId>
          <version>3.0.2version>
        plugin>
        <plugin>
          <artifactId>maven-install-pluginartifactId>
          <version>2.5.2version>
        plugin>
        <plugin>
          <artifactId>maven-deploy-pluginartifactId>
          <version>2.8.2version>
        plugin>
        
        <plugin>
          <artifactId>maven-site-pluginartifactId>
          <version>3.7.1version>
        plugin>
        <plugin>
          <artifactId>maven-project-info-reports-pluginartifactId>
          <version>3.0.0version>
        plugin>
      plugins>
    pluginManagement>
  build>
project>

AOP(注解版本)

Hunt

package com.xjj;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect     /*标记其为一个切面*/
@Component  /*标记这个类为Spring的一个组件,相当于在xml中注册了一个bean一样*/
public class Hunt {
    @Before("execution(* com.xjj.Monster.monster(..))")
    public void before(JoinPoint joinPoint){
        System.out.println("出门去准备猎杀:"+joinPoint.getSignature().getName());
    }
    @AfterReturning(value = "execution(* com.xjj.Monster.monster(..))",returning = "returnning")
    public void afterreturnning(String returnning){
        System.out.println("猎杀成功,获得:"+returnning);
    }
   @After("execution(* com.xjj.Monster.monster(..))")
    public void after(JoinPoint joinPoint){
        System.out.println("成功交付任务物品:"+joinPoint.getSignature().getName());
    }
    @Around("execution(* com.xjj.Monster.monster(..))")
    public Object around(ProceedingJoinPoint proceedingJoinPoint){
        try {
            System.out.println("检查自己的状态....");
            Object object=proceedingJoinPoint.proceed();
            return object;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            return null;
        }
    }
}

Monster

package com.xjj;

import org.springframework.stereotype.Component;

@Component
public class Monster {
    public String monster(String name,Integer age){
        System.out.println(age+"岁的"+name+"开始猎杀雷龙....");
        return "雷龙翼";
    }
}

bean.xml


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:lang="http://www.springframework.org/schema/lang"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:task="http://www.springframework.org/schema/task"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
       http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
       http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">
    
    <aop:aspectj-autoproxy/>
    
    <context:component-scan base-package="com.xjj"/>
beans>

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.0modelVersion>

  <groupId>com.xjjgroupId>
  <artifactId>Spring_002artifactId>
  <version>1.0-SNAPSHOTversion>

  <name>Spring_002name>
  
  <url>http://www.example.comurl>

  <properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    <maven.compiler.source>1.8maven.compiler.source>
    <maven.compiler.target>1.8maven.compiler.target>
  properties>

  <dependencies>
    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.12version>
      <scope>testscope>
    dependency>
    
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-contextartifactId>
      <version>5.1.5.RELEASEversion>
    dependency>
    
    
    <dependency>
      <groupId>org.aspectjgroupId>
      <artifactId>aspectjrtartifactId>
      <version>1.9.2version>
    dependency>
    
    <dependency>
      <groupId>org.aspectjgroupId>
      <artifactId>aspectjweaverartifactId>
      <version>1.9.2version>
    dependency>

  dependencies>

  <build>
    <pluginManagement>
      <plugins>
        
        <plugin>
          <artifactId>maven-clean-pluginartifactId>
          <version>3.1.0version>
        plugin>
        
        <plugin>
          <artifactId>maven-resources-pluginartifactId>
          <version>3.0.2version>
        plugin>
        <plugin>
          <artifactId>maven-compiler-pluginartifactId>
          <version>3.8.0version>
        plugin>
        <plugin>
          <artifactId>maven-surefire-pluginartifactId>
          <version>2.22.1version>
        plugin>
        <plugin>
          <artifactId>maven-jar-pluginartifactId>
          <version>3.0.2version>
        plugin>
        <plugin>
          <artifactId>maven-install-pluginartifactId>
          <version>2.5.2version>
        plugin>
        <plugin>
          <artifactId>maven-deploy-pluginartifactId>
          <version>2.8.2version>
        plugin>
        
        <plugin>
          <artifactId>maven-site-pluginartifactId>
          <version>3.7.1version>
        plugin>
        <plugin>
          <artifactId>maven-project-info-reports-pluginartifactId>
          <version>3.0.0version>
        plugin>
      plugins>
    pluginManagement>
  build>
project>

SpringMvc详解

环境配置



<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.0modelVersion>

  <groupId>com.xjjgroupId>
  <artifactId>SpringMvc_001artifactId>
  <version>1.0-SNAPSHOTversion>
  <packaging>warpackaging>

  <name>SpringMvc_001 Maven Webappname>
  
  <url>http://www.example.comurl>

  <properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    <maven.compiler.source>1.8maven.compiler.source>
    <maven.compiler.target>1.8maven.compiler.target>
  properties>

  <dependencies>
    
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-webmvcartifactId>
      <version>5.0.8.RELEASEversion>
    dependency>
    
    <dependency>
      <groupId>javax.servletgroupId>
      <artifactId>javax.servlet-apiartifactId>
      <version>4.0.0-b01version>
      <scope>providedscope>
    dependency>

  dependencies>

  <build>
    <finalName>SpringMvc_001finalName>
    <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-clean-pluginartifactId>
          <version>3.1.0version>
        plugin>
        
        <plugin>
          <artifactId>maven-resources-pluginartifactId>
          <version>3.0.2version>
        plugin>
        <plugin>
          <artifactId>maven-compiler-pluginartifactId>
          <version>3.8.0version>
        plugin>
        <plugin>
          <artifactId>maven-surefire-pluginartifactId>
          <version>2.22.1version>
        plugin>
        <plugin>
          <artifactId>maven-war-pluginartifactId>
          <version>3.2.2version>
        plugin>
        <plugin>
          <artifactId>maven-install-pluginartifactId>
          <version>2.5.2version>
        plugin>
        <plugin>
          <artifactId>maven-deploy-pluginartifactId>
          <version>2.8.2version>
        plugin>
      plugins>
    pluginManagement>
  build>
project>

web.xml(注册特殊的前端控制器)


<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">
  
  
  <servlet>
    
    <servlet-name>springmvcservlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    <init-param>
      
      <param-name>contextConfigLocationparam-name>
      <param-value>classpath:springmvc.xmlparam-value>
    init-param>
  servlet>
  
  <servlet-mapping>
    <servlet-name>springmvcservlet-name>
    
    
    <url-pattern>/url-pattern>
  servlet-mapping>
  
  <filter>
    <filter-name>encodingFilterfilter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    <init-param>
      <param-name>encodingparam-name>
      <param-value>UTF-8param-value>
    init-param>
    <init-param>
      <param-name>forceEncodingparam-name>
      <param-value>trueparam-value>
    init-param>
  filter>
  <filter-mapping>
    <filter-name>encodingFilterfilter-name>
    <url-pattern>/*url-pattern>
  filter-mapping>
  
  <filter>
    <filter-name>hiddenHttpMethodFilterfilter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
  filter>
  <filter-mapping>
    <filter-name>hiddenHttpMethodFilterfilter-name>
    <url-pattern>/*url-pattern>
  filter-mapping>
web-app>

springmvc的配置文件


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:lang="http://www.springframework.org/schema/lang"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:task="http://www.springframework.org/schema/task"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
       http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
       http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        
        <property name="prefix" value="/jsp/"/>
        <property name="suffix" value=".jsp"/>
    bean>
    
    <bean class="com.xjj.controller.Controller" name="/controller">

    bean>
    
    <context:component-scan base-package="com.xjj.controller"/>

    
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven/>
beans>

控制器

普通版本控制器

package com.xjj.controller;

import org.springframework.web.servlet.ModelAndView;

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

public class Controller implements org.springframework.web.servlet.mvc.Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mav=new ModelAndView();
        System.out.println("传统方式....");
        mav.addObject("girl","上杉绘梨衣");  /*添加一个值*/
        mav.setViewName("person");  /*设置返回的页面名字,设置逻辑视图中的logicViewName*/
        return mav;
    }
}

注解版本控制器

package com.xjj.controller;

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.WebRequest;

import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.Date;

@Controller
@RequestMapping("/controller")
public class Controller2 {
    @RequestMapping("/forwardtojsp")        /*默认方法,通过url请求进来,然后直接forward跳转到jsp页面出去*/
    public String function1(Model model){
        model.addAttribute("girl","夏弥");
        System.out.println("forwardjsp....");
        return "person";                    /*直接写要跳转页面的logicViewName,在springmvc的配置文件中会组装成物理路径*/
    }
    @RequestMapping("/redirecttojsp")       /*重定向到别的jsp页面,通过url请求进来,然后redirect跳转到jsp页面出去*/
    public String function2(Model model){
        model.addAttribute("girl","零");     /*由于是重定向,所以不会把值传过去,所以不显示零的名字*/
        System.out.println("redirectjsp....");
        return "redirect:/jsp/person.jsp";  /*由于重定向必须要添加redirect,但是这样子就不被springmvc的前置和后置所限制了,所以自己要写全路径*/
    }
    @RequestMapping("/forwardtourl")         /*转发到别的url,相当于再次对控制器发起请求,forward的方式*/
    public String function3(Model model){
        model.addAttribute("girl","酒德麻衣");  /*转发过去的时候会被下一个页面所覆盖,所以不会出现酒德麻衣的名字*/
        System.out.println("forword控制器....");
        return "forward:/controller";       /*写一个forward,然后后面跟上请求的url地址就行了*/
    }
    @RequestMapping(value={"/value1","/value2","/value3"},method={RequestMethod.GET,RequestMethod.POST},params = {"name=酒德麻衣"})
    /*为了检验webrequest和websession,从表单提交过来可以使用webrequest获取,然后使用httpsession重定向传出去。
      value为这个url指定了多个的请求路径,不只是某一个url可以进来。
      method是指定只能通过什么方法来进入,比如说get还是posy方法。
      而param是指定必须要有这个变量传进来,不然会报错,并且可以指定值等于某一个东西或者不等于某个东西。*/
    public String function4(Model model, WebRequest webRequest,HttpSession httpSession){
        System.out.println(webRequest.getParameter("name"));
        httpSession.setAttribute("girl",webRequest.getParameter("name"));
        return "redirect:/jsp/person.jsp";
    }
    @RequestMapping(value={"/value1?","/value2*","/value3/**"})
    public String function5(Model model){
        model.addAttribute("girl","苏恩曦");
        /*
         ?代表一个不包括/的非空任意字符。
         *代表无数个不包括/的可以为空任意字符。如果是‘/*’,那么代表可以往下弄一层,即限定死格式为/无数多个任意字符但是不包括/。
         **代表无数个无数级的可以为空任意字符可以任意包含/,但是一定要在**之前加上一个/。
         如果两个@RequestMapping的value值是一样的,那么就靠param来区别。根据param来选择使用哪一个。
         */
        return "person";
    }
    @RequestMapping("/pathvariable/{name}/{ancestry}")  /*可以是/pathvariable/name/ancetry来传值会自动被@PathVariable收走*/
    public String function6(@PathVariable("name")String name,@PathVariable("ancestry")String ancestry,Model model){
        System.out.println(name+"的血统为:"+ancestry);
        model.addAttribute("girl",name);
        return "person";
    }
    /*如果当表单上传时带有时间,那一定要加上这个方法,可以转化时间格式,否则在function7方法中取不出来,只能使用一种时间格式,但是可以自己选择使用哪种*/
    @InitBinder
    public void sdf1(WebDataBinder dataBinder){
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setLenient(false);
        dataBinder.registerCustomEditor(Date.class,new CustomDateEditor(sdf,false));
    }
    @PutMapping("/put")
    @ResponseBody       /*可以不返回页面,改成返回值*/
    public String function7(String name, @RequestParam("ancestry")String ancestry,Date date,@ModelAttribute Person person){
        /*form表单提交数据
          1、使用形参的名称法由表单传入值,即表单属性和形参属性名字一样
          2、使用@RequestParam注释,其中的属性名字和表单中属性名字要一致
          3、使用pojo直接注入属性来获得前台传值。只要表单中的属性和pojo类的属性一样就会自动注入进去*/
        System.out.println(person.getName()+"的血统为:"+person.getAncestry()+person.getDate());
        System.out.println(name+"的血统为:"+ancestry+date);
        return name;
    }
    @ModelAttribute
    /*这个方法中会保存对象,而这个方法会在每次调用controller请求的时候自行调用,即这些对象从到头为一直存在
      在下面的方法中检验了这些保存的对象是否存在,结果都为true,并且可以通过该注解将该对象注入到形参中,如果表单中有数据传递过来,那么会被表单中的数据所顶替*/
    public void function8(Model model){
        Person person=new Person();
        person.setName("楚子航");
        person.setAncestry("S");
        model.addAttribute("person",person);
    }
    @RequestMapping("/modelattribute")
    public String function8_1(@ModelAttribute Person person){
        System.out.println(person.getName()+"的血统为:"+person.getAncestry());
        return "person";
    }
}

用来获取路径的servlet

package com.xjj.controller;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

@WebServlet(urlPatterns = {},loadOnStartup = 2)
public class WebPathServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException{
        /*在整体应用上下文之中存储一个引用上下文路径的变量classpath,并且会自动生成以为是init方法,这个就相当于本项目的webapp,直接问往下推就可以了*/
        config.getServletContext().setAttribute("classpath",config.getServletContext().getContextPath());
        super.init(config);
    }
}

pojo类

package com.xjj.controller;

import java.util.Date;

public class Person {
    private String name;
    private String ancestry;
    private Date date;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAncestry() {
        return ancestry;
    }

    public void setAncestry(String ancestry) {
        this.ancestry = ancestry;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

jsp页面

表单页面

<%--
  Created by IntelliJ IDEA.
  User: 徐敬杰
  Date: 2019/7/18
  Time: 10:17
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


    post请求
    
姓名
put请求
姓名
血统
时间

显示页面

<%--
  Created by IntelliJ IDEA.
  User: 徐敬杰
  Date: 2019/7/18
  Time: 9:52
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <link rel="stylesheet" href="${classpath}/static/css/person.css">
    <title>Title</title>
</head>
<body>
    <div>这个女孩子是:${girl}</div>
</body>
</html>

静态代码

div{
    background-color: green;
}

文件结构

SSM_第2张图片

SSM整合步骤

1、环境配置,pom.xml导入依赖



<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.0modelVersion>

  <groupId>com.xjjgroupId>
  <artifactId>SSMDemo_001artifactId>
  <version>1.0-SNAPSHOTversion>
  <packaging>warpackaging>

  <name>SSMDemo_001 Maven Webappname>
  
  <url>http://www.example.comurl>

  <properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    <maven.compiler.source>1.8maven.compiler.source>
    <maven.compiler.target>1.8maven.compiler.target>
    <spring.version>5.0.8.RELEASEspring.version>
    <jackson.version>2.9.3jackson.version>
  properties>

  <dependencies>
    
    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.12version>
      <scope>testscope>
    dependency>
    
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-coreartifactId>
      <version>${spring.version}version>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-contextartifactId>
      <version>${spring.version}version>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-context-supportartifactId>
      <version>${spring.version}version>
    dependency>

    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-beansartifactId>
      <version>${spring.version}version>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-webartifactId>
      <version>${spring.version}version>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-webmvcartifactId>
      <version>${spring.version}version>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-aopartifactId>
      <version>${spring.version}version>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-aspectsartifactId>
      <version>${spring.version}version>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-jdbcartifactId>
      <version>${spring.version}version>
    dependency>
    
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-txartifactId>
      <version>${spring.version}version>
    dependency>
    
    <dependency>
      <groupId>com.fasterxml.jackson.coregroupId>
      <artifactId>jackson-databindartifactId>
      <version>${jackson.version}version>
    dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.coregroupId>
      <artifactId>jackson-coreartifactId>
      <version>${jackson.version}version>
    dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.coregroupId>
      <artifactId>jackson-annotationsartifactId>
      <version>${jackson.version}version>
    dependency>
    
    <dependency>
      <groupId>net.sf.json-libgroupId>
      <artifactId>json-libartifactId>
      <version>2.4version>
      <classifier>jdk15classifier>
    dependency>
    
    <dependency>
      <groupId>org.codehaus.jacksongroupId>
      <artifactId>jackson-core-aslartifactId>
      <version>1.9.2version>
    dependency>
    <dependency>
      <groupId>org.codehaus.jacksongroupId>
      <artifactId>jackson-mapper-aslartifactId>
      <version>1.9.2version>
    dependency>
    
    <dependency>
      <groupId>commons-fileuploadgroupId>
      <artifactId>commons-fileuploadartifactId>
      <version>1.3.1version>
    dependency>
    
    <dependency>
      <groupId>mysqlgroupId>
      <artifactId>mysql-connector-javaartifactId>
      <version>5.1.6version>
    dependency>
    <dependency>
      <groupId>org.mybatisgroupId>
      <artifactId>mybatisartifactId>
      <version>3.2.7version>
    dependency>
    
    <dependency>
      <groupId>org.slf4jgroupId>
      <artifactId>slf4j-apiartifactId>
      <version>1.7.12version>
    dependency>
    <dependency>
      <groupId>org.slf4jgroupId>
      <artifactId>slf4j-log4j12artifactId>
      <version>1.7.12version>
    dependency>
    <dependency>
      <groupId>log4jgroupId>
      <artifactId>log4jartifactId>
      <version>1.2.17version>
    dependency>
    
    <dependency>
      <groupId>com.mchangegroupId>
      <artifactId>c3p0artifactId>
      <version>0.9.2.1version>
    dependency>
    
    <dependency>
      <groupId>org.mybatisgroupId>
      <artifactId>mybatis-springartifactId>
      <version>1.3.0version>
    dependency>
    
    <dependency>
      <groupId>javax.servletgroupId>
      <artifactId>javax.servlet-apiartifactId>
      <version>3.1.0version>
      <scope>providedscope>
    dependency>
    <dependency>
      <groupId>javax.servlet.jspgroupId>
      <artifactId>javax.servlet.jsp-apiartifactId>
      <version>2.3.1version>
      <scope>providedscope>
    dependency>
    <dependency>
      <groupId>javax.servletgroupId>
      <artifactId>jstlartifactId>
      <version>1.2version>
    dependency>
    
    <dependency>
      <groupId>joda-timegroupId>
      <artifactId>joda-timeartifactId>
      <version>2.9.9version>
    dependency>
    
    <dependency>
      <groupId>com.github.pagehelpergroupId>
      <artifactId>pagehelperartifactId>
      <version>5.1.2version>
    dependency>
    
    <dependency>
      <groupId>commons-codecgroupId>
      <artifactId>commons-codecartifactId>
      <version>1.10version>
    dependency>
  dependencies>

  <build>
    <finalName>SSMDemo_001finalName>
    <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-clean-pluginartifactId>
          <version>3.1.0version>
        plugin>
        
        <plugin>
          <artifactId>maven-resources-pluginartifactId>
          <version>3.0.2version>
        plugin>
        <plugin>
          <artifactId>maven-compiler-pluginartifactId>
          <version>3.8.0version>
        plugin>
        <plugin>
          <artifactId>maven-surefire-pluginartifactId>
          <version>2.22.1version>
        plugin>
        <plugin>
          <artifactId>maven-war-pluginartifactId>
          <version>3.2.2version>
        plugin>
        <plugin>
          <artifactId>maven-install-pluginartifactId>
          <version>2.5.2version>
        plugin>
        <plugin>
          <artifactId>maven-deploy-pluginartifactId>
          <version>2.8.2version>
        plugin>
      plugins>
    pluginManagement>
  build>
project>

2、配置web.xml


<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">
  
  <context-param>  
       <param-name>contextConfigLocationparam-name>  
       <param-value>classpath:spring/bean.xmlparam-value>
   context-param>
  
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
  listener>
  
  <servlet>
    <servlet-name>springmvcservlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    <init-param>
      <param-name>contextConfigLocationparam-name>
      <param-value>classpath:spring/spring-servlet.xmlparam-value>
    init-param>
  servlet>
  <servlet-mapping>
    <servlet-name>springmvcservlet-name>
    <url-pattern>/url-pattern>
  servlet-mapping>
  
  <filter>
    <filter-name>encodingFilterfilter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    <init-param>
      <param-name>encodingparam-name>
      <param-value>UTF-8param-value>
    init-param>
    <init-param>
      <param-name>forceRequestEncodingparam-name>
      <param-value>trueparam-value>
    init-param>
    <init-param>
      <param-name>forceResponseEncodingparam-name>
      <param-value>trueparam-value>
    init-param>
  filter>
  <filter-mapping>
    <filter-name>encodingFilterfilter-name>
    <url-pattern>/*url-pattern>
  filter-mapping>
  
  <filter>
    <filter-name>hiddenHttpMethodFilterfilter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
  filter>
  <filter-mapping>
    <filter-name>hiddenHttpMethodFilterfilter-name>
    <url-pattern>/*url-pattern>
  filter-mapping>
web-app>

3、配置spring的总领文件,bean.xml


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:lang="http://www.springframework.org/schema/lang"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:task="http://www.springframework.org/schema/task"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
       http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
       http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
    <import resource="classpath:spring/spring-*.xml"/>
beans>

4、由于spring和springmvc无须整合,所以直接写springmvc的配置文件spring-servlet.xml


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:lang="http://www.springframework.org/schema/lang"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:task="http://www.springframework.org/schema/task"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
       http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
       http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
    <context:component-scan base-package="com.xjj">
        <context:exclude-filter type="annotation" expression="com.xjj.service"/>
        <context:exclude-filter type="annotation" expression="com.xjj.mapper"/>
    context:component-scan>
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/jsp/"/>
        <property name="suffix" value=".jsp"/>
    bean>
    
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven/>
    
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="54000000"/>
        <property name="defaultEncoding" value="UTF-8"/>
    bean>
beans>

5、配置spring和mybatis的配置文件,即spring-mybatis.xml


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:lang="http://www.springframework.org/schema/lang"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:task="http://www.springframework.org/schema/task"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
       http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
       http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
    <context:component-scan base-package="com.xjj.mapper"/>
    
    <context:property-placeholder location="classpath:jdbc.properties"/>
    
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    bean>
    
    
    
    
    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        
        <property name="mapperLocations" value="classpath:com/xjj/mapper/*.xml">property>
        <property name="configuration">
            <bean class="org.apache.ibatis.session.Configuration">
                

            bean>
        property>
        
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <value>
                            helperDialect=mysql
                            reasonable=true
                            supportMethodsArguments=true
                            params=count=countSql
                            autoRuntimeDialect=true
                        value>
                    property>
                bean>
            array>
        property>
    bean>
    
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.xjj.mapper" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory">property>
    bean>
    
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    bean>
beans>

6、jdbc.properties和log4j.properties的配置

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123
#定义LOG输出级别
log4j.rootLogger=INFO,Console,File

#定义日志输出目的地为控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以灵活地指定日志输出格式,下面一行是指定具体的格式
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c]-%m%n

#mybatis显示SQL语句日志配置
log4j.logger.com.xjj.mapper=DEBUG

#文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.File = org.apache.log4j.RollingFileAppender
#指定输出目录,这里会放在tomcat之下
log4j.appender.File.File = D:/log.log

#定义文件最大大小
log4j.appender.File.MaxFileSize = 10MB
# 输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志
log4j.appender.File.Threshold=ALL
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

7、配置Controller层

package com.xjj.controller;

import com.xjj.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/person")
public class PersonController {
    @Autowired
    private PersonService personService;
    @RequestMapping("/m1")
    public String m1(){
        System.out.println("成功!");
        personService.querybyname();
        System.out.println("成功了!");
        return "person";
    }

}

8、配置service层

package com.xjj.service;

public interface PersonService {
    int querybyname();
}

package com.xjj.service.impl;

import com.xjj.mapper.PersonMapper;
import com.xjj.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


@Service
@Transactional
public class PersonServiceImpl implements PersonService {
    @Autowired
    private PersonMapper personMapper;
    public int querybyname(){
        System.out.println("到达了service层....");
        System.out.println(personMapper.querybyname("鲤鱼王").getPerson_age());
        return 1;
    }
}

9、配置mapper层…即dao层

package com.xjj.mapper;

import com.xjj.entity.Person;

public interface PersonMapper {
    Person querybyname(String person_name);
}



<mapper namespace="com.xjj.mapper.PersonMapper">
    <select id="querybyname" resultType="com.xjj.entity.Person">
        select person_age from person where person_name=#{person_name}
    select>
mapper>

SSM_第3张图片

易错点

在log4j中配置路径否则不会出现日志记录

serviceimpl层要实现service否则无法自动注入给controller层

注意resources下面的包级结构,是否是分层的

再保存文件路径时直接保存名字就可以了,在前台输出的时候输出格式为

/SSM_0000003_war_exploded/upload/Aurora-10802019年07月27日08时26分35秒.jpg

所以可以构造表达式为

<img src="${classpath}/upload/${userLoginSession.userHeadPortrait}">

使用json时注意@RequestBody和@ResponseBody

引入js文件一定要写全,空文件夹不编译时可以手动加入文件

修改了layui的css不发生变化,需要修改浏览器设置F12->Network->disable cache勾选->刷新页面

不要重启服务器,直接关闭重新开启

你可能感兴趣的:(#,学习笔记)