SSM整合实现CRUD(上)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: SSM整合实现CRUD(上)

相关配置文件



pom.xml


各个依赖的配置 ,直接复制即可


<!-- 控制Maven在构建过程中相关配置 --
    <build
        <!-- 构建过程中用到的插件 --
        <plugins
            <!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 --
            <plugin
                <groupIdorg.mybatis.generator</groupId
                <artifactIdmybatis-generator-maven-plugin</artifactId
                <version1.3.0</version
                <!-- 插件的依赖 --
                <dependencies
                    <!-- 逆向工程的核心依赖 --
                    <dependency
                        <groupIdorg.mybatis.generator</groupId
                        <artifactIdmybatis-generator-core</artifactId
                        <version1.3.2</version
                    </dependency
                    <!-- 数据库连接池 --
                    <dependency
                        <groupIdcom.mchange</groupId
                        <artifactIdc3p0</artifactId
                        <version0.9.2</version
                    </dependency
                    <!-- MySQL驱动 --
                    <dependency
                        <groupIdmysql</groupId
                        <artifactIdmysql-connector-java</artifactId
                        <version8.0.26</version
                    </dependency
                </dependencies
            </plugin
        </plugins
    </build
<!--    Spring的版本,不需要一个个管理,直接配置好,然后用${}来引用--
    <properties
        <spring.version5.3.1</spring.version
    </properties
    <dependencies
        <!--上下文依赖--
        <dependency
            <groupIdorg.springframework</groupId
            <artifactIdspring-context</artifactId
            <version${spring.version}</version
        </dependency
        <!--管理bean的依赖--
        <dependency
            <groupIdorg.springframework</groupId
            <artifactIdspring-beans</artifactId
            <version${spring.version}</version
        </dependency
        <!--springmvc--
        <dependency
            <groupIdorg.springframework</groupId
            <artifactIdspring-web</artifactId
            <version${spring.version}</version
        </dependency
        <dependency
            <groupIdorg.springframework</groupId
            <artifactIdspring-webmvc</artifactId
            <version${spring.version}</version
        </dependency
        <!--事务解析器(事务管理器)的那个类,就在jdbc中,所以需要引用这个依赖--
        <dependency
            <groupIdorg.springframework</groupId
            <artifactIdspring-jdbc</artifactId
            <version${spring.version}</version
        </dependency
        <!--管理切面的依赖--
        <dependency
            <groupIdorg.springframework</groupId
            <artifactIdspring-aspects</artifactId
            <version${spring.version}</version
        </dependency
        <!--Spring整和Junit测试的--
        <dependency
            <groupIdorg.springframework</groupId
            <artifactIdspring-test</artifactId
            <version${spring.version}</version
        </dependency
        <!-- Mybatis核心 --
        <dependency
            <groupIdorg.mybatis</groupId
            <artifactIdmybatis</artifactId
            <version3.5.7</version
        </dependency
        <!--mybatis和spring的整合包,会提供一些特殊的类--
        <dependency
            <groupIdorg.mybatis</groupId
            <artifactIdmybatis-spring</artifactId
            <version2.0.6</version
        </dependency
        <!-- 连接池 --
        <dependency
            <groupIdcom.alibaba</groupId
            <artifactIddruid</artifactId
            <version1.0.9</version
        </dependency
        <!-- junit测试 --
        <dependency
            <groupIdjunit</groupId
            <artifactIdjunit</artifactId
            <version4.12</version
            <scopetest</scope
        </dependency
        <!-- MySQL驱动 --
        <dependency
            <groupIdmysql</groupId
            <artifactIdmysql-connector-java</artifactId
            <version8.0.16</version
        </dependency
        <!-- log4j日志 --
        <dependency
            <groupIdlog4j</groupId
            <artifactIdlog4j</artifactId
            <version1.2.17</version
        </dependency
        <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper --
        <!--分页插件--
        <dependency
            <groupIdcom.github.pagehelper</groupId
            <artifactIdpagehelper</artifactId
            <version5.2.0</version
        </dependency
        <!-- 日志 slf4g --
        <dependency
            <groupIdch.qos.logback</groupId
            <artifactIdlogback-classic</artifactId
            <version1.2.3</version
        </dependency
        <!-- ServletAPI 前端控制器就是间接继承里面的httpServlet --
        <dependency
            <groupIdjavax.servlet</groupId
            <artifactIdjavax.servlet-api</artifactId
            <version3.1.0</version
            <scopeprovided</scope
        </dependency
        <!--处理json数据的依赖--
        <dependency
            <groupIdcom.fasterxml.jackson.core</groupId
            <artifactIdjackson-databind</artifactId
            <version2.12.1</version
        </dependency
        <!--实现文件上传的依赖,下载不需要--
        <dependency
            <groupIdcommons-fileupload</groupId
            <artifactIdcommons-fileupload</artifactId
            <version1.3.1</version
        </dependency
        <!-- Spring5和Thymeleaf整合包 --
        <dependency
            <groupIdorg.thymeleaf</groupId
            <artifactIdthymeleaf-spring5</artifactId
            <version3.0.12.RELEASE</version
        </dependency
    </dependencies


web.xml


作用:

web项目启动的时候,首先对web.xml文件进行一个加载,只有此文件没有异常的时候,我们加载的web项目才算是真正的跑起来,而web.xml文件的内容加载也是由一定的顺序的.


代码实现


<?xml version="1.0" encoding="UTF-8"?
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    <!-- 配置Spring的编码过滤器 --
    <filter
        <filter-nameCharacterEncodingFilter</filter-name
        <filter-classorg.springframework.web.filter.CharacterEncodingFilter</filter-class
        <init-param
            <param-nameencoding</param-name
            <param-valueUTF-8</param-value
        </init-param
        <init-param
            <param-nameforceEncoding</param-name
            <param-valuetrue</param-value
        </init-param
    </filter
    <filter-mapping
        <filter-nameCharacterEncodingFilter</filter-name
        <url-pattern/*</url-pattern
    </filter-mapping
    <!-- 配置处理请求方式PUT和DELETE的过滤器 --
    <filter
        <filter-nameHiddenHttpMethodFilter</filter-name
        <filter-classorg.springframework.web.filter.HiddenHttpMethodFilter</filter-class
    </filter
    <filter-mapping
        <filter-nameHiddenHttpMethodFilter</filter-name
        <url-pattern/*</url-pattern
    </filter-mapping
    <!-- 配置SpringMVC的前端控制器 --
    <servlet
        <servlet-nameSpringMVC</servlet-name
        <servlet-classorg.springframework.web.servlet.DispatcherServlet</servlet-class
        <!-- 设置SpringMVC的配置文件的位置和名称 --
        <init-param
            <param-namecontextConfigLocation</param-name
            <param-valueclasspath:SpringMVC.xml</param-value
        </init-param
        <!--将DispatcherServlet的初始化时间提前到服务器启动时--
        <load-on-startup1</load-on-startup
    </servlet
    <servlet-mapping
        <servlet-nameSpringMVC</servlet-name
        <url-pattern/</url-pattern
    </servlet-mapping
    <!-- 设置Spring的配置文件的位置和名称 --
    <context-param
        <param-namecontextConfigLocation</param-name
        <param-valueclasspath:Spring.xml</param-value
    </context-param
    <!-- 配置Spring的监听器 :作用再Spring服务启动时加载Spring的配置文件来获取ioc容器--
    <listener
        <listener-classorg.springframework.web.context.ContextLoaderListener</listener-class
    </listener
</web-app

     


SpringMVC.xml


作用:


  1. 用户发送请求,被 SpringMVC 的前端控制器 DispatcherServlet 拦截,配置拦截器
  2. 由 DispatcherServlet 查询HanderMapping,找到处理请求的Controller
  3. Controller调用业务逻辑进行处理后,返回ModelAndView,进行试图控制
  4. DispatcherServlet 查询视图解析器,找到ModelAndView指定的视图
  5. 视图负责将结果显示到客户端


代码展示

<?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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"
   <!--扫描组件- SpringMVC只需要扫描控制层组件--
    <context:component-scan base-package="SSM.controller"</context:component-scan
    <!--配置视图解析器--
    <bean id="viewResolver"
          class="org.thymeleaf.spring5.view.ThymeleafViewResolver"
        <property name="order" value="1"/
        <property name="characterEncoding" value="UTF-8"/
        <property name="templateEngine"
            <bean class="org.thymeleaf.spring5.SpringTemplateEngine"
                <property name="templateResolver"
                    <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"
                        <!-- 视图前缀 --
                        <property name="prefix" value="/WEB-INF/templates/"/
                        <!-- 视图后缀 --
                        <property name="suffix" value=".html"/
                        <property name="templateMode" value="HTML5"/
                        <property name="characterEncoding" value="UTF-8" /
                    </bean
                </property
            </bean
        </property
    </bean
    <!--配置文件(图片)上传的解析器--
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/
<!--    <mvc:interceptors--
<!--        <mvc:interceptor--
<!--            &lt;!&ndash;        对于path的路径中, /* 只能拦截根目录下的一层路径, /**可以拦截目录下所有的路径&ndash;&gt;--
<!--            <mvc:mapping path="/**"/--
<!--            &lt;!&ndash;            exclude除了XXX之外,需要拦截的请求路径&ndash;&gt;--
<!--            <mvc:exclude-mapping path="/abc"/--
<!--            &lt;!&ndash;配置拦截器的实现类,实现HandlerInterceptor(处理程序拦截器)接口&ndash;&gt;--
<!--            <bean class="SSM.interceptor.FirstInterceptor"/--
<!--            &lt;!&ndash;            <ref bean="firstInterceptor"/&ndash;&gt;--
<!--        </mvc:interceptor--
<!--    </mvc:interceptors--
    <!-- 配置默认的servlet处理静态资源 --
    <mvc:default-servlet-handler /
    <!-- 开启MVC的注解驱动 --
    <mvc:annotation-driven /
<!--    &lt;!&ndash; 配置访问首页的视图控制 &ndash;&gt;--
    <mvc:view-controller path="/" view-name="index"</mvc:view-controller
    <mvc:view-controller path="/to/add" view-name="add"</mvc:view-controller
    <mvc:view-controller path="/update" view-name="update"</mvc:view-controller
<!--    <mvc:view-controller path="/update2" view-name="update"</mvc:view-controller--
</beans


Spring.xml


作用:


  1. IOC容器、aop、装载bean、spring事务。
  2. 配置Mapper接口扫描,通过SqlSession创建 代理实现类对象,并将这些对象交给IOC容器来管理.省去dao层。
  3. 实现对MyBatis相关组件修改,可代替mybatis的配置文件


代码展示


<?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: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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"
    <!--    扫描处理controller层之外的其他层--
    <context:component-scan base-package="SSM"
        <!--排除对控制层组件的扫描--
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/
    </context:component-scan
    <!--配置事务管理器--
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
        <property name="dataSource" ref="dataSource"
        </property
    </bean
    <!--开启事务的管理驱动 ,将使用@Annotation标识的方法或类中所有的方法进行事务管理--
    <tx:annotation-driven transaction-manager="transactionManager"/
<!--    配置数据源的扫描--
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/
        <property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"/
        <property name="username" value="root"/
        <property name="password" value="root"/
    </bean
    <!--配置SqlSessionFactory工厂
   配置sqlSessionBean :可以帮助我们直接在Spring的ioc中获取sqlSessionFactory对象
   --
<!--    <bean class="org.mybatis.spring.SqlSessionFactoryBean"--
<!--        设置mybatis核心配置文件的bean--
<!--        <property name="configLocation" value="classpath:mybatis-config.xml"</property--
<!--        <property name="dataSource" ref="dataSource"</property--
<!--        <property name="typeAliasesPackage" value="SSM.pojo.Employee"</property--
        <!--将下划线映射为小驼峰--
<!--        <property name="configurationProperties" value="mapUnderscoreToCamelCase"</property--
        <!--  这个标签设置原因是因为,映射文件所在的包,和mapper所在的包不一致时才设置
    <property name="mapperLocations" value="classpath:mappers/*.xml"</property--
<!--        <property name="plugins"--
<!--            <array--
<!--                <bean class="com.github.pagehelper.PageInterceptor"--
<!--                </bean--
<!--            </array--
<!--        </property--
<!--    </bean--
    <!--配置SqlSessionFactory工厂
    配置sqlSessionBean :可以帮助我们直接在Spring的ioc中获取sqlSessionFactory对象
    --
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
        <property name="configLocation" value="classpath:mybatis-config.xml"
        </property
        <property name="dataSource" ref="dataSource"
        </property
        <property name="configurationProperties" value="mapUnderscoreToCamelCase"
        </property
     </bean
    <!--配置mapper接口的扫描,可以将指定包下的所有mapper接口,通过SqlSession创建
    代理实现类对象,并将这些对象交给IOC容器来管理--
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
        <property name="basePackage" value="SSM.mapper"
        </property
    </bean
</beans


MyBatis-config.xml


作用:


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

代码实现


<?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"
<!--MyBatis的核心配置文件--
<configuration
    <settings
        <!-- 是否开启自动驼峰命名规则(camel case)映射,即从数据库列名 A_COLUMN 到属性名 aColumn 的类似映射 --
        <setting name="mapUnderscoreToCamelCase" value="true"/
    </settings
    <!--    引入properties文件  , 这样的话,以后就可以直接在当前文件中时使用 的方式来访问驱动类--
    <typeAliases
        <!--::用下面这个标签 他的别名就是pojo中的类名 ,且不区分大小写--
        <package name="SSM.pojo"/
    </typeAliases
<!--    将下划线映射为驼峰--
<!--    <settings--
<!--        <setting name="mapUnderscoreToCamelCase" value="true"/--
<!--    </settings--
    <!--配置分页插件--
    <plugins
        <!--设置分页插件--
        <plugin interceptor="com.github.pagehelper.PageInterceptor"
        </plugin
    </plugins
    <!--设置连接数据库的环境--
    <environments default="development"
        <!--          id  与default的内容是一样的--
        <environment id="development"
            <transactionManager type="JDBC"/
            <dataSource type="POOLED"
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/
                <property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"/
                <property name="username" value="root"/
                <property name="password" value="root"/
            </dataSource
        </environment
    </environments
    <!--mybatis映射文件--
    <mappers
        <!--
    这个的要求是:1. 映射文件所在的包 和mapper接口所在的包一样
               2. 映射文件的名字和mapper接口的名字保持一致
--
        <package name="SSM.mapper"/
    </mappers
</configuration


log4j.xml


作用:(暂时不明)


  1. ConsoleAppender: 日志输出到控制台;
  2. FileAppender:输出到文件;
  3. RollingFileAppender:输出到文件,文件达到一定阈值时,自动备份日志文件;
  4. DailyRollingFileAppender:可定期备份日志文件,默认一天一个文件,也可设置为每分钟一个、每小时一个;
  5. WriterAppender:可自定义日志输出位置


代码展示


<?xml version="1.0" encoding="UTF-8" ?
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"
        <param name="Encoding" value="UTF-8" /
        <layout class="org.apache.log4j.PatternLayout"
            <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
%m (%F:%L) \n" /
        </layout
    </appender
    <logger name="java.sql"
        <level value="debug" /
    </logger
    <logger name="org.apache.ibatis"
        <level value="info" /
    </logger
    <root
        <level value="debug" /
        <appender-ref ref="STDOUT" /
    </root
</log4j:configuration


generatorConfig.xml


作用:

实现MyBatis逆向工程的配置文件,具体操作详见 本人前面的文章


代码展示


<?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
        <!--
targetRuntime: 执行生成的逆向工程的版本
        MyBatis3Simple: 生成基本的CRUD(简洁版)
        MyBatis3: 生成带条件的CRUD(终极版)
--
        <context id="DB2Tables" targetRuntime="MyBatis3"
                <!-- 1. 数据库的连接信息 --
                <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                    connectionURL="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"
                    userId="root"
                    password="root"
                </jdbcConnection
                <!-- 2. javaBean 数据库表对应的实体类--
                <javaModelGenerator targetPackage="SSM.pojo" targetProject=".\src\main\java"
                        <property name="enableSubPackages" value="true" /
                        <property name="trimStrings" value="true" /
                </javaModelGenerator
                <!-- 3. SQL映射文件的生成策略 --
                <sqlMapGenerator targetPackage="SSM.mapper" targetProject=".\src\main\resources"
                        <property name="enableSubPackages" value="true" /<!--作用: 是否启动子包--
                </sqlMapGenerator
        <!--        4. java客户端生成器--
                <!-- 4. Mapper接口的生成策略 --
                <javaClientGenerator type="XMLMAPPER" targetPackage="SSM.mapper" targetProject=".\src\main\java"
                        <property name="enableSubPackages" value="true" /
                </javaClientGenerator
                <!-- 5. 逆向分析的表 --
                <!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName --
                <!-- domainObjectName属性指定生成出来的实体类的类名 --
                <table tableName="t_emp" domainObjectName="Employee"/
        </context
</generatorConfiguration


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
java202304java学习笔记第六十七天-ssm-动态sql-xml完成基本得crud之2
java202304java学习笔记第六十七天-ssm-动态sql-xml完成基本得crud之2
50 0
java202304java学习笔记第六十七天-ssm-动态sql-xml完成基本得crud之2
|
前端开发 数据库
SSM整合实现CRUD(下)
SSM整合实现CRUD(下)
85 0
java202304java学习笔记第六十七天-ssm-动态sql-注解完成基本得crud
java202304java学习笔记第六十七天-ssm-动态sql-注解完成基本得crud
62 0
java202304java学习笔记第六十七天-ssm-动态sql-xml完成基本得crud之1
java202304java学习笔记第六十七天-ssm-动态sql-xml完成基本得crud之1
49 0
|
前端开发 JavaScript Java
SSM实现CRUD和分页功能
SSM实现CRUD和分页功能
110 0
|
Java 数据库 Spring
【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate(二)
【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate(二)
295 0
【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate(二)
|
前端开发 Java Spring
【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate(一)
【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate(一)
170 0
【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate(一)
|
XML 存储 Java
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(四)
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(四)
139 0
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(四)
|
XML Java 数据格式
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(三)
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(三)
168 0
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(三)
|
XML 设计模式 Java
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(二)
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(二)
151 0
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(二)