逆向工程操作步骤
1.jar包
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
2.创建生成代码的配置文件
<?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>
<!--需要修改1-->
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis03"
userId="root"
password="root">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--需要修改2-->
<!-- targetProject:生成实体类的位置 -->
<javaModelGenerator targetPackage="com.wh.pojo"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--需要修改3-->
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.wh.mapper"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!--需要修改4-->
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.wh.mapper"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!--需要修改5-->
<!-- 指定数据库表 -->
<table tableName="depart"></table>
<table tableName="employee"></table>
<table tableName="person"></table>
<table tableName="student"></table>
<table tableName="student_teacher"></table>
<table tableName="teacher"></table>
</context>
</generatorConfiguration>
一共需要修改五部分,都在注释里做标记了
3. 编写生成代码的类
import org.junit.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 GeneratorTest {
@Test
public void testGenerator() throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
// 需要修改,指定自动生成的配置文件位置
File configFile = new File("D:\\develop\\ideaworkspace\\parent_ssm\\mybatis08_autoGenerate\\generatorConfig.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);
}
}
执行结果
随便找一个一个看看
package com.wh.mapper;
import com.wh.pojo.Person;
import com.wh.pojo.PersonExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface PersonMapper {
long countByExample(PersonExample example);
int deleteByExample(PersonExample example);
int deleteByPrimaryKey(Integer pId);
int insert(Person record);
int insertSelective(Person record);
List<Person> selectByExample(PersonExample example);
Person selectByPrimaryKey(Integer pId);
int updateByExampleSelective(@Param("record") Person record, @Param("example") PersonExample example);
int updateByExample(@Param("record") Person record, @Param("example") PersonExample example);
int updateByPrimaryKeySelective(Person record);
int updateByPrimaryKey(Person record);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wh.mapper.PersonMapper">
<resultMap id="BaseResultMap" type="com.wh.pojo.Person">
<id column="p_id" jdbcType="INTEGER" property="pId" />
<result column="p_name" jdbcType="VARCHAR" property="pName" />
<result column="p_age" jdbcType="INTEGER" property="pAge" />
<result column="p_hobby" jdbcType="VARCHAR" property="pHobby" />
</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">
p_id, p_name, p_age, p_hobby
</sql>
<select id="selectByExample" parameterType="com.wh.pojo.PersonExample" resultMap="BaseResultMap">
select
<if test="distinct">
distinct
</if>
<include refid="Base_Column_List" />
from person
<if test="_parameter != null">
<include refid="Example_Where_Clause" />
</if>
<if test="orderByClause != null">
order by ${orderByClause}
</if>
</select>
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from person
where p_id = #{pId,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from person
where p_id = #{pId,jdbcType=INTEGER}
</delete>
<delete id="deleteByExample" parameterType="com.wh.pojo.PersonExample">
delete from person
<if test="_parameter != null">
<include refid="Example_Where_Clause" />
</if>
</delete>
<insert id="insert" parameterType="com.wh.pojo.Person">
insert into person (p_id, p_name, p_age,
p_hobby)
values (#{pId,jdbcType=INTEGER}, #{pName,jdbcType=VARCHAR}, #{pAge,jdbcType=INTEGER},
#{pHobby,jdbcType=VARCHAR})
</insert>
<insert id="insertSelective" parameterType="com.wh.pojo.Person">
insert into person
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="pId != null">
p_id,
</if>
<if test="pName != null">
p_name,
</if>
<if test="pAge != null">
p_age,
</if>
<if test="pHobby != null">
p_hobby,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="pId != null">
#{pId,jdbcType=INTEGER},
</if>
<if test="pName != null">
#{pName,jdbcType=VARCHAR},
</if>
<if test="pAge != null">
#{pAge,jdbcType=INTEGER},
</if>
<if test="pHobby != null">
#{pHobby,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<select id="countByExample" parameterType="com.wh.pojo.PersonExample" resultType="java.lang.Long">
select count(*) from person
<if test="_parameter != null">
<include refid="Example_Where_Clause" />
</if>
</select>
<update id="updateByExampleSelective" parameterType="map">
update person
<set>
<if test="record.pId != null">
p_id = #{record.pId,jdbcType=INTEGER},
</if>
<if test="record.pName != null">
p_name = #{record.pName,jdbcType=VARCHAR},
</if>
<if test="record.pAge != null">
p_age = #{record.pAge,jdbcType=INTEGER},
</if>
<if test="record.pHobby != null">
p_hobby = #{record.pHobby,jdbcType=VARCHAR},
</if>
</set>
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
</update>
<update id="updateByExample" parameterType="map">
update person
set p_id = #{record.pId,jdbcType=INTEGER},
p_name = #{record.pName,jdbcType=VARCHAR},
p_age = #{record.pAge,jdbcType=INTEGER},
p_hobby = #{record.pHobby,jdbcType=VARCHAR}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
</update>
<update id="updateByPrimaryKeySelective" parameterType="com.wh.pojo.Person">
update person
<set>
<if test="pName != null">
p_name = #{pName,jdbcType=VARCHAR},
</if>
<if test="pAge != null">
p_age = #{pAge,jdbcType=INTEGER},
</if>
<if test="pHobby != null">
p_hobby = #{pHobby,jdbcType=VARCHAR},
</if>
</set>
where p_id = #{pId,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey" parameterType="com.wh.pojo.Person">
update person
set p_name = #{pName,jdbcType=VARCHAR},
p_age = #{pAge,jdbcType=INTEGER},
p_hobby = #{pHobby,jdbcType=VARCHAR}
where p_id = #{pId,jdbcType=INTEGER}
</update>
</mapper>
单表查询能用到的crud,几乎都被生成了
逆向工程的应用
生成的代码crud都是可以直接使用的
逐个做出解释
仔细看方法后缀
Example就是sql里的where条件。
会在后面拼接where条件
Selective就是动态sql里的动态标签。
会动态拼接sql
public interface PersonMapper {
// 条件统计出总数量
long countByExample(PersonExample example);
// 根据条件删除
int deleteByExample(PersonExample example);
// 根据主键id删除
int deleteByPrimaryKey(Integer pId);
// 普通的一个添加
int insert(Person record);
// 根据是否有条件动态拼接sql添加
int insertSelective(Person record);
// 条件查询
List<Person> selectByExample(PersonExample example);
// 通过主键查询一个
Person selectByPrimaryKey(Integer pId);
// 根据条件,动态拼接sql更新
int updateByExampleSelective(@Param("record") Person record, @Param("example") PersonExample example);
// 根据条件更新
int updateByExample(@Param("record") Person record, @Param("example") PersonExample example);
// 动态拼接sql更新
int updateByPrimaryKeySelective(Person record);
// 通过主键更新
int updateByPrimaryKey(Person record);
}
测试
import com.wh.mapper.PersonMapper;
import com.wh.pojo.Person;
import com.wh.pojo.PersonExample;
import com.wh.utils.SessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class PersonMapperTest {
// Example = sql里的where
// Selective = 动态sql的<if>
@Test
public void testinsert(){
SqlSession session = SessionUtils.getSqlSession();
PersonMapper personMapper = session.getMapper(PersonMapper.class);
Person person = new Person();
person.setpName("小芳");
person.setpAge(18);
person.setpHobby("撩妹");
int insert = personMapper.insert(person);
session.commit();
session.close();
System.out.println(insert);
}
@Test
public void testdeleteByPrimaryKey(){
SqlSession session = SessionUtils.getSqlSession();
PersonMapper personMapper = session.getMapper(PersonMapper.class);
int delete = personMapper.deleteByPrimaryKey(7);
session.commit();
session.close();
System.out.println(delete);
}
@Test
public void testupdateByPrimaryKey(){
SqlSession session = SessionUtils.getSqlSession();
PersonMapper personMapper = session.getMapper(PersonMapper.class);
Person person = new Person();
person.setpId(5);
person.setpName("屌爆了");
person.setpHobby("打牌");
person.setpAge(30);
int update = personMapper.updateByPrimaryKey(person);
session.commit();
session.close();
System.out.println(update);
}
@Test
public void testupdateByExampleSelective(){
SqlSession session = SessionUtils.getSqlSession();
PersonMapper personMapper = session.getMapper(PersonMapper.class);
PersonExample personExample = new PersonExample();
PersonExample.Criteria criteria = personExample.createCriteria();
criteria.andPAgeGreaterThan(30);
Person person = new Person();
person.setpAge(25);
person.setpName("你好");
personMapper.updateByExampleSelective(person,personExample);
session.commit();
session.close();
}
@Test
public void testselectByPrimaryKey(){
SqlSession session = SessionUtils.getSqlSession();
PersonMapper personMapper = session.getMapper(PersonMapper.class);
Person person = personMapper.selectByPrimaryKey(6);
session.close();
System.out.println(person);
}
@Test
public void testselectByExample(){
SqlSession session = SessionUtils.getSqlSession();
PersonMapper personMapper = session.getMapper(PersonMapper.class);
// Example就是生成sql语句里的where条件
PersonExample personExample = new PersonExample();
PersonExample.Criteria criteria = personExample.createCriteria();
criteria.andPAgeGreaterThan(30).andPNameEqualTo("屌爆了");
List<Person> personList = personMapper.selectByExample(personExample);
session.close();
for (Person person : personList) {
System.out.println(person);
}
}
@Test
public void testinsertSelective(){
SqlSession session = SessionUtils.getSqlSession();
PersonMapper personMapper = session.getMapper(PersonMapper.class);
Person person = new Person();
person.setpName("郭富城");
int i = personMapper.insertSelective(person);
session.commit();
session.close();
System.out.println(i);
}
@Test
public void testcountByExample(){
SqlSession session = SessionUtils.getSqlSession();
PersonMapper personMapper = session.getMapper(PersonMapper.class);
PersonExample personExample = new PersonExample();
PersonExample.Criteria criteria = personExample.createCriteria();
criteria.andPAgeGreaterThan(30);
long count = personMapper.countByExample(personExample);
System.out.println(count);
}
}