SSM整合之CRUD环境搭建整合

SSM整合之CRUD环境搭建整合

基础框架-ssm(SpringMVC+Spring+MyBatis)
数据库-MySQL
前端框架-bootstrap快速搭建简洁美观的界面
项目的依赖管理-Maven
分页-pagehelper
逆向工程-MyBatis Generator
  1. 在pom.xml中引入相应的jar包
 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <!--锁定jar包的版本-->
    <spring.version>5.0.2.RELEASE</spring.version>
    <slf4j.version>1.6.6</slf4j.version>
    <log4j.version>1.2.12</log4j.version>
    <mysql.version>5.1.6</mysql.version>
    <mybatis.version>3.4.5</mybatis.version>
  </properties>

  <dependencies>
    <!-- spring -->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.6.8</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</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-web</artifactId>
      <version>${spring.version}</version>
      <scope>compile</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</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-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>compile</scope>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql.version}</version>
    </dependency>

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

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

    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <!-- log start -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>${log4j.version}</version>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <!-- log end -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.0</version>
    </dependency>

    <dependency>
      <groupId>c3p0</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.1.2</version>
      <type>jar</type>
      <scope>compile</scope>
    </dependency>
  </dependencies>

2.补全maven工程的目录结构,并创建对应的包
org.westos.controller
org.westos.service
org.westos.dao
org.westos.bean
org.westos.utils
org.westos.test

3.引入bootstrap

https://www.bootcss.com/ 进入官网

下载完成后解压压缩包,在webapp下键一个static文件夹,放静态资源,也就是将解压后的bootstrap文件夹放进去

在index.jsp页面引入bootstrap

<%--引入bootstrap的样式--%>
   <link href="static/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
    <%--引入引入bootstrap的js文件--%>
    <script src="static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>

bootstrap 要用到Jquery 所以还得引入一下Jquery的文件,注意放在最前面引入

我们可以在static下再建一个js文件夹把Jquery的库文件放到这个文件夹下
	<%--引入Jquery--%>
	<script src="static/js/jquery-1.12.4.min.js"></script>

4.编写SSM整合的配置文件

  1. 配置web.xml文件(算是固定模板了,SSM中都是这些配置)

    <?xml version="1.0" encoding="UTF-8" ?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://java.sun.com/xml/ns/javaee"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
             id="WebApp_ID" version="2.5">
      <!--配置一个监听器,去加载spring的配置文件
       ContextLoaderListener 默认加载的是WEB-INF下的spring的配置文件
       -->
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      <!--配置监听器,去加载类路径下的applicationContext.xml配置文件,不然默认加载的是WEB-INF下的配置文件-->
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
      </context-param>
        <!--配置SpringMVC的前端控制器-->
      <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--去加载springmvc.xml配置文件-->
        <!--配置加载springmvc.xml 配置文件-->
      <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
      </init-param>
        <!--配置服务器启动,就初始化DispatcherServlet-->
        <load-on-startup>1</load-on-startup>
      </servlet>
    <servlet-mapping>
      <servlet-name>dispatcherServlet</servlet-name>
      <url-pattern>/</url-pattern>
    </servlet-mapping>
      <!--配置post请求的中文乱码的过滤器,注意这个过滤器要放在其他过滤器之前-->
      <filter>
        <filter-name>encodingFilter</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>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
      <!--配置restful风格请求的过滤器:作用将页面上的普通的post请求转换为
        put或delete请求
      -->
      <filter>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    </web-app>
    
    
  2. 编写Springmvc的配置文件

    1.在resources下创建 springmvc.xml
    2.配置注解扫描,只扫描@Controller注解
    3.配置视图解析器
    4.将springmvc不能处理的静态资源,交由tomcat来处理
    5.开启对SpringMVC注解的支持

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
            
            
           <!--开启注解扫描 只扫描@Controller-->
        <context:component-scan base-package="org.westos">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
    
        <!--配置视图解析器-->
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
            <!-- JSP文件所在的目录 -->
            <property name="prefix" value="/WEB-INF/views/"></property>
            <!-- 文件的后缀名 -->
            <property name="suffix" value=".jsp"></property>
        </bean>
    
    
        <!--将springmvc不能处理的静态资源,交由tomcat来处理,因为我们这边使用bootstrap-->
        <mvc:default-servlet-handler></mvc:default-servlet-handler>
    
        <!-- 开启对SpringMVC注解的支持 -->
        <mvc:annotation-driven/>
     </beans> 
    
  3. 配置Springmvc的配置文件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.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">
        <!--开启组件的注解扫描 除去springmvc不要扫描-->
        <context:component-scan base-package="org.westos">
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
        
        <!--配置数据源-->
        <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
            <property name="driverClass" value="com.mysql.jdbc.Driver"/>
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/ssm_crud"/>
            <property name="user" value="root"/>
            <property name="password" value="123456"/>
        </bean>
        
        <!--配置和MyBatis的整合-->
        <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sessionFactory">
            <!--指定mybatis的全局配置文件-->
            <property name="configLocation" value="classpath:mybatis-config.xml"></property>
            <!--指定MyBatis 接口的映射文件的位置 扫描-->
            <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
            <!--注入连接池-->
            <property name="dataSource" ref="dataSource"></property>
        </bean>
        <!--配置扫描器,将mybatis的接口实现放到IOC容器中-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="org.westos.dao"></property>
        </bean>
        
        <!--配置事务相关-->
        <!--配置事务管理器,传入连接池-->
        <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
        <!--开启基于注解的事务,使用xml配置形式的事务(一般主要的都是使用配置式)  -->
        <aop:config>
            <!-- 切入点表达式  org.westos.service..*(..) 注意 ..* 的意思是service包下的所有类,包括子包下的所有类-->
            <aop:pointcut expression="execution(public * org.westos.service..*(..))" id="txPoint"/>
            <!-- 配置事务增强 -->
            <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
        </aop:config>
    
        <!--配置事务增强,事务如何切入  -->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <!-- 所有方法都是事务方法 -->
                <tx:method name="*"/>
                <!--以get开始的查询所有方法 read-only="true" 可以不使用事务 -->
                <tx:method name="get*" read-only="true"/>
            </tx:attributes>
        </tx:advice>
    
    </beans>    
        
    
  4. 配置MyBatis的全局配置文件**

     <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <settings>
            <!--开启驼峰式命名-->
            <setting name="mapUnderscoreToCamelCase" value="true"/>
        </settings>
        <typeAliases>
            <!--给bean包下的实体类配置别名-->
            <package name="org.westos.bean"/>
        </typeAliases>
    </configuration>
    
  5. 创建表

    1.员工表
    CREATE TABLE `tbl_emp` (
      `emp_id` int(11) NOT NULL AUTO_INCREMENT,
      `emp_name` varchar(255) NOT NULL,
      `gender` char(1) DEFAULT NULL,
      `email` varchar(255) DEFAULT NULL,
      `d_id` int(11) DEFAULT NULL,
      PRIMARY KEY (`emp_id`) -- 员工的部门编号 外键可以关联 部门表的主键
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    
    2.部门表
    CREATE TABLE `tbl_dept` (
      `dept_id` int(11) NOT NULL AUTO_INCREMENT,
      `dept_name` varchar(255) NOT NULL,
      PRIMARY KEY (`dept_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    
    
    3. 可以添加两张表的外键约束 员工表是多表 部门表是单表
    ALTER TABLE `tbl_emp` ADD FOREIGN KEY(`d_id`) REFERENCES tbl_dept(dept_id);
    
  6. 使用逆向工程根据数据库中的表来生成对应的bean以及mapper

    要使用逆向工程先在pom.xml中引入相应的jar包
      		<dependency>
    			<groupId>org.mybatis.generator</groupId>
    			<artifactId>mybatis-generator-core</artifactId>
    			<version>1.3.5</version>
    		</dependency>
    在当前工程根目录下创建一个mbg.xml文件 用来配置要生成的bean 和 mapper的信息
    <!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">
            <!--配置生成出来的代码中不要添加注释,如果要注释就不要配置,默认会有注释-->
            <commentGenerator>
                <property name="suppressAllComments" value="true"/>
            </commentGenerator>
            <!-- 配置数据库连接 -->
            <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                            connectionURL="jdbc:mysql://localhost:3306/ssm_crud" userId="root"
                            password="123456">
            </jdbcConnection>
    
            <javaTypeResolver>
                <property name="forceBigDecimals" value="false"/>
            </javaTypeResolver>
    
            <!-- 指定javaBean生成的位置 -->
            <javaModelGenerator targetPackage="org.westos.bean"
                                targetProject=".\src\main\java">
                <property name="enableSubPackages" value="true"/>
                <property name="trimStrings" value="true"/>
            </javaModelGenerator>
    
            <!--指定sql映射文件生成的位置 -->
            <sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources">
                <property name="enableSubPackages" value="true"/>
            </sqlMapGenerator>
    
            <!-- 指定dao接口生成的位置,mapper接口 -->
            <javaClientGenerator type="XMLMAPPER"
                                 targetPackage="org.westos.dao" targetProject=".\src\main\java">
                <property name="enableSubPackages" value="true"/>
            </javaClientGenerator>
    
    
            <!-- table指定每个表的生成策略 配置表名和对应的实体类名 -->
            <table tableName="tbl_emp" domainObjectName="Employee"></table>
            <table tableName="tbl_dept" domainObjectName="Department"></table>
        </context>
    </generatorConfiguration>
    使用逆向工程的代码和逆向工程的配置文件来生成对应的bean和mapper
     在org.westos.test 包下建一个类运行下面的代码
       
      
      public class MyTest {
        public static void main(String[] args) throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
            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);
        }
    }
    
    
  7. 给 EmployeeMapper.xml 映射文件中 增加查询时带上部门信息的设置

对员工的查询时,只是单表查询,并没有带上员工的部门信息。
所以我们在增加两个查询,在查询员工时带上部门信息。也就是说需要多表查询

员工表和部门表是一对一的关系。

需要在员工的实体类中维护一个部门实体类的对象,来体现一对一的关系。

 private Integer empId;

        private String empName;

        private String gender;

        private String email;

        private Integer dId;

        //维护一个部门实体类的对象
        private Department department;
        /get set 方法略 自己补上

在生成的 EmployeeMapper 接口中增加两个查询的方法,查询员工时带上部门信息

public interface EmployeeMapper {
   		 //根据条件查询多个员工并包含部门信息
       List<Employee> selectByExampleWithDept(EmployeeExample example);
   		 //根据id查询单个员工并包含部门信息
       Employee selectByPrimaryKeyWithDept(Integer empId);
    // ... 其他自动生成的方法略

   }

在EmployeeMapper.xml 映射文件中配置一对一的关系

 <resultMap type="org.westos.bean.Employee" id="WithDeptResultMap">
    <id column="emp_id" jdbcType="INTEGER" property="empId"/>
    <result column="emp_name" jdbcType="VARCHAR" property="empName"/>
    <result column="gender" jdbcType="CHAR" property="gender"/>
    <result column="email" jdbcType="VARCHAR" property="email"/>
    <result column="d_id" jdbcType="INTEGER" property="dId"/>
    <!--配置一对一的关系 指定联合查询出的部门字段的封装 -->
    <association property="department" javaType="org.westos.bean.Department">
      <id column="dept_id" property="deptId"/>
      <result column="dept_name" property="deptName"/>
    </association>
  </resultMap>

添加查询标签

!-- 查询员工同时带部门信息 -->
  <select id="selectByExampleWithDept" resultMap="WithDeptResultMap">
	   select
	    <if test="distinct">
	      distinct
	    </if>
	   e.emp_id, e.emp_name, e.gender, e.email, e.d_id,d.dept_id,d.dept_name
		FROM tbl_emp e
		left join tbl_dept d on e.`d_id`=d.`dept_id`
	    <if test="_parameter != null">
	      <include refid="Example_Where_Clause" />
	    </if>
	    <if test="orderByClause != null">
	      order by ${orderByClause}
	    </if>
  </select>
   <!--根据id查询单个员工时,带上部门信息-->
    <select id="selectByPrimaryKeyWithDept" resultMap="WithDeptResultMap">
        select e.emp_id,
               e.emp_name,
               e.gender,
               e.email,
               e.d_id,
               d.dept_id,
               d.dept_name
        FROM tbl_emp e
                 left join tbl_dept d on e.`d_id` = d.`dept_id`
        where emp_id = #{empId,jdbcType=INTEGER}
    </select>
5.测试Dao增删改查的操作
如果是Maven项目则在pom.xml中引入spring-test.jar的坐标
		注意jar的依赖范围scope不要设置为test
	   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>

编写测试类


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class MapperTest {
//注入
    @Autowired
    private DepartmentMapper departmentMapper;
    @Autowired
    private EmployeeMapper employeeMapper;
    @Autowired
    private SqlSession sqlSession;
    @Test
    public void test(){
        //1.先来插入几个部门
        Department dept1 = new Department();
        dept1.setDeptName("后勤部");
        departmentMapper.insertSelective(dept1);

        Department dept2 = new Department();
        dept2.setDeptName("艺术部");
        departmentMapper.insertSelective(dept2);
    }
    @Test
    public void test2(){
        //插入一个员工
        Employee employee = new Employee();
        employee.setEmpName("刘德华");
        employee.setGender("M");
        employee.setEmail("liudehua@163.com");
        employee.setdId(1);
        employeeMapper.insertSelective(employee);
    }
    @Test
    public void test3(){
        Employee employee = employeeMapper.selectByPrimaryKeyWithDept(1);
        System.out.println(employee);
    }
    @Test
    public void test4(){
        List<Employee> employees = employeeMapper.selectByExampleWithDept(null);
        System.out.println(employees);
    }
   
}

为了我们多插入点员工,可以使用批量插入
我们需要在Spring的配置文件applicationContext.xml中配置一个SqlSessionTemplate 可以进行批量操作的sqlSession

    <!--配置一个可以执行批量操作的sqlSeesion-->
<bean class="org.mybatis.spring.SqlSessionTemplate" id="sessionTemplate">
    <constructor-arg name="sqlSessionFactory" ref="sessionFactory"></constructor-arg>
    <!--执行类型,是BATCH 批量执行-->
    <constructor-arg name="executorType" value="BATCH"></constructor-arg>
</bean>
	注入sqlSession
   	 @Autowired
    private SqlSession sqlSession;
@Test
    public void test5(){
        //批量插入员工
        //通过sqlSession 获取一个可以执行批量操作的mapper
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
        for (int i = 0; i < 100; i++) {
            Employee employee = new Employee(null, "zhangxueyou" + i, "M", "zhangxueyou@163.com", 1, null);
            mapper.insertSelective(employee);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值