SSM框架超详细讲解

介绍SSM框架

一、什么是SSM框架?

SSM框架是spring、spring MVC 、和mybatis框架的整合,是标准的MVC模式。标准的SSM框架有四层,分别是dao层(mapper),service层,controller层和View层。使用spring实现业务对象管理,使用spring MVC负责请求的转发和视图管理,mybatis作为数据对象的持久化引擎。

1)持久层:dao层(mapper)层
作用:主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此。

  • Dao层首先设计的是接口,然后再Spring的配置文件中定义接口的实现类。
  • 然后可以在模块中进行接口的调用来进行数据业务的处理。(不在关心接口的实现类是哪个类)
  • 数据源的配置以及有关数据库连接的参数都在Spring的配置文件中进行配置。

2)业务层:Service层
作用:Service层主要负责业务模块的逻辑应用设计。

  • 先设计接口然后再设计实类,然后再在Spring的配置文件中配置其实现的关联。(业务逻辑层的实现具体要调用到自己已经定义好的Dao的接口上)这样就可以在应用中调用Service接口来进行业务处理。
  • 建立好Dao之后再建立service层,service层又要在controller层之下,因为既要调用Dao层的接口又要提供接口给controller层。每个模型都有一个service接口,每个接口分别封装各自的业务处理的方法。

3)表现层:Controller层(Handler层)
作用:负责具体的业务模块流程的控制。

  • 配置也同样是在Spring的配置文件里面进行,
  • 调用Service层提供的接口来控制业务流程。
  • 业务流程的不同会有不同的控制器,在具体的开发中可以将我们的流程进行抽象的归纳,设计出可以重复利用的子单元流程模块。

4)View层
作用:主要和控制层紧密结合,主要负责前台jsp页面的表示。

各层之间的联系

这里是引用
DAO层,Service层这两个层次都可以单独开发,互相的耦合度很低,完全可以独立进行,这样的一种模式在开发大项目的过程中尤其有优势,Controller,View层因为耦合度比较高,因而要结合在一起开发,但是也可以看作一个整体独立于前两个层进行开发。这样,在层与层之前我们只需要知道接口的定义,调用接口即可完成所需要的逻辑单元应用,一切显得非常清晰简单。

1.Spring

Spring里面的IOC容器和AOP是我们平时使用最多的。
1)IOC(控制反转)
它可以装载bean,也是一种降低对象之间耦合关系的设计思想。(比如租房子。以前租房子需要一个房子一个房子找,费时费力,然后现在加入一个房屋中介,把你需要的房型告诉中介,就可以直接选到需要的房子,中介就相当于spring容器。)
2)AOP(面向切面)
是面向对象开发的一种补充,它允许开发人员在不改变原来模型的基础上动态的修改模型以满足新的需求,如:动态的增加日志、安全或异常处理等。AOP使业务逻辑各部分间的耦合度降低,提高程序可重用性,提高开发效率。

1.横切关注点:从每个方法中抽取出来的同一类非核心业务代码。
2.切面:封装横切信息点的类,每个关注点体现为一个通知方法。
3.通知:切面必须要完成的各个具体工作,也就是切面里的一个个方法。
4.目标:被通知的对象,也就是被通知方法所作用的对象。
5.代理:像目标对象应用通知之后所创建的代理对象。
6.连接点:横切关注点在程序代码中的具体体现,对应用程序执行的某个特定位置。(通俗来讲就是一个个的方法)
7.切入点:切入点就是定位连接点的方式。每个通知上的切入点表达式找到对应的连接点,执行通知之后连接点也就变成了切入点。
在这里插入图片描述

2.Spring MVC

<复杂版>
1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户。

<简单版>
1.客户端发送请求到DispacherServlet(分发器)
2.由DispacherServlet控制器查询HanderMapping,找到处理请求的Controller
3.Controller调用业务逻辑处理后,返回ModelAndView
4.DispacherSerclet查询视图解析器,找到ModelAndView指定的视图
5.视图负责将结果显示到客户端
在这里插入图片描述

3.Mybatis (核心是SqlSession)

mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。

二、代码实战

1.创建配置工程

1)创建maven工程
2)创建目录

  • src——main下创建两个文件夹(Java和resources)。
  • 和main同级的创建一个test,test里面创建一个Java。
  • 在这里插入图片描述

3)配置工程

  • file——project structure——modules
  • 在这里插入图片描述
    4)创建包
  • 在src——java下创建问价夹(XXX),
  • (XXX)下创建entity,mapper,,service和util包。

5)配置依赖
pom.xml加入依赖,一个是Mybatis的,一个是MySQL的。

代码如下(示例):

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.1</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.36</version>
    </dependency>

在这里插入图片描述

2.代码实战(查询记录数)

1)设计数据库
在这里插入图片描述
1)创建实体类
在entity下new一个名为person的class

代码如下(示例):

public class Person {
    private Integer Id;
    private String name;
    private String nickname;
    private Integer age;

    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 String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

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

2)Mapper接口
定义方法(实体名+Mapper)
在mapper下创建一个名为PersonMapper的interface

public interface PersonMapper {
    //定义查询记录方法数
    public Integer findCount();
    }

3)resources包

  • resources包下创建cn包
  • cn包下创建kgc包
  • kgc包下创建一个XML(这里的xml文件名与mapper接口名一致)
    xml文件中有两个部分组成,一个是头部文件,一个是主体
//头文件:
<?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">
//查询映射标签(select):
<mapper namespace="cn.kgc.mapper.PersonMapper">
    <select id="findCount" resultType="java.lang.Integer">
    </select>
</mapper>

(1)mapper叫根节点,根节点有个属性是namespace=""、namespace=""、的作用是映射我们mapper的全路径,在以后的使用中会自动映射成我们mapper的实现类
(2)select里面的Id=“”一般和我们PersonMapper里面的方法名保持一致
(3)返回值这里有一个专门的属性叫resultType="java.lang.Integer"
(4)方法名和返回值都对应之后看有无参数,如果有要加上parameterType=""

4)写sql语句`

<mapper namespace="cn.kgc.mapper.PersonMapper">
    <select id="findCount" resultType="java.lang.Integer">
        select count(*) from t_user
    </select>
</mapper>

5)配置主配置文件mybatis-config.xml`
在resources里新建mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
        "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
//根节点:爷爷
<configuration>
       //子节点:爸爸
    <environments default="development">
    //爸爸天生有很多的孙子(这里可以配置很多个数据库,比如development1,development2等等)
     <environment id="development">
      <transactionManager type="JDBC" /> </transactionManager>//事务里面有一个类型type,可以配JDBC(JDBC利用的机制是数据库它的一个数据源的一个事务JDBC。可以允许不用数据库的事务)
      <dataSource type="POOLED"></dataSource>//(dataSource属性,代表数据源,链接数据库。“POOLED”这里的连接池根据需要可以更改。)
     </environment>
     //development2(一般企业里配一个开发环境,一个测试环境)
      //    <environment id="development2">
    //  <transactionManager type="" /> </transactionManager>
    //  <dataSource type=""></dataSource>
   //  </environment>
  //  </environments>
</configuration>
mybatis-config.xml完整代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
        "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">

<configuration>
    <!--jdbc.properties配置文件-->
    <properties resource="jdbc.properties"></properties>
    <!--setttings:控制mybatis全局配置行为-->
    <settings>
        <!--设置mybatis输出日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--环境配置:数据库的连接信息-->
    <!--default:中配置的值需要和某个environment配置的id相同,
        通知mybatis使用具体哪一个数据库的连接信息,即具体访问对应的数据库-->
    <environments default="development">
        <!--environment:一个数据库信息的配置,环境-->
        <!--id属性:一个唯一值,自定义,表示环境的名称-->
        <environment id="development">
            <!--transactionManager属性:mybatis的事务类型-->
            <transactionManager type="JDBC" />
            <!--dataSoure属性:代表数据源,连接数据库-->
            <!--type属性:JDBC 表示使用的是使用连接池的数据源-->
            <dataSource type="POOLED">
                <!--配置驱动-->
                <property name="driver" value="${driver}"/>
                <!--配置连接数据库的url字符串-->
                <property name="url" value="${url}"/>
                <!--配置连接数据库的用户名-->
                <property name="username" value="${username}"/>
                <!--配置连接数据库的密码-->
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--sql映射文件标签-->
    <mappers>
        <!--reource:从类路径开始的路径信息:target/clasess(类路径)-->
        <mapper resource="cn/kgc/mapper/PersonMapper.xml"/>
    </mappers>
</configuration>

5)测试`
在test——Java包下新建一个名为TestMybatis的测试类
测试用例怎么写:测一个对象sqlSession,需要通过sqlSessionFactor()对象才能创建sqlSession。sqlSessionFactor()需要通过sqlSessionFactor()Builder()来创建出来。

在这里插入图片描述

  1. 先new一个SqlSessionFactoryBuilder(),得到一个返回值builder
 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  1. 获取我们的SqlSessionFactory,要用builder.上我们的builder()方法,通过流的形式传一个In的参数。
  2. 通过Resources.getResourceAsStream(“”)读取我们的主配置文件才能调用我们的依赖信息,在这里抛异常。这里有一个返回值nputStream in(字节流),通过字节流就可以读取
  3. 这时builder.build(in);得到哟个返回值就是SqlSessionFactory factory。
  4. 得到SqlSessionFactory factory之后,根据图片的流程就要得到我们的SqlSession。
  5. factory.openSession()打开我们的Session,就可以得到我们的Session
  6. 执行sql语句。sqlSession.getMapper(这里的mapper利用的是我们的一个反射机制,机制利用的时我们的一个接口)通过sqlSession.getMapper(PersonMapper.class)调用一个调用方法,得到一个返回值count
  7. 输出对应的返回值
  8. 关闭sqlsession
public class TestMybatis {
    @Test
    public void testHelloWorld() throws IOException {
        //1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        //2.实例化SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.调用builder对象的builder()方法,获取SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        //4.调用factory对象的openSession()方法,获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //5.调用接口的方法
        Integer count = sqlSession.getMapper(PersonMapper.class).findCount();
        //6.输出对应的返回值count
        System.out.println("count:" + count);
        //7.关闭 SqlSession
        sqlSession.close();
    }
 }

3.代码实战(增加)

PersionMapper

public interface PersonMapper {
    //定义查询记录方法数
    public Integer findCount();
    //增加
    public Integer addPerson(Person person);
    }

PersonMapper.xml

<?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.kgc.mapper.PersonMapper">
    <select id="findCount" resultType="java.lang.Integer">
        select count(*) from t_user
    </select>
    <insert id="addPerson" parameterType="cn.kgc.entity.Person">
        insert into t_user(name,nickname,age) values(#{name},#{nickname},#{age})
    </insert>
    </mapper>

测试类

    @Test
    public void testInsert() throws Exception {
        //1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        //2.实例化SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.调用builder对象的builder()方法,获取SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        //4.调用factory对象的openSession()方法,获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //5.调用接口的方法
        Person p = new Person();
        p.setName("李四");
        p.setNickname("一个人的夜晚上");
        p.setAge(22);
        sqlSession.getMapper(PersonMapper.class).addPerson(p);
        //6.提交实物,该行代码必须放在关闭sqlsession之前
        sqlSession.commit();
        sqlSession.close();
    }

3.代码实战(增删改查,模糊精确查询集合)

完整工程代码
Person类

package cn.kgc.entity;

public class Person {
    private Integer Id;
    private String name;
    private String nickname;
    private Integer age;

    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 String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

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


PersonMapper类

package cn.kgc.mapper;

import cn.kgc.entity.Person;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface PersonMapper {
    //定义查询记录方法数
    public Integer findCount();
    //增加
    public Integer addPerson(Person person);
    //修改功能
    public Integer updatePerson(Person person);
    //删除功能
    public Integer delById(Integer Id);
    //删除功能2
    public Integer delById2(Person person);
    //查询对象
    public Person findById(Integer Id);
    //查询集合
    public List<Person> findAll();
    //模糊查询
    public List<Person> findByName(String name);
    //通过用户名和昵称 绝对查询
    public List<Person> findByPerson(Person person);
    //通过用户名和昵称 绝对查询2
    public List<Person> findByPerson2(@Param("name")String name,@Param("nickname")String nickname);
    //测试¥(不安全)符号和#(安全)的作用
    public List<Person> findColList(@Param("colname")String colname);
}

MybatisUtil类

package cn.kgc.util;

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 java.io.IOException;
import java.io.InputStream;

public class MytabisUtil {
    private static SqlSessionFactory factory = null;

    static {
        try {
            InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            factory = builder.build(in);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
    //获取SqlSession对象
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = null;
        if(factory!=null){
            sqlSession = factory.openSession();
        }
        return sqlSession;
    }
}

PersonMapper.xml

<?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.kgc.mapper.PersonMapper">
    <select id="findCount" resultType="java.lang.Integer">
        select count(*) from t_user
    </select>
    <insert id="addPerson" parameterType="cn.kgc.entity.Person">
        insert into t_user(name,nickname,age) values(#{name},#{nickname},#{age})
    </insert>
    <update id="updatePerson" parameterType="cn.kgc.entity.Person">
        update t_user set name=#{name},nickname=#{nickname},age=#{age} where Id = #{Id}
    </update>
    <delete id="delById" parameterType="cn.kgc.entity.Person" >
        delete from t_user where id = #{Id}
    </delete>
    <delete id="delById2" parameterType="cn.kgc.entity.Person">
        delete from t_user where id = #{Id}
    </delete>
    <select id="findById" resultType="cn.kgc.entity.Person" parameterType="java.lang.Integer">
        select * from t_user where id = #{Id}
    </select>
    <select id="findAll" resultType="cn.kgc.entity.Person">
        select * from t_user
    </select>
    <select id="findByName" resultType="cn.kgc.entity.Person" parameterType="java.lang.String">
        select * from t_user where `name` like concat('%',#{name},'%')
    </select>
    <select id="findByPerson" parameterType="cn.kgc.entity.Person" resultType="cn.kgc.entity.Person">
        select * from t_user where  `name` = #{name} and nickname = #{nickname}
    </select>
    <select id="findByPerson2" parameterType="cn.kgc.entity.Person" resultType="cn.kgc.entity.Person">
        select * from t_user where  `name` = #{name} and nickname = #{nickname}
    </select>
    <select id="findColList" resultType="cn.kgc.entity.Person">
         select * from t_user order by ${colname}
    </select>
</mapper>

jdbc.properties(配置文件)

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_202125
username=root
password=123

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
        "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">

<configuration>
    <!--jdbc.properties配置文件-->
    <properties resource="jdbc.properties"></properties>
    <!--setttings:控制mybatis全局配置行为-->
    <settings>
        <!--设置mybatis输出日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--环境配置:数据库的连接信息-->
    <!--default:中配置的值需要和某个environment配置的id相同,
        通知mybatis使用具体哪一个数据库的连接信息,即具体访问对应的数据库-->
    <environments default="development">
        <!--environment:一个数据库信息的配置,环境-->
        <!--id属性:一个唯一值,自定义,表示环境的名称-->
        <environment id="development">
            <!--transactionManager属性:mybatis的事务类型-->
            <transactionManager type="JDBC" />
            <!--dataSoure属性:代表数据源,连接数据库-->
            <!--type属性:JDBC 表示使用的是使用连接池的数据源-->
            <dataSource type="POOLED">
                <!--配置驱动-->
                <property name="driver" value="${driver}"/>
                <!--配置连接数据库的url字符串-->
                <property name="url" value="${url}"/>
                <!--配置连接数据库的用户名-->
                <property name="username" value="${username}"/>
                <!--配置连接数据库的密码-->
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--sql映射文件标签-->
    <mappers>
        <!--reource:从类路径开始的路径信息:target/clasess(类路径)-->
        <mapper resource="cn/kgc/mapper/PersonMapper.xml"/>
    </mappers>
</configuration>

TestMybatis类

import cn.kgc.entity.Person;
import cn.kgc.mapper.PersonMapper;
import cn.kgc.util.MytabisUtil;
import jdk.internal.util.xml.impl.Input;
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.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;


public class TestMybatis {
    @Test
    public void testHelloWorld() throws IOException {
        //1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        //2.实例化SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.调用builder对象的builder()方法,获取SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        //4.调用factory对象的openSession()方法,获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //5.调用接口的方法
        Integer count = sqlSession.getMapper(PersonMapper.class).findCount();
        //6.输出对应的返回值count
        System.out.println("count:" + count);
        //7.关闭 SqlSession
        sqlSession.close();
    }

    @Test
    public void testInsert() throws Exception {
        //1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        //2.实例化SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.调用builder对象的builder()方法,获取SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        //4.调用factory对象的openSession()方法,获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //5.调用接口的方法
        Person p = new Person();
        p.setName("李四");
        p.setNickname("一个人的夜晚上");
        p.setAge(22);
        sqlSession.getMapper(PersonMapper.class).addPerson(p);
        //6.提交实物,该行代码必须放在关闭sqlsession之前
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testupdate() throws Exception {
        //1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        //2.实例化SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.调用builder对象的builder()方法,获取SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        //4.调用factory对象的openSession()方法,获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        Person p2 = new Person();
        p2.setId(2);
        p2.setName("赵四");
        p2.setNickname("来啊,造作啊");
        p2.setAge(23);
        sqlSession.getMapper(PersonMapper.class).updatePerson(p2);
        //6.提交实物,该行代码必须放在关闭sqlsession之前
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void testdel() throws  Exception{
        //1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        //2.实例化SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.调用builder对象的builder()方法,获取SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        //4.调用factory对象的openSession()方法,获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        sqlSession.getMapper(PersonMapper.class).delById(2);
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void testdel2 () throws Exception{
        //1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        //2.实例化SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.调用builder对象的builder()方法,获取SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        //4.调用factory对象的openSession()方法,获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        Person person = new Person();
        person.setId(2);
        sqlSession.getMapper(PersonMapper.class).delById2(person);
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void testfindById () throws Exception{
        //1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        //2.实例化SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.调用builder对象的builder()方法,获取SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        //4.调用factory对象的openSession()方法,获取SqlSession对象
        SqlSession sqlSession = factory.openSession();

        Person person = sqlSession.getMapper(PersonMapper.class).findById(1);
        System.out.println("id"+ person.getId()+"name"+ person.getName()+"nickname"+ person.getNickname()+"age"+ person.getAge());
        sqlSession.close();
    }
    @Test
    public void testfindAll () throws IOException{
       String str ="mybatis-config.xml";
        InputStream in =Resources.getResourceAsStream(str);
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        SqlSession sqlSession = factory.openSession();

        List<Person> all = sqlSession.getMapper(PersonMapper.class).findAll();
        for(Person p:all){
            System.out.println(p);
        }
        sqlSession.close();
    }
    @Test
    public void testfindByName () throws IOException{
        String str ="mybatis-config.xml";
        InputStream in =Resources.getResourceAsStream(str);
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        SqlSession sqlSession = factory.openSession();

        List<Person> list = sqlSession.getMapper(PersonMapper.class).findByName("wqz");
        for(Person p:list){
            System.out.println(p);
        }
        sqlSession.close();
    }
    @Test
    public void testfindByPerson () throws IOException{
        String str ="mybatis-config.xml";
        InputStream in =Resources.getResourceAsStream(str);
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        SqlSession sqlSession = factory.openSession();
        Person person = new Person();
        List<Person> list = sqlSession.getMapper(PersonMapper.class).findByPerson(person);
        for(Person p:list){
            System.out.println(p);
        }
        sqlSession.close();
    }
    @Test
    public void findByPerson2 () throws Exception {
        //1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        //2.实例化SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.调用builder对象的builder()方法,获取SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        //4.调用factory对象的openSession()方法,获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        String name = "王五";
        String nickname = "123";
        List<Person> list = sqlSession.getMapper(PersonMapper.class).findByPerson2(name,nickname);
        for(Person p:list){
            System.out.println("name:"+p.getName()+"nickname"+p.getNickname());
        }
        sqlSession.close();
    }
    @Test
    public void testfindCount(){
        SqlSession sqlSession = MytabisUtil.getSqlSession();
        Integer count = sqlSession.getMapper(PersonMapper.class).findCount();
        System.out.println(count);
    }

    @Test
    public void findColList(){
        SqlSession sqlSession = MytabisUtil.getSqlSession();
        List<Person> colList = sqlSession.getMapper(PersonMapper.class).findColList("Id");
        for (Person p:colList){
            System.out.println(p);


        }
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
-->
<!-- $Id: pom.xml 642118 2008-03-28 08:04:16Z reinhard $ -->
<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/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <packaging>war</packaging>

  <name>20211125</name>
  <groupId>org.example</groupId>
  <artifactId>20211125</artifactId>
  <version>1.0-SNAPSHOT</version>

  <build>
    <plugins>
      <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>maven-jetty-plugin</artifactId>
        <version>6.1.7</version>
        <configuration>
          <connectors>
            <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
              <port>8888</port>
              <maxIdleTime>30000</maxIdleTime>
            </connector>
          </connectors>
          <webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}</webAppSourceDirectory>
          <contextPath>/</contextPath>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <dependencies>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.1</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.36</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <!--dependency>
      <groupId>org.example</groupId>
      <artifactId>[the artifact id of the block to be mounted]</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency-->
  </dependencies>

</project>


---------------------
作者:代码贩子、
来源:CSDN
原文:https://blog.csdn.net/weixin_45650003/article/details/121623824
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/697806.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

下拉框数据被遮挡 且 后续数据无法下拉的 解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法3.1 添加空白版2.2 调整z-index2.3 父容器的溢出属性2.4 调整样式属性4. 效果图前言 小程序使用的是Uniapp,原理都差不多,索性标题就不标注Uniapp(小程序) 对于该问题调试了一个晚上,最终解决,对此记录下来 1. 问题所示 执…

Python中的数据可视化:分组柱状图

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 Python中的数据可视化&#xff1a; 分组柱状图 选择题 关于以下代码输出结果的说法中正确的是? import seaborn as sns import matplotlib.pyplot as plt import pandas as pd data…

Vue2基础:.sync修饰符的使用,认识,作用,本质案例演示,实现父子之间的通信。

.sync的作用&#xff1a; 可以实现子组件与父组件数据的双向绑定&#xff0c;简化代码。 与v-model的不同点,prop属性名可以自定义&#xff0c;不要一定要用value. .sync的本质&#xff1a; 就是&#xff1a;属性名和update&#xff1a;属性名合写。 下面我们进行代码演示…

Kimichat使用案例009:添加常用语(使用技巧)

文章目录 一、介绍二、常用语操作过程三、语言设置四、操作一、介绍 使用kimichat进行翻译,通常会使用提示语:翻译成中文。如果每天都要大量使用这一个功能,可以把提示语添加成常用语,直接点击调用即可,就不用再一次次重复输入了。 二、常用语操作过程 在kimichat的提示语…

wordpress入门教程,wordpress快速入门,wordpress教程视频

WordPress是一款广受欢迎的开源博客平台和内容管理系统&#xff0c;自2003年诞生以来&#xff0c;它不断发展和完善&#xff0c;如今已成为互联网上众多网站、博客的首选构建工具。 1、搜索“方圆资源网官网” WordPress教程的资源非常丰富&#xff0c;只要找到合适的途径&…

3 数据类型、运算符与表达式-3.5 字符型数据-3.5.2 转义字符

3.5.2 转义字符 #include <stdio.h>main() {int a, b, c;a 5;b 6;c 7;printf("ab c\tde\rf\n");printf("hijk\tL\bM\n");return 0; }

Vue18-列表渲染

一、v-for渲染列表 1-1、遍历数组&#xff08;用的多&#xff09; 1-2、key属性 让每一个<li>都有一个唯一的标识&#xff01; 1、写法一 只有用了遍历的方式(v-for)来生成多个同样结构的数据&#xff0c;必须给每个结构取一个唯一的标识。 2、写法二 或者&#xff1a;…

CSS id选择器

目录 任务描述 相关知识 id选择器 id选择器语法 类选择器与id选择器的区别 编程要求 任务描述 在本关中&#xff0c;你将通过id选择器的方式完成页面菜单栏样式布局&#xff0c;栏目导航等任务。 完成任务之后&#xff0c;基本页面效果如下&#xff1a; 动态效果如下&am…

使用 PlatformIO 将文件上传到 ESP32-S3 的 SPIFFS 文件系统

PlatformIO环境 将文件上传到 ESP32-S3 的 SPIFFS 文件系统 介绍&#xff1a; PlatformIO 是一个流行的开发平台&#xff0c;用于编写、构建和上传嵌入式项目。ESP32-S3 是 Espressif 推出的一款功能强大的嵌入式开发板&#xff0c;具有丰富的外设和通信接口。本文将介绍如何…

【差分数组】1674. 使数组互补的最少操作次数

本文涉及知识点 差分数组 LeetCode1674. 使数组互补的最少操作次数 给你一个长度为 偶数 n 的整数数组 nums 和一个整数 limit 。每一次操作&#xff0c;你可以将 nums 中的任何整数替换为 1 到 limit 之间的另一个整数。 如果对于所有下标 i&#xff08;下标从 0 开始&…

【系统架构】架构演进

系列文章目录 第一章 系统架构的演进 本篇文章目录 系列文章目录前言一、原始分布式二、单体系统时代三、SOA时代烟囱架构微内核架构事件驱动架构 四、微服务架构五、后微服务时代六、无服务时代总结 前言 最近笔者一直在学习系统架构的相关知识&#xff0c;对系统架构的演进…

上市公司短视主义数据集(2001-2022年)

数据简介&#xff1a;上市公司短视主义是指公司管理层过于关注短期业绩和股价表现&#xff0c;而忽视公司的长期发展和战略规划。这种短视行为可能会导致公司投资决策的失误&#xff0c;影响公司的长期竞争力。 在上市公司年度报告年度中&#xff0c;通过已有的反映管理者“短…

机器视觉系统-条形光源安装位置计算

使用条形光对反光材质物体打光时&#xff0c;常常出现强烈的光斑反射&#xff0c;影响图像处理。如果不想图像中出现光源的光斑&#xff0c;可以通过计 算得出条形光源的安装范围。 检侧PCB板上的二维码字符&#xff0c;使用两个条形光打光的效果图以及等效模型&#xff1a; 如…

cuda学习笔记(3)

一 CPU和GPU的区别 衡量处理器优劣的重要的两个指标&#xff1a; 延时性&#xff1a;同量的数据&#xff0c;所需要的处理时间 吞吐性&#xff1a;处理速度不快&#xff0c;但是每次处理量很大 GPU设计理念是最大化吞吐量&#xff0c;使用很小的控制单元对应很小的内存 cpu的设…

二进制文件的膨胀策略和使用 debloat 消除膨胀测试

在恶意软件的分析中有的 Windows 可执行文件&#xff08;PE 文件&#xff09;会通过膨胀策略来绕过防病毒一些防病毒的检查&#xff0c;比如上传云进行分析&#xff0c;因为文件太大了所以无法进行一些防病毒分析。一般的可执行文件有很多的膨胀策略&#xff0c;一般简单的膨胀…

3 数据类型、运算符与表达式-3.3.2 整型变量(原码,反码,补码)

在计算机科学中&#xff0c;补码、原码和反码是用来表示带符号整数的二进制编码方法&#xff0c;特别是在计算机内存中存储和处理整数时。这些编码方式帮助计算机区分正数和负数&#xff0c;并支持算术运算。以下是它们的具体含义&#xff1a; 原码&#xff08;True Form or S…

【免杀】C2远控-Loader加载器-动态API调用

目录 创建后门程序站在杀毒程序立场上对后门进行分析例&#xff1a;动态调用VirtualProtect函数 作用:绕过杀毒对导入表的检测定性 创建后门程序 VS新建项目 回调函数加载Loader #include <Windows.h>unsigned char shellcode[] "";void CallBack() {void* p…

【LLM】Dify 0.6.10 在Windows系统上本地化部署

【LLM】Dify 0.6.10 在Windows系统上本地化部署 文章目录 【LLM】Dify 0.6.10 在Windows系统上本地化部署一、参考资料二、Dify 概述1、Dify开源项目功能介绍&#xff08;RAG流水线&#xff0c;Agent工具接入&#xff0c;Prompt配置和工作流编排&#xff0c;大模型接入&#xf…

使用Vue CLI在其他磁盘创建项目出现错误及解决

Vue CLI是Vue.js官方推出的脚手架工具&#xff0c;可以帮我们快速的创建Vue项目框架。 我们创建Vue项目时一般默认都是在C盘&#xff0c;但由于某些因素我们需要在其他磁盘上创建Vue项目。 通过“winr”打开终端时默认位置都是C盘&#xff0c;但是Vue CLI不接受绝对路径作为参…

OpenGL-ES 学习(6)---- Ubuntu OES 环境搭建

OpenGL-ES Ubuntu 环境搭建 此的方法在 ubuntu 和 deepin 上验证都可以成功搭建 目录 OpenGL-ES Ubuntu 环境搭建软件包安装第一个三角形基于 glfw 实现基于 X11 实现 软件包安装 sudo apt install libx11-dev sudo apt install libglfw3 libglfw3-dev sudo apt-get install…