ssm项目之mybatis逆向工程与修改测试

Posted maplefighting

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ssm项目之mybatis逆向工程与修改测试相关的知识,希望对你有一定的参考价值。

本文地址:http://www.cnblogs.com/maplefighting/p/7486781.html 

以员工和部门表为例

 

 

 一、mybatis生成代码

本来要写dao,bean,和mapper文件,但是使用mybatis逆向工程可以自动生成

http://www.mybatis.org/generator/ 引入quick start guide里面的jar包,我们可以用Maven引入mybatis generator,同样去http://mvnrepository.com/ 找(我用的是1.3.5)

可以按这个http://www.mybatis.org/generator/configreference/xmlconfig.html 配置

 在项目建立一个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">
  
      <!-- 不生成注释 -->
     <commentGenerator>
          <property name="suppressAllComments" value="true" />
    </commentGenerator>
      <!-- 配置数据库连接 -->
    <jdbcConnection driverClass="com.mysql.jdbc.Driver"
        connectionURL="jdbc:mysql://localhost:3306/ssm_crud"
        userId="root"
        password="root">
    </jdbcConnection>

    <javaTypeResolver >
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>
    <!-- 指定javaBean生成位置 -->
    <javaModelGenerator 
        targetPackage="com.sgd.crud.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="com.sgd.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>
View Code

按照http://www.mybatis.org/generator/running/running.html 里面的

 

创建MBGTest.java

package com.sgd.crud.test;

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

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;


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);
    }
}
View Code

 

二、添加连表查询并测试

因为生成的代码没有连表查询,所以只好手撸了,照着生成的写

 <resultMap id="BaseResultMap" type="com.sgd.crud.bean.Employee">
    <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" />
  </resultMap>
  <resultMap id="WithDeptResultMap"  type="com.sgd.crud.bean.Employee">
      <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="com.sgd.crud.bean.Department">
        <id column="dept_id" property="deptId"/>
        <result column="dept_name" property="deptName"/>
    </association>
  </resultMap>
  <sql id="Example_Where_Clause">
    <where>
      <foreach collection="oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" prefixOverrides="and" suffix=")">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Update_By_Example_Where_Clause">
    <where>
      <foreach collection="example.oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" prefixOverrides="and" suffix=")">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Base_Column_List">
    emp_id, emp_name, gender, email, d_id
  </sql>
  <sql id="WithDept_Column_List">
      e.emp_id, e.emp_name, e.gender, e.email, e.d_id, d.dept_id, d.dept_name
  </sql>
  <!--  List<Employee> selectByExampleWithDept(EmployeeExample example);
           Employee selectByPrimaryKeyWithDept(Integer empId);
   -->
   <!-- 查询员工同时带部门信息 -->
   <select id="selectByExampleWithDept" resultMap="WithDeptResultMap">
       select
        <if test="distinct">
          distinct
        </if>
        <include refid="WithDept_Column_List" />
        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>
   <select id="selectByPrimaryKeyWithDept" resultMap="WithDeptResultMap">
    select 
    <include refid="Base_Column_List" />
    FROM tbl_emp e
    LEFT JOIN tbl_dept d ON e.d_id = d.dept_id
    where emp_id = #{empId,jdbcType=INTEGER}
   </select>
      <!-- 查询员工不带部门信息 -->
View Code

在EmployeeMaper,java里面加上

    //带员工的查询
    List<Employee> selectByExampleWithDept(EmployeeExample example);

    Employee selectByPrimaryKeyWithDept(Integer empId);
View Code

在Employee.java里面加上

    //查询员工的同时部门也查询
    private Department department;

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }
View Code

接下来先测试写的,连数据库调通

 一般我们测试都这么写,但是spring可以用spring测试工具,可以注入,所以我们用spring的

需要在pom文件导入spring-test 还是用4.3.7的

 

为了方便,我在Department.java和Employee.java(把department的去掉)里加入有参无参构造器

测试代码MapperTest.java

package com.sgd.crud.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.sgd.crud.bean.Department;
import com.sgd.crud.dao.DepartmentMapper;

/**
 * 测试dao层工作
 * spring的项目可以使用spring的单元测试,可以自动注入组件
 * 1、导入SpringTest模块
 * 2、@ContextConfiguration指定spring配置文件的位置
 * 3、直接 autowired使用要使用的组件
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"classpath:applicationContext.xml"})
public class MapperTest {
    
    @Autowired
    DepartmentMapper departmentMapper;
    /**
     * 测试DepartmentMapper
     */
    @Test
    public void testCRUD() {
        /*//1、chuangj springioc容器
        ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2、从容器获取mapper
        DepartmentMapper bean = ioc.getBean(DepartmentMapper.class);
        */
        System.out.println(departmentMapper);
        
        //1、插入几个部门
        departmentMapper.insertSelective(new Department(null,"开发部"));
        departmentMapper.insertSelective(new Department(null,"测试部"));

    }
}
View Code

如果出现了下面一堆东西

Wed Sep 06 20:13:53 CST 2017 WARN: Establishing SSL connection without server\'s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn\'t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to \'false\'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

解决方案:在之前dbconfig.properties里面的url改成 (中间那个ssm_crud我写错成ssm-crud了=_=!)

jdbc.jdbcUrl=jdbc:mysql://localhost:3306/ssm_crud?useSSL=false 暂时解决

 修改删除是自动生成的,应该没什么问题,我就不测啦!

测试添加employee

package com.sgd.crud.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.sgd.crud.bean.Department;
import com.sgd.crud.bean.Employee;
import com.sgd.crud.dao.DepartmentMapper;
import com.sgd.crud.dao.EmployeeMapper;

/**
 * 测试dao层工作
 * spring的项目可以使用spring的单元测试,可以自动注入组件
 * 1、导入SpringTest模块
 * 2、@ContextConfiguration指定spring配置文件的位置
 * 3、直接 autowired使用要使用的组件
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"classpath:applicationContext.xml"})
public class MapperTest {
    
    @Autowired
    DepartmentMapper departmentMapper;
    
    @Autowired
    EmployeeMapper employeeMapper;
    /**
     * 测试DepartmentMapper
     */
    @Test
    public void testCRUD() {
        /*//1、chuangj springioc容器
        ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2、从容器获取mapper
        DepartmentMapper bean = ioc.getBean(DepartmentMapper.class);
        */
        System.out.println(departmentMapper);
        
        //1、插入几个部门
    //    departmentMapper.insertSelective(new Department(null,"开发部"));
    //    departmentMapper.insertSelective(new Department(null,"测试部"));
        
        //2、生成员工数据
        employeeMapper.insertSelective(new Employee(null, "Jerry", "M", "Jerry@sgd.com", 1));
    }
}
View Code

一条一条插入太慢了,我们可以写个批量插入

在applicationContext.xml 添加SqlSessionTemplate注入(不知道为啥这么写,等学了回来补)

<!-- 批量插入 -->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg name="sqlSessionFactory" ref="SqlSessionFactory"></constructor-arg>
        <constructor-arg name="executorType" value="BATCH"></constructor-arg>
    </bean>
View Code

添加代码