在使用idea開發SSM框架的java項目時,我們常常需要寫大量重複且繁瑣的代碼,比如mapper.xml文件中的映射關係以及簡單的批量插入更新方法,比如實體類中的定義以及set()、get()方法等,在項目較小時可以選擇手打,但如果項目較大手打就比較浪費時間,這裏提供一種較爲簡單通過逆向工程生成文件的方式。
開發工具:idea
插件:EasyCode
步驟一:首先安裝EasyCode插件,這裏網上有教程,不再贅述;
步驟二:安裝好插件後,需要進行基本的配置,插件會有初始的配置,如果不滿足可以自定義,這裏列出小編採用的配置
通過右上角的添加/刪除可以進行個性化定製,配置完映射關係後,可以再配置一下各層(Mapper、Dao、Service等)需要展示的內容,插件同樣會給出初始配置,可以根據需要定義新的分組,實時調試。
下面是小編各層自定義的配置,大家可以參考自定義配置:
entity.java:
##引入宏定義
$!define
##使用宏定義設置回調(保存位置與文件後綴)
#save("/entity", ".java")
##使用宏定義設置包後綴
#setPackageSuffix("entity")
##使用全局變量實現默認包導入
$!autoImport
import com.example.db.base.entity.Id;
##使用宏定義實現類註釋信息
#tableComment("實體類")
public class $!{tableInfo.name} extends Id {
private static final long serialVersionUID = $!tool.serial();
#foreach($column in $tableInfo.fullColumn)
/**
*#if(${column.comment})
${column.comment}
#end
*/
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
#foreach($column in $tableInfo.fullColumn)
##使用宏定義實現get,set方法
#getSetMethod($column)
#end
}
dao.java:
##引入宏定義
$!define
##定義初始變量
#set($tableName = $tool.append($tableInfo.name, "Mapper"))
##設置回調
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/dao"))
##拿到主鍵
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}dao;
import com.example.db.base.mapper.BaseMapper;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
#tableComment("表數據庫訪問層")
@Mapper
public interface $!{tableName} extends BaseMapper<$!{tableInfo.name}> {
}
service.java:
##引入宏定義
$!define
##定義初始變量
#set($tableName = $tool.append("I",$tableInfo.name, "Service"))
##設置回調
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service"))
##拿到主鍵
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;
import com.example.db.base.service.IService;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import java.util.List;
#tableComment("表服務接口")
public interface $!{tableName} extends IService<$!{tableInfo.name}> {
}
serviceImpl.java:
##引入宏定義
$!define
##定義初始變量
#set($tableName = $tool.append($tableInfo.name, "ServiceImpl"))
##設置回調
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service/impl"))
##拿到主鍵
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;
import com.example.db.base.service.impl.ServiceImpl;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Mapper;
import $!{tableInfo.savePackageName}.service.I$!{tableInfo.name}Service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
#tableComment("表服務實現類")
@Transactional
@Service
public class $!{tableName} extends ServiceImpl<$!{tableInfo.name}Mapper,$!{tableInfo.name}> implements I$!{tableInfo.name}Service {
}
controller.java:
##引入宏定義
$!define
##定義初始變量
#set($tableName = $tool.append($tableInfo.name, "Controller"))
##設置回調
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/controller"))
##拿到主鍵
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}controller;
import com.example.db.base.controller.BaseController;
import com.example.db.common.ExtGridResponse;
import com.example.db.common.Query;
import com.example.db.common.R;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.service.I$!{tableInfo.name}Service;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
#tableComment("表控制層")
@RestController
@RequestMapping("$!tool.firstLowerCase($tableInfo.name)")
public class $!{tableName} extends BaseController {
@Resource
private I$!{tableInfo.name}Service service;
@GetMapping("/list")
public ExtGridResponse list(@RequestParam Map<String, Object> params) {
return new ExtGridResponse<>(service.selectPageList(new Query<>(params)));
}
@PostMapping("/save")
public R get($!{tableInfo.name} entity) {
return R.ok(service.saveOrUpdate(entity));
}
@PostMapping("/saveBatch")
public R saveBatch(@RequestParam String jsonData) throws IOException {
ObjectMapper mapper = new ObjectMapper();
List<$!{tableInfo.name}> list = mapper.readValue(jsonData, mapper.getTypeFactory().constructCollectionType(List.class, $!{tableInfo.name}.class));
if (null == list || list.size() <= 0) {
return R.error("沒有要保存的數據!");
}
List<$!{tableInfo.name}> insertList = new ArrayList<$!{tableInfo.name}>();
List<$!{tableInfo.name}> updateList = new ArrayList<$!{tableInfo.name}>();
for ($!{tableInfo.name} l : list) {
if (null!=l.get$!tool.firstUpperCase($!pk.name)() && !"".equals(l.get$!tool.firstUpperCase($!pk.name)())) {
updateList.add(l);
} else {
insertList.add(l);
}
}
service.insertOrUpdateBatch(insertList, updateList);
return R.ok();
}
@PostMapping("/deleteByIds")
public R get(@RequestParam List<String> ids) {
return R.ok(service.deleteByIds(ids));
}
}
mapper.xml:
##引入mybatis支持
$!mybatisSupport
##設置保存名稱與保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.xml"))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper"))
##拿到主鍵
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
<?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="$!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Mapper">
<resultMap type="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}" id="$!{tableInfo.name}Map">
#foreach($column in $tableInfo.fullColumn)
<result property="$!column.name" column="$!column.obj.name" jdbcType="$!column.ext.jdbcType"/>
#end
</resultMap>
<sql id="Base_Column_List" >
#allSqlColumn()
</sql>
<!--根據主鍵查詢-->
<select id="selectByPrimaryKey" resultMap="$!{tableInfo.name}Map">
select
<include refid="Base_Column_List" />
from $!tableInfo.obj.name
where $!pk.obj.name = #{$!pk.name}
</select>
<!--根據條件查詢列表-->
<select id="selectList" resultMap="$!{tableInfo.name}Map" parameterType="map">
select
<include refid="Base_Column_List" />
from $!tableInfo.obj.name
<where>
#foreach($column in $tableInfo.fullColumn)
<if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
and $!column.obj.name = #{$!column.name}
</if>
#end
</where>
</select>
<!--新增所有列-->
<insert id="insert" parameterType="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}">
<selectKey keyProperty="id" resultType="String" order="BEFORE">
select sys_guid() from dual
</selectKey>
insert into $!{tableInfo.obj.name}(
#foreach($column in $tableInfo.fullColumn)$!column.obj.name#if($velocityHasNext),
#end#end)
values (
#foreach($column in $tableInfo.fullColumn)#{$!{column.name},jdbcType=$!column.ext.jdbcType}#if($velocityHasNext),
#end#end)
</insert>
<!--新增選擇列-->
<insert id="insertSelective" parameterType="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}">
<selectKey keyProperty="id" resultType="String" order="BEFORE">
select sys_guid() from dual
</selectKey>
insert into $!{tableInfo.obj.name}
<trim prefix="(" suffix=")" suffixOverrides="," >
#foreach($column in $tableInfo.fullColumn)
<if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
$!column.obj.name,
</if>
#end
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
#foreach($column in $tableInfo.fullColumn)
<if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
#{$!column.name,jdbcType=$!column.ext.jdbcType},
</if>
#end
</trim>
</insert>
<!--批量新增-->
<insert id="insertBatch" parameterType="java.util.List" >
insert into $!{tableInfo.obj.name}(
#foreach($column in $tableInfo.fullColumn)$!column.obj.name#if($velocityHasNext),
#end#end)
select A.* from (
<foreach collection="list" item="item" index="index" separator="union all">
select sys_guid() as id,
#foreach($column in $tableInfo.otherColumn)#{item.$!{column.name},jdbcType=$!column.ext.jdbcType}#if($velocityHasNext),
#end#end
from dual
</foreach>
) A
</insert>
<!--通過主鍵修改數據-->
<update id="updateByPrimaryKeySelective">
update $!{tableInfo.obj.name}
<set>
#foreach($column in $tableInfo.otherColumn)
<if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
$!column.obj.name = #{$!column.name,jdbcType=$!column.ext.jdbcType},
</if>
#end
</set>
where $!pk.obj.name = #{$!pk.name,jdbcType=$!pk.ext.jdbcType}
</update>
<!--批量更新-->
<update id="updateBatch" parameterType="java.util.List" >
<foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";">
update $!{tableInfo.obj.name}
<set>
#foreach($column in $tableInfo.otherColumn)
<if test="item.$!column.name != null#if($column.type.equals("java.lang.String")) and item.$!column.name != ''#end">
$!column.obj.name = #{item.$!column.name,jdbcType=$!column.ext.jdbcType},
</if>
#end
</set>
where $!pk.obj.name = #{item.$!pk.name,jdbcType=$!pk.ext.jdbcType}
</foreach>
</update>
<!--通過主鍵刪除-->
<delete id="deleteByIds">
delete from $!{tableInfo.obj.name}
where $!pk.obj.name in
<foreach collection="list" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</delete>
</mapper>
到這裏配置工作就完成了,接下來就只需要使用插件就能達到我們想要的效果了。
通過連接的數據庫,選中你需要生成文件的數據庫表,右鍵選擇EasyCode
選擇好要生成的文件並且指定要生成的位置,點擊OK就可以實現效果了。
到這裏插件的配置使用就結束了,idea可用的類似EasyCode的插件還有很多,非常便於我們的日常開發,通過逆向工程生成文件的方法也不止本文提到的這一種,工作中會遇到的問題還有很多,記錄下來可以隨時進行翻閱,也爲大家提供一個簡單的介紹,有描述不準確的地方,歡迎大家提出指正,相互學習。