详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2

八、配置Spring的配置文件applicationContext.xml:

1、配置数据源:

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


<!--    1、配置数据源-->
    <context:property-placeholder location="classpath:dbconfig.properties"></context:property-placeholder>
    <bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
        <property name="driverClass" value="${jdbc.driverClass}"></property>
        <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

</beans>

详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_spring
详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_数据源_02
2、配置完数据源之后,再来配置扫描组件。
spring的配置和springmvc的配置不一样。
springmvc只扫描controller组件
而spring除了controller组件不扫描,其他的组件全都要扫描。

<context:component-scan base-package="com.rtl.crud">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

3、在applicationContext.xml配置spring与mybatis的整合

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--        指定mybatis的全局配置文件的位置-->
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!--        指定数据源-->
        <property name="dataSource" ref="pooledDataSource"></property>
<!--        指定以后所有的mapper文件的存放位置-->
        <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
    </bean>

详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_springmvc_03

4、配置扫描器:将mybatis接口的实现加入到ioc容器中。

//将所有dao接口的实现加入到ioc容器中
 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.rtl.crud.dao"></property>
    </bean>

详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_spring_04

5、事务控制的配置:

 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--        控制住数据源-->
        <property name="dataSource" ref="pooledDataSource"></property>
    </bean>

6、使用xml配置形式的事务
先要有aop的名称空间

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

详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_数据源_05
配置切入点表达式:

<aop:config>
        <aop:pointcut id="txPoint" expression="execution(* com.rtl.crud.service..*(..))"/>
    </aop:config>

详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_xml_06
引入tx名称空间

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

配置事务增强(配置事务如何切入?)

<aop:config>
        <aop:pointcut id="txPoint" expression="execution(* com.rtl.crud.service..*(..))"/>
<!--        配置事务增强,就是配置事务如何切入?-->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"></aop:advisor>
    </aop:config>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
<!--            这个*代表,所有方法都是事务方法-->
            <tx:method name="*"/>
<!--            所有以get开始的方法都只读,这个会优化-->
            <tx:method name="get*" read-only="true"></tx:method>
        </tx:attributes>
    </tx:advice>

总结spring的配置文件的核心点:
数据源
spring与mybatis的整合
事务控制

总结spring的配置文件applicationContext.xml里面的内容:

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


    <context:component-scan base-package="com.rtl.crud">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

<!--    1、配置数据源-->
    <context:property-placeholder location="classpath:dbconfig.properties"></context:property-placeholder>
    <bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
        <property name="driverClass" value="${jdbc.driverClass}"></property>
        <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--        指定mybatis的全局配置文件的位置-->
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!--        指定数据源-->
        <property name="dataSource" ref="pooledDataSource"></property>
<!--        指定以后所有的mapper文件的存放位置-->
        <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
    </bean>

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--        将com.rtl.crud.dao这个包下的所有接口都加入到ioc容器中-->
        <property name="basePackage" value="com.rtl.crud.dao"></property>
    </bean>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--        控制住数据源-->
        <property name="dataSource" ref="pooledDataSource"></property>
    </bean>
    
    <aop:config>
        <aop:pointcut id="txPoint" expression="execution(* com.rtl.crud.service..*(..))"/>
<!--        配置事务增强,就是配置事务如何切入?-->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"></aop:advisor>
    </aop:config>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
<!--            这个*代表,所有方法都是事务方法-->
            <tx:method name="*"/>
<!--            所有以get开始的方法都只读,这个会优化-->
            <tx:method name="get*" read-only="true"></tx:method>
        </tx:attributes>
    </tx:advice>

</beans>

九、Mybatis的逆向工程

这里准备些Mybatis的配置文件:mybatis-config.xml
https://mybatis.org/mybatis-3/getting-started.html
官方给出的例子:
详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_xml_07
先拿到配置文件的头信息:

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

1、配置驼峰命名规则:

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

详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_springmvc_08

2、给bean起别名:

<typeAliases>
        <package name="com.rtl.crud.bean"/>
    </typeAliases>

详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_数据源_09
3、在数据库ssm_crud里面创建项目中要用的表
表1:tbl_emp
详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_mybatis_10

表2:tbl_dept
详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_数据源_11
设置员工的d_id和部门表的id是外键的关系。
详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_数据源_12
详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_xml_13

创建好这两张表之后,使用Mybatis的逆向工程自动生成bean类和Mapper接口
http://mybatis.org/generator/
1、现在pom里面引入mybatis-generator-core

<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.5</version>
</dependency>

目前为止整个pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>

    <groupId>com.rtl</groupId>
    <artifactId>ssm-crud</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.2</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>

        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
        </dependency>

    </dependencies>

</project>

2、参考官网:
http://mybatis.org/generator/configreference/xmlconfig.html
详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_数据源_14
3、在项目右键,新建一个xml文件
mbg.xml
详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_spring_15
详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_xml_16
修改从官网里面复制过来的里面的参数:
1、数据库连接:

<jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/ssm_crud"
                        userId="root"
                        password="root">
        </jdbcConnection>

2、指定生成的java bean的位置:

<javaModelGenerator targetPackage="com.rtl.crud.bean" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_spring_17

3、指定sql的映射文件生成的位置:

 <sqlMapGenerator targetPackage="mapper"  targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_mybatis_18
4、指定dao(mapper)接口生成的位置:

<javaClientGenerator type="XMLMAPPER" targetPackage="com.rtl.crud.dao"  targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_数据源_19
5、指定每张表生成的策略:

<table tableName="tbl_emp" domainObjectName="Employee"></table>
        <table tableName="tbl_dept" domainObjectName="Department"></table>

详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_xml_20
总体的mbg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/ssm_crud"
                        userId="root"
                        password="root">
        </jdbcConnection>

        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <javaModelGenerator targetPackage="com.rtl.crud.bean" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <sqlMapGenerator targetPackage="mapper"  targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <javaClientGenerator type="XMLMAPPER" targetPackage="com.rtl.crud.dao"  targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <table tableName="tbl_emp" domainObjectName="Employee"></table>
        <table tableName="tbl_dept" domainObjectName="Department"></table>


    </context>
</generatorConfiguration>

接下来生成就行了。
怎么生成呢?
1、我们使用java代码的形式来生成。
new一个类 MBGTest.java
详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_springmvc_21
参考官网:
http://mybatis.org/generator/running/runningWithJava.html
详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_spring_22
导完包之后,将代码里面默认的配置文件的名字改为自己的:
mbg.xml

总的MBGTest.java

package com.rtl.crud.test;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class MBGTest {
    public static void main(String[] args) throws Exception{
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        File configFile = new File("mbg.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }
}

目前两个地方需要修改一下:
都是针对原先写的com.mysql.jdbc.Driver
改为com.mysql.cj.jdbc.Driver
因为我们使用的mysql是8版本的。
运行:
详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_springmvc_23
自动生成代码:
1、bean包下面详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_springmvc_24
2、dao包:

详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_数据源_25
3、mapper.xml
详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_springmvc_26
我们发现生成的文件里面有很多注释:
详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_xml_27
我们希望没有注释。
1、先把生成的这三个东西删除掉。
2、修改mbg.xml

<commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_mybatis_28
3、重新执行MBGTest.java
详细笔记的第一遍:学习ssm的整合-CRUD的第1天(2021-11-21)2_springmvc_29
现在自动生成的代码里面就没有注解了。
现在的代码很干净。