SSM学习[01]:【SSM整合】(jar包形式)

662 阅读6分钟

SSM整合思想

1.Spring集成Mybatis(数据源,实例化SqlSessionFactory,实例化Mybatis代理模式生成dao层实现类,事务控制)
2.Spring集成SpringMVC(去除重复扫描)
3.在web.xml中加载Spring和SpringMVC的配置文件。

SSM集成步骤

1.创建项目,添加相关的依赖包

Spring+SpringMVC+Mybatis+Mybatis和Spring的中间包

2.配置三个框架的配置文件(放入项目src路径下面)

注:这里我的配置文件分别是:
Spring:beans.xml
Mybatis:mybatis-config.xml
SpringMVC:springmvc.xml


Spring配置文件(我的是beans.xml):
1.引入外部的数据库连接的properties文件(db.properties):
<context:property-placeholder location="classpath:db.properties"/>
db.properties文件
db_driver=com.mysql.jdbc.Driver
db_url=jdbc:mysql://localhost:3306/ssm
db_username=root
db_password=root
2.配置数据源(这里使用的是C3P0):
<bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${db_driver}"/>
    <property name="jdbcUrl" value="${db_url}"/>
    <property name="user" value="${db_username}"/>
    <property name="password" value="${db_password}"/>
</bean>
3.实例化Mybatis的SqlSessionFactory:
<bean class="org.mybatis.spring.SqlSessionFactoryBean" >
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="dataSource" ref="ds"/>
</bean>
<!--我的Mybatis配置文件:mybatis-config.xml-->
4.实例化Mybatis的Mapper代理模式的dao层实现类:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.ssm01.dao"/>
</bean>
5.事务的配置
<!--    实例化事务的切面类(代理类)-->
    <bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="ds"/>
    </bean>
<!--事务的通知:事务的特性-->
    <tx:advice id="myadivce" transaction-manager="tx">
        <tx:attributes>
<!--            name:指定连接点
                isolation:隔离级别:DEFAULT与数据库保持一致
                propagation:传播行为:设置当前所处的事务环境REQUIRED,如果有事务就使用当前的事务,否则开启一个
                新事物
                read-only:是否只读-->
            <tx:method name="*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="pid" expression="execution(* com.ssm01.service.*.*(..))"/>
        <aop:advisor advice-ref="myadivce" pointcut-ref="pid"/>
    </aop:config>
7.去除对控制层的扫描(@Controller的全路径)
<context:component-scan base-package="com.ssm01">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

SpringMVC配置文件(根据需求可选自行配置):
<!--    扫包-->
    <context:component-scan base-package="com.ssm01.controller"/>
<!--    开启MVC注解驱动-->
    <mvc:annotation-driven />
<!-- 由默认原始servlet来处理静态资源文件 -->
    <mvc:default-servlet-handler/>    
<!--    实例化非默认的映射处理器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--    实例化非默认的适配处理器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--    定义视图解析器的前后缀-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
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>

    <typeAliases>
        <package name="com.ssm01.bean"/>
    </typeAliases>
    <mappers>
        <mapper resource="com/ssm01/dao/UserMapper.xml"/>
    </mappers>
</configuration>


web.xml配置文件(加载Spring和SpringMVC的配置文件):
1.编码过滤器:
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
2.前端控制器:
<servlet>
    <servlet-name>springmvc</servlet-name>
    <!--        前端控制类-->
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--        指定springmvc.xml配置文件路径,
    默认路径WEB-INF/servlet-name+"-"servlet.xml(例如:springmvc-servlet.xml)-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!--        “/”代表的是所有格式的请求,或者*.do,不可以*.*-->
    <url-pattern>/</url-pattern>
</servlet-mapping>


3.通过监听器加载Spring配置文件,设置监听的配置文件路径:
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--设置监听器的配置文件路径-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:beans.xml</param-value>
</context-param>

3.Mybatis逆向工程(方便测试):

1.首先导入逆向工程包,


2.创建数据库ssm和表user:


3.创建bean文件夹以及utils包下的两个文件:
generator.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="testTables" targetRuntime="MyBatis3">
      <commentGenerator>
         <!-- 是否去除自动生成的注释 true:是 : false:否 -->
         <property name="suppressAllComments" value="true" />
      </commentGenerator>
      <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
      <jdbcConnection driverClass="com.mysql.jdbc.Driver"
         connectionURL="jdbc:mysql://localhost:3306/ssm" userId="root"
         password="root">
      </jdbcConnection>
      <!--Oracle: <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
         connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg" 
         userId="yycg"
         password="yycg">
      </jdbcConnection> -->

      <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 
         NUMERIC 类型解析为java.math.BigDecimal -->
      <javaTypeResolver>
         <property name="forceBigDecimals" value="false" />
      </javaTypeResolver>

      <!-- targetProject:生成PO类的位置 -->
      <javaModelGenerator targetPackage="com.ssm01.bean"
         targetProject=".\src">
         <!-- enableSubPackages:是否让schema作为包的后缀 -->
         <property name="enableSubPackages" value="false" />
         <!-- 从数据库返回的值被清理前后的空格 -->
         <property name="trimStrings" value="true" />
      </javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置 -->
      <sqlMapGenerator targetPackage="com.ssm01.dao"
         targetProject=".\src">
         <!-- enableSubPackages:是否让schema作为包的后缀 -->
         <property name="enableSubPackages" value="false" />
      </sqlMapGenerator>
      <!-- targetPackage:mapper接口生成的位置 -->
      <javaClientGenerator type="XMLMAPPER"
         targetPackage="com.ssm01.dao"
         targetProject=".\src">
         <!-- enableSubPackages:是否让schema作为包的后缀 -->
         <property name="enableSubPackages" value="false" />
      </javaClientGenerator>
      <!-- 指定数据库表 -->
      <!-- <table tableName="items"></table>
      <table tableName="orders"></table>
      <table tableName="orderdetail"></table> -->
        <table tableName="user"/>
      
   </context>
</generatorConfiguration>
GeneratorSqlmap.java
public class GeneratorSqlmap {

   public void generator() throws Exception{

      List<String> warnings = new ArrayList<String>();
      boolean overwrite = true;
      //指定 逆向工程配置文件
      File configFile = new File("D:\\IdeaProjects\\Stage3\\ssm01\\src\\com\\ssm01\\utils\\generator.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);

   } 
   public static void main(String[] args) throws Exception {
      try {
         GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
         generatorSqlmap.generator();
      } catch (Exception e) {
         e.printStackTrace();
      }
      
   }

}


4.运行上面的类GeneratorSqlmap中的主方法,生成实体类和方法,逆向工厂操作完毕.


最终的目录结构:


注:由于我只在generator.xml里配置了一个数据库的User表,所以只生成了一个实体类和一个dao.
4.用户登录测试:
1.login.jsp页面:
<form action="login" method="post">
    账号: <input type="text" name="loginname">
    密码:<input type="password" name="password">
    <input type="submit" value="登录">
</form>
2.main.jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$Title$</title>
</head>
<body>
<h1>登录成功</h1>
</body>
</html>
3.在controller包下创建LoginController.java
@Controller
@SessionAttributes("user")
public class LoginController {

    @Autowired
    UserService us;

    @RequestMapping("login")
    public String login(Model m, User user){
        System.out.println(user);
        User login = us.login(user);
        if(login!=null){
            m.addAttribute("user",login);
            return "main";
        }
        return "login";
    }
}
4.在service包下创建UserService接口以及实现类.
UserService接口:
public interface UserService {
    public User login(User user);
}
UserServiceImpl接口实现类:
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserMapper um;

    @Override
    public User login(User user) {

        UserExample ue=new UserExample();
        Criteria cc = ue.createCriteria();
        cc.andLoginnameEqualTo(user.getLoginname());
        cc.andPasswordEqualTo(user.getPassword());
        List<User> users = um.selectByExample(ue);
        if(users!=null&&users.size()>0){
            return user;
        }
        return null;
    }
}


至此,简单的登录测试代码完毕.有兴趣的可以自行使用测试一下.