Mybatis及ssm整合

Mybatis

1、Mybatis是一款优秀的持久层框架
2、它支持自定义SQL、存储过程以及高级映射
3、Mybatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作
4、Mybatis可以通过简单的XML或注解来配置和映射原始类型、接口和java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
参考mybatis资料:https://mybatis.org/mybatis-3/zh/index.html

JDBC编程和存在问题

jdbc编程回顾

public class JDBCDemo {
    
    
    /**
     * 1、引入依赖驱动包
     *    mysql-connector-java
     * 2、加载驱动
     *    Class.forName("");
     * 3、连接数据库,获取Connection
     *    url:jdbc:mysql/ip+port(3306)/数据库名
     *    username:
     *    password:
     *   Connection connection = DriverManager.getConnetion();
     *
     * 4、获取Statement对象
     * Statement statement = connection.createStatement();
     *
     * 5、执行数据库的操作(CRUD)
     *   statement.executorQuery();
     *
     * 6、获取结果集:ResultSet
     *
     * 7、关闭资源
     * statement.close();
     * connection.close();
     */

    //第一步:导入jar包

    //第二步:说明JDBC驱动的名称和数据库的地址
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/test";

    //第三步:说明数据库的认证账户及密码
    static final String USER = "root";
    static final String PASS = "123456";

    public static void main(String[] args) {
    
    
        //第四步:加载数据库驱动.通常使用Class.forClass(String driverName);加载
        try {
    
    
            Class.forName(JDBC_DRIVER);
        } catch (ClassNotFoundException e) {
    
    
            //这里会发生类没有找到的异常!
            e.printStackTrace();
        }
        //第五步:获得数据库连接
        try {
    
    
            //获取连接
            Connection connection =  DriverManager.getConnection(DB_URL,USER,PASS);
            //第六步:执行查询语句
            Statement statement = connection.createStatement();
            String sql = "SELECT * FROM Student where  SID=1  ";
            ResultSet rs =statement.executeQuery(sql);

            while (rs.next())
            {
    
    
                String title = rs.getString("SID");
                String author = rs.getString("Sname");
                System.out.println(title+":"+author);
            }
            //第七步:关闭连接资源
            rs.close();
            statement.close();
            connection.close();
        } catch (SQLException e) {
    
    
            e.printStackTrace();
            //这里会发生SQL异常,因为我们提供的的账户和密码不一定能连接成功
        }
    }

jdbc存在的问题
在这里插入图片描述
总结:
1、数据库链接创建,释放频繁的操作造成系统的资源浪费,从而影响系统性能
2、SQL语句在代码中硬编码,造成代码不易维护,实际的应用SQL变化很大,SQL改变时要引起java代码的改变
3、对结果集的解析存在硬编码(查询列名),SQL改变导致解析代码也会发生改变,系统不易维护
JDBC问题的解决方法
1、频繁进行数据库的连接和释放
解决:(复用链接),通过连接池来解决,mybatis也能够进行链接的复用
2、SQL语句硬编码在java代码中
解决:SQL和java代码分离,SQL语句放置在配置文件中(xml),需求改变仅需改变配置文件即可
3、返回结果集的硬编码
解决:数据库中的数据映射成JAVA对象

mybatis原理

整个mybatis的执行流程
在这里插入图片描述

mybatis使用demo

实际场景为例:通过ID来查询学习信息(对应的test库中Student表)

1、引入mybatis依赖

<!--mybatis的依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>

2、全局配置文件(mybatis-config.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--配置数据源:必须-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入映射文件-->
    <mappers>
        <!--<mapper resource="org/mybatis/example/BlogMapper.xml"/>-->
    </mappers>
</configuration

3、PoJo类(Student23.java)

public class Student23 {
    
    
    private Integer SID;
    private String Sname;
    private String Ssex;
    private String Sage;
}

注意:PoJo类中的属性名和数据库中的类中的列名保持一一对应,可自动完成映射

4、Mapper接口文件(Student23Mapper.java)

public interface Student23Mapper {
    
    
    
    //通过id查询学生信息
    public Student23 selectStudentByUid(Long  uid);
}

5、Mapper.xml文件(Student23Mapper.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:命名空间,接口文件的全路径-->
<mapper namespace="com.tulun.inteface.Student23Mapper">

    <!-- 通过id查询学生信息-->
    <select id="selectStudentByUid" parameterType="long" resultType="com.tulun.pojo.Student23">
        select * from Student where SID = #{
    
    uid}
    </select>
</mapper>

6、全局配置文件引入映射文件

 <!--引入映射文件-->
    <mappers>
        <mapper resource="mapper/Student23Mapper.xml"/>
    </mappers>

7、查询操作

 public static void main(String[] args) throws IOException {
    
    
        //获取全局配置文件
        String path = "mybatis-config.xml";
        //通过mybatis提供共的Resources类来获取配置文件流
        InputStream inputStream = Resources.getResourceAsStream(path);

        //获取SQLSessionFactory对象
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //获取会话工厂
        SqlSession sqlSession = sessionFactory.openSession();

        //通过反射机制来后去到mapper的实例
        Student23Mapper student23Mapper = sqlSession.getMapper(Student23Mapper.class);
        Student23 student23 = student23Mapper.selectStudentByUid(1L);
       
        System.out.println(student23);

    }

使用步骤总结:
1、配置一个全局的配置文件数据源、引入映射文件
2、创建SQLSessionFactory对象(mybatis通过SqlSessionFactoryBuilder创建)
3、通过会话工厂创建SQLSession会话
4、通过SQLSessioin操作数据库
5、管理会话SQLSession
在这里插入图片描述

配置详解

1、全局配置文件的介绍(mybatis-config.xml)

在这里插入图片描述
参考资料文档:https://mybatis.org/mybatis-3/zh/configuration.html#settings

properties:读取外部资源
properties用来给定配置,可以进行动态的替换

    <!--读取配置文件信息:动态的替换配置-->
    <properties >
        <property name="user" value="root"/>
        <property name="pasword" value="123456"/>
    </properties>
    <!--配置数据源:必须-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="${user}"/>
                <property name="password" value="${pasword}"/>
            </dataSource>
        </environment>
    </environments>

使用的配置在properties中给定例如:username和password,在指定的配置文件中db.propertis也给定了配置信息,即属性不只一个订房进行配置:mybatis提供如下加载顺序
首先读取的是properties元素体内指定的属性
在根据properties元素中的resource属性读取指定路径下的问题,如果存在相容的属性文件,则覆盖之前读取的同名的属性
最后读取防范参数传递的属性,覆盖之前读取的同名属性
注意:通过parameterType传递的属性具有最高优先级,resource或URL加载的属性次之,最低优先级的是properties元素体内指定的属性
setting:全局的参数配置
在这里插入图片描述
cacheEnabled:mybatis中提供的缓存机制,其中二级缓存的使用需要打开开关
lazyLoadingEnabled和aggressiveLazyLoading配置用来进行懒加载的开关配置
typeAliases:类型别名
类型别名是java的类型设置一个短的名字,只和XML配置 有关,用来减少类完全限定名的冗余的问题
在mapper.xml配置文件中,定义了很多的Statement,satement需要使用paramenterType指定输入参数类型,需要使用resultType来指定输出参数类型,指定类型的全路径,不方便开发,就可以在配置文件中配置别名,在mapper.xml文件中就可以使用定义别名

    <!--类型别名-->
    <typeAliases>
        <!--定义单个别名 type属性:pojo类的全限定名 alias:别名的名称-->
        <typeAlias type="com.tulun.pojo.Student23" alias="student23"/>

        <!--批量的别名配置 name:指定包名,将包下的所有的pojo类定义别名,别名为类名(首字母大写小写都可以)-->
        <package name="com.tulun.pojo"/>
    </typeAliases>

environments:环境配置
mybatis支持多种环境的配置,方法在多个数据库间做切换,例如:开发环境,测试环境,生产环境
可以配置多个环境,但是在使用SQLSessionFactory实例只能选择一种环境
使用的默认环境:default=“development”
每一个环境environment元素定义的环境ID
事务管理器的配置:transactionManager
数据源的配置:dataSource

在这里插入图片描述
在这里插入图片描述
mappers:映射器
定义的SQL映射语句,告诉mybatis去哪查找SQL的语句,主要提供三种方式加载映射文件

  <!--引入映射文件:在和spring整合后不需要在这里配置了-->
    <mappers>
        <!--resource方式:单个mapper的映射:定义的mapper.xml文件中namespace为maper接口的地址,
        映射文件通过namespace找到对应的mapper的接口文件
        mapper.xml文件和mapper的接口文件可以不放在一个目录下,且mapper.xml和mapper的及接口文件名可以不一致
        -->
        <mapper resource="mapper/Student23Mapper.xml"/>

        <!--class方式:单个mapper的映射:遵循规则:将mapper.xml文件和mapper接口文件放在一个目录下,并且文件名保持一致-->
        <mapper class="com.tulun.inteface.Student23Mapper"/>

        <!--批量的mapper扫描:package方式:批量mapper映射:遵循规则:mapper.xml文件和mapper接口文件在同一目录下,且文件名相同-->
        <package name="com.tulun.inteface"/>
    </mappers>

2、Mapper.xml文件详解

主要关注CRUD便签
查询:select标签
插入:insert标签
变更:update标签
删除:delete便签

3、编码详解

SqlSessionFactoryBuilder
创建会话工厂实例SqlSessionFactory
SqlSessionFactory:会话工厂
通过读取配置文件,配置文件一次读取就可以实例化所有需要的会话,SqlSessionFactory设置为单例
通过SqlSessionFactory创建会话
SqlSession:会话
对数据库的CRUD操作都是通过SqlSession来操作的
SqlSession是线程不安全的,将其设置为局部变量

Junit测试介绍

测试是在开发过程中保证代码质量的必不可少的环境,开发人员常用的一键构建测试结构的功能,通过Junit做单元测试

Junit的测试步骤

引入依赖

  <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

生产测试类

在这里插入图片描述
在这里插入图片描述

Junit介绍

用来编写和运行可重复的自动化的开源测试框架
用来测试整个对象,对象的一部分,几个对象之间的交互
常用的注解
@Before:在Test注解中的方法执行之前会执行
@Test 单元测试的接口方法
@After:在Test直接之后执行

public class Student23MapperTest {
    
    
    SqlSessionFactory sessionFactory = null;
    /**
     * 在编写测试方法之前,经常会在执行测试之前需要创建一些全局对象,单例对象啊
     * 在运行用例即@Test注解之前运行
     * @throws IOException
     */
    @Before
    public void before() throws IOException {
    
    
        //获取全局配置文件
        String path = "mybatis-config.xml";
        //通过mybatis提供共的Resources类来获取配置文件流
        InputStream inputStream = Resources.getResourceAsStream(path);

        //获取SQLSessionFactory对象
        sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    }

    @Test
    public void selectStudentByUid() throws IOException {
    
    
        //获取会话工厂
        SqlSession sqlSession = sessionFactory.openSession();

        //通过反射机制来后去到mapper的实例,getMapper的参数是接口名
        Student23Mapper student23Mapper = sqlSession.getMapper(Student23Mapper.class);
        Student23 student23 = student23Mapper.selectStudentByUid(1L);
        System.out.println(student23);

        sqlSession.close();

    }


    @Test
    public void selectStudentByName() throws IOException {
    
    
        //获取会话工厂
        SqlSession sqlSession = sessionFactory.openSession();

        //通过反射机制来后去到mapper的实例,getMapper的参数是接口名
        Student23Mapper student23Mapper = sqlSession.getMapper(Student23Mapper.class);
        List <Student23> student23s = student23Mapper.selectStudentByName("TL%");
        System.out.println(student23s.size());

        sqlSession.close();
    }


    /**
     * 在Test注解运行的方法之后运行
     */
    @After
    public void after() {
    
    

    }
}

mybatis的使用方法:配置和注解

XML方式使用

1、创建mapper接口文件

public interface Student23Mapper {
    
    

    //通过id查询学生信息
    public Student23 selectStudentByUid(Long  uid);
}

2、创建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">
<!--mapper:根标签,namespace:命名空间,接口文件的全路径(包名+类型)-->
<mapper namespace="com.tulun.inteface.Student23Mapper">

    <!-- 通过id查询学生信息-->
    <select id="selectStudentByUid" parameterType="long" resultType="student23">
        select * from Student where SID = #{
    
    uid}
    </select>
</mapper>
<!--
    resultMap标签
    id属性:取名字
    type属性:指定映射的pojo类对象的全路径
    -->
    <resultMap id="StudentMap" type="com.tulun.pojo.Student23">
        <!--
        id标签:指定的是主键的映射关系
        result标签:非主键的映射关系
        column属性:数据库字段的名称
        property属性:pojo类中属性名
        jdbcType属性:数据可字段的类型
        javaType属性:指定java属性的类型
        typeHandler属性:执行类型映射操作
        -->
        <id property="SID" column="SID" />
        <result property="name" column="Sname"/>
        <result property="Ssex" column="Ssex"/>
        <result property="Sage" column="Sage"/>
    </resultMap>

    <!-- 通过id查询学生信息
    select查询标签
    id属性:对应接口中的方法名,在同一个namespace中,id是不能重复的
    parameterType属性:指定入参类型
    resultType属性:指定返回参数的类型,指定全路径名
    resultMap属性:指定返回去参数类型
    #{
    
    XXX}:占位符,里面填写的就是方法中的参数名
    
    resultMap和resultType区别:
    使用resultType是需要数据库的字段和Java类的属性名保持一致,如果不一致则无法完成映射
    使用resultMap进行显性的映射,可以解决数据库的字段和Java类的属性名不一致的问题
  
    -->
    <select id="selectStudentByUid" parameterType="long" resultMap="StudentMap">
        select * from Student where SID = #{
    
    uid}
    </select>

    <!--通过name查询用户信息-->
    <select id="selectStudentByName" parameterType="string" resultType="student23">
        select * from Student where Sname like #{
    
    name}
    </select>

插入操作

<!--
    插入用户信息
    id属性:接口的方法名,唯一不重复
    parameterType属性:指定参数类型
    useGeneratedKeys属性:获取有数据库内部生成的主键,默认是false,值可以是truefalse
    timeout属性:设置在抛出异常之前,等待数据库返回结果单额秒数
    flushCache属性:用来清空一级缓存和二级缓存  默认值为true
    -->
    <insert id="insertStudent" parameterType="student23" >
        insert into  Student(SID,Sname,Ssex,Sage) values (#{
    
    SID},#{
    
    name},#{
    
    Ssex},#{
    
    Sage})
    </insert>

3、配置映射路径

<!--引入映射文件:在和spring整合后不需要在这里配置了-->
    <mappers>
        <mapper resource="mapper/Student23Mapper.xml"/>
    </mappers>

多个接口参数
以update为例

public int updateStudent1(@Param("SID") Long SID, @Param("name") String name)

在多个参数传递时,需要在方法参数上添加@Param注解,mybatis会自动将参数封装为Map类型,@Param注解值会作为Map的key,因此SQL会通过配置的注解值来使用参数

注解方法使用

注解形式将SQL直接写在接口上
@Insert注解
在接口方法上使用注解@Insert,将SQL直接写在该注解内

  @Insert("insert into  Student(SID,Sname,Ssex,Sage) values (#{SID},#{name},#{Ssex},#{Sage})")
    public int insertStudent(Student23 student);

注意:在注解形式内也提供了类似xml方式提供的功能,包括自增注解,缓存开启等功能,需要将这些配置写在@Options注解内,如下:

    @Options(useGeneratedKeys = true,timeout = 1000,useCache = true)
    @Insert("insert into  Student(SID,Sname,Ssex,Sage) values (#{SID},#{name},#{Ssex},#{Sage})")
    public int insertStudent(Student23 student);

@Select操作

@Select("select * from Student where SID = #{uid}")
    public Student23 selectStudentByUid(Long  uid);

select注解使用如上,和xml方式中返回参数类型为parameterType类似,存在数据库列名和java的属性名不一致则无法完成映射

@Results({
    
    

            @Result(property ="SID" ,column = "SID"),
            @Result(property ="name" ,column = "Sname"),
            @Result(property ="Sage" ,column = "Sage"),
            @Result(property ="Ssex" ,column = "Ssex"),
            })

以上写法类似于xml方式中通过resultMap返回结果集
@Results类似于xml中resultMap标签,@Result类似于result属性

mybatis注解形式如何共用
@Results返回参数映射的问题。需要共用的其他方法在上面添加一个@ResultMap注解,注解内的value值就是映射注解中的id值
在这里插入图片描述

SSM整合

Spring和Mybatis的整合

将mybatis中的实例交给spring管理
Spring通过单例方式来管理SQLSessionFactory
mybatis中SQLSessionFactory的创建是通过SQLSessionFactoryBuilder来创建实例化
在mybatis和spring的整合后,通过SQLSessionFactoryBean来替代,
SQLSessionFactoryBean必须给定一个属性dataSource
给定一个属性configLocation,用来指定mybatis的xml配置文件

整合步骤

第一步:引入依赖

spring的4个核心依赖、mybatis、jdbc…
需要一个依赖,是mybatis提供的,专门用来和spring整合,mybatis-spring

        <!--mybatis的整合依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>

配置spring的配置文件

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!--配置连接池c3p0-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value=""/>
        <property name="jdbcUrl" value=""/>
        <property name="user" value=""/>
        <property name="password" value=""/>
    </bean>
    
    
    <!--配置SQLSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--配置数据源-->
        <property name="dataSource" ref="dataSource" />
    </bean>
    
</beans>

需求:查询Student表中所有的学生信息

配置一个spring的配置文件,将mybatis的一些配置放入到spring,交给容器进行管理
数据源,会话工厂

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!--配置数据源:借助连接池c3p0-->

    <!--<bean id="datasource1" class="com.mchange.v2.c3p0.ComboPooledDataSource">-->

        <!--&lt;!&ndash;注入属性值&ndash;&gt;-->
        <!--<property name="driverClass" value="com.mysql.jdbc.Driver"/>-->
        <!--<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>-->
        <!--<property name="user" value="root"/>-->
        <!--<property name="password" value="123456"/>-->
    <!--</bean>-->
    <bean id="datasource1" class="com.alibaba.druid.pool.DruidDataSource">

        <!--注入属性值-->
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

    <!--

    创建SQLSessionFactory对象

    sqlSessionFactory的类的全路径名是mybatis-spring包中提供的SqlSessionFactoryBean创建的

    -->

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

        <!--数据库的连接配置-->

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

        <!--配置mybatis的XML文件的路径-->

        <property name="configLocation" value="classpath:Spring-mybatis.xml"/>

        <!--

        配置xml文件的映射

        在mybatis学习中,该配置时在<mapper>标签下添加的

        -->
        <property name="mapperLocations">
            <list>
                <value>mapper/Student23Mapper.xml</value>
            </list>
        </property>

    </bean>

    <!--
    通过代理模式进行Mapper映射开发
    MapperFactoryBean是mybatis-spring包提供的完成映射的类
    -->
    <bean id="student23Mapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <!--指定单个的mapper映射方式
        mapperInterface属性:指定的是接口 value是接口的全路径
        -->

        <property name="mapperInterface" value="com.tulun.inteface.Student23Mapper"/>
        <!--会话工厂-->
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>

    </bean>

    <!--Student23Service交给spring管理-->
    <bean id="student23Service" class="com.tulun.service.StudentService">
        <!--注入mapper到当前的Service-->
        <constructor-arg name="student23Mapper" ref="student23Mapper"/>
    </bean>


</beans>

在这里插入图片描述

整合思路
web项目在后端controller层,service,dao层,使用框架SpringMVC,Spring,Mybatis
第一步:整合dao层
mybatis和spring整合,通过spring管理mapper接口
使用mapper的扫描器自动扫描mapper接口在spring中进行注册。
第二步:整合service层
通过spring管理service接口
使用配置方式将service接口配置在spring配置文件中。
实现事务控制
第三步:整合springMvc
由于springmvc是spring的模块,不需要整合。

整合步骤

需求:将test库中user表中的所有信息展示在页面
数据库如下:

select * from user;
+----+----------+--------+
| id | name     | passwd |
+----+----------+--------+
|  1 | zhangsan | 1234   |
|  2 | 12345    | 1234   |
+----+----------+--------+

1.引入依赖

<!--Spring 基本核心jar包-->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
          <version>${
    
    spring.version}</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
          <version>${
    
    spring.version}</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>${
    
    spring.version}</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-expression</artifactId>
          <version>${
    
    spring.version}</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
          <version>${
    
    spring.version}</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aop</artifactId>
          <version>${
    
    spring.version}</version>
      </dependency>


      <!--log4j日志-->
      <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.17</version>
      </dependency>

      <!--Spring MVC依赖-->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>${
    
    spring.version}</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>${
    
    spring.version}</version>
      </dependency>
      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
      </dependency>

      <!--mybatis-->
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.39</version>
      </dependency>
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.4.1</version>
      </dependency>
      <dependency>
          <groupId>c3p0</groupId>
          <artifactId>c3p0</artifactId>
          <version>0.9.1.1</version>
      </dependency>


      <!--mybatis和spring的整合-->
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>1.3.0</version>
      </dependency>

2.dao层处理

pojo类,mapper.java,mapper.xml,mybatis的配置文件
mybatis的全局配置文件(spring-mybatis)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--不需要配置信息-->
</configuration>

pojo类:

public class User {
    
    
    private Long id;
    private String name;
    private String passswd;
}

mapper.java

public interface UserMapper {
    
    
    public List<User>  selectAllUser();
}

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">
<mapper namespace="com.tulun.ssm.dao.UserMapper">

    <!--selectAllUser-->
    <select id="selectAllUser" resultType="com.tulun.ssm.pojo.User">
        select * from user
    </select>
</mapper>

3.spring配置

spring的配置文件(spring-core.xml)

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!--通过扫描注解的形式来管理bean-->
    <context:component-scan base-package="com.tulun.ssm"/>
    
    <!--数据源-->
    <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!--注入属性值-->
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
        <property name="user" value="root"/>
        <property name="password" value="123456"/>
    </bean>
    
    <!--配置会话工厂-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--数据源-->
        <property name="dataSource" ref="datasource"/>
        
        <!--XML配置文件-->
        <property name="configLocation" value="spring-mybatis.xml"/>
        
        <!--Mapper的映射-->
        <property name="mapperLocations" value="mapper/*.xml"/>
    </bean>
    
    <!--代理对象-->
    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <!--指定单个的mapper映射方式
        mapperInterface属性:指定的是接口 value是接口的全路径
        -->

        <property name="mapperInterface" value="com.tulun.ssm.dao.UserMapper"/>
        <!--会话工厂-->
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
    
</beans>

注解形式来装配bean:以userService为例讲解

/**
 * 通过注解形式来完成依赖注入和Bean管理
 */
@Service
public class UserService {
    
    

    //将dao层对象注入到service层
    @Autowired
    UserMapper userMapper;

    public List<User> allUsers(){
    
    
        return userMapper.selectAllUser();
    }
}

4.spring mvc的处理

配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <!--配置前端控制器-->
    <servlet>
        <servlet-name>spring23</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring23</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
配置springMVC的配置文件(Spring-mvc.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
    <!--配置处理器适配器、处理器映射器、视图解析器-->
    <!--通过扫描注解的形式来查找spring MVC的信息-->
    <context:component-scan base-package="com.tulun.ssm.controller"/>
    <!--通过这种形式可以不同配置处理器适配器和处理器映射器,采用默认的组件-->
    <!--视图解析器:jsp-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--处理JSP页面-->
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

配置springMVC的配置文件(Spring-mvc.xml)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">

    <!--配置处理器适配器、处理器映射器、视图解析器-->
    <!--通过扫描注解的形式来查找spring MVC的信息-->
    <context:component-scan base-package="com.tulun.ssm.controller"/>
    <!--通过这种形式可以不同配置处理器适配器和处理器映射器,采用默认的组件-->

    <!--视图解析器:jsp-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--处理JSP页面-->
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"></property>

        <!--后缀-->
        <property name="suffix" value=".jsp"/>

    </bean>

</beans>

页面jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
        <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

        <html>
        <head>
        <title>数据展示</title>
        </head>
        <body>
        <table align="center" border="1">
        <thead>
        <tr>
        <td>用户id</td>
        <td>用户名</td>
        <td>密码</td>
        </tr>
        </thead>
        <tbody>
        <c:forEach items="${users}" var="user">
            <tr>
            <td>${
    
    user.id}</td>
            <td>${
    
    user.name}</td>
            <td>${
    
    user.passswd}</td>
            </tr>
        </c:forEach>
        </tbody>
        </table>
        </form>

        </body>
        </html>

controller

@Controller
public class UserController {
    
    
    //将service层对象注入到Controller层
    @Autowired
    UserService userService;


    @RequestMapping("/index")
    public ModelAndView userList(){
    
    
        List <User> users = userService.allUsers();

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("users",users);
        modelAndView.setViewName("userList");
        return modelAndView;
    }
}

将spring的配置文件配置到web.xml文件中

<!-- 加载spring容器:Spring和mybatis的配置文件 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-core.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

猜你喜欢

转载自blog.csdn.net/qq_40939454/article/details/112392233
今日推荐