1.概要
1.1 初衷
最近做了一个简单的,mybatis代码生成的东西,很简单,主要解决mybatis做添加和修改机能的时候需要大量的变量,这样处理起来很容易失误,所以弄个这个。对于数据库的,insert,update,delete,select。insert,update,delete几乎都是变化很少的,基本上所有的表处理方式不会有太大的差别。而select 相对变化更大,但是代码也相对更简单,这里的简单指设置的字段少,不容易失误。所以这里将insert,update,delete的代码自动生成。
另外最近有个思想,开发无非就是处理if\else\while。而while就是我们提高程序效率的关键,也是工作效率的关键,把多少逻辑交给while决定了,我们将多少重复的工作交给了计算机。也决定了我们的效率。所以别做重复的事成为了我们工作的目标,做多少重复的事情成了我们效率的关键,那么如果少做重复的事情呢,有两个方法:
1.通过设计合理的切割逻辑消除容易
2.减少自己重复的工作量,而这正是程序能做的,那我们是不是可以自己根据自己的工作情况制定一些工具,来取代自己重复的工作呢,当然很多工具已经做了这件事,但是针对具体的情况,具体的业务,具体的公司情况。通用的工具能力是有限的,那么我们是否可以尝试给自己做些合适的工具呢,于是有了这篇文章,代码不难,很简单。但我想这么做是否是个好主意呢,我决定逐渐的尝试。
1.2 知识点
// 当前目录下创建文件
file = new File("./" + createClassName() + "Mapper.java");
// 创建按字符向流中写入数据的对象
fw = new FileWriter(file.getPath());
// 向流中写入数据
fw.write(s, 0, s.length());
fw.flush();
fw.close();
1.3 业务点
//数据库的字段名
String tableFields = "id,module_name,enable,name,note_time";
//表名
String tbName = "test_model";
//生成文件的包名
String packageName = "com.xjc.test";
2.代码
package createCode.xml;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class CreateMapperAndInterface {
static String kongGe = " ";
//数据库的字段名
String tableFields = "id,module_name,enable,name,note_time";
//表名
String tbName = "test_model";
//生成文件的包名
String packageName = "com.xjc.test";
File file;
FileWriter fw;
public static void main(String[] args) {
CreateMapperAndInterface dom = new CreateMapperAndInterface();
dom.main();
}
public void main(){
createModel();
creatInterface();
createMapper();
}
public void creatInterface() {
try {
file = new File("./" + createClassName() + "Mapper.java");
fw = new FileWriter(file.getPath());
writeLine("package " + packageName);
writeLine("import java.util.List;");
writeLine("import org.apache.ibatis.annotations.Param;");
writeLine("import "+packageName+"."+createClassName()+";");
writeLine("");
writeLine("public interface " + createClassName() + "Mapper{");
writeLine(getKongGe(1) + "public void insert(" + createClassName() + " obj);");
writeLine(getKongGe(1) + "public void update(" + createClassName() + " obj);");
writeLine(getKongGe(1) + "public void delete(String id);");
writeLine(getKongGe(1) + "deletes(@Param(\"ids\") String[] ids)");
writeLine("}");
fw.flush();
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void createModel() {
try {
file = new File("./" + createClassName() + ".java");
fw = new FileWriter(file.getPath());
writeLine("package "+packageName+";");
writeLine("");
writeLine("public class "+createClassName()+" {");
String[] arrayFields = tableFields.split(",");
for (int i = 0; i < arrayFields.length; i++) {
writeLine(getKongGe(1)+"private String "+desplayFilds(arrayFields[i])+";");
}
writeLine("}");
fw.flush();
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void createMapper() {
try {
file = new File("./" + createClassName() + "Mapper.xml");
if (file.exists()) {
file.createNewFile();
file.getPath();
}
fw = new FileWriter(file.getPath());
writeLine("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
writeLine(
"<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >");
writeLine("<mapper namespace=\"com.itumpsub.dao.itrm.AlarmCardForUserMapper\">");
writeLine(getKongGe(1) + "<insert id=\"insert\" parameterType=\"" + packageName + "." + createClassName()
+ "\">");
writeLine(getKongGe(2) + createInsert());
writeLine(getKongGe(1) + "</insert>");
writeLine(getKongGe(1) + "<update id=\"update\" parameterType=\"" + packageName + "." + createClassName()
+ "\">");
writeLine(getKongGe(2) + createUpdate());
writeLine(getKongGe(1) + "</update>");
writeLine(getKongGe(1) + "<delete id=\"delete\">");
writeLine(getKongGe(2) + createDelete());
writeLine(getKongGe(1) + "</delete>");
createDeletes();
writeLine("</mapper>\r\n");
fw.flush();
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private String createClassName() {
return captureName(desplayFilds(this.tbName));
}
private void writeLine(String s) {
s = s + "\r\n";
try {
fw.write(s, 0, s.length());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private String getKongGe(int count) {
StringBuilder ret = new StringBuilder();
for (int i = 0; i < count; i++) {
ret.append(kongGe);
}
return ret.toString();
}
public String createInsert() {
StringBuilder insertSql = new StringBuilder();
StringBuilder insertTable = new StringBuilder();
StringBuilder insertValues = new StringBuilder();
String[] arrayFields = tableFields.split(",");
for (int i = 1; i < arrayFields.length; i++) {
String classFild = createClassFilds(arrayFields[i]);
if (i == 1) {
insertTable.append(tbName + "(" + arrayFields[i]);
insertValues.append("values(#{" + classFild + "}");
} else if (i == (arrayFields.length - 1)) {
insertTable.append("," + arrayFields[i] + ")");
insertValues.append(",(#{" + classFild + "})");
} else {
insertTable.append("," + arrayFields[i]);
insertValues.append(",(#{" + classFild + "}");
}
}
insertSql.append(")");
insertSql.append("insert into " + tbName + insertTable.toString() + "\r\n " + insertValues.toString());
return insertSql.toString();
}
public String createUpdate() {
StringBuilder updateSql = new StringBuilder();
updateSql.append("update " + tbName + " set ");
String[] arrayFields = tableFields.split(",");
for (int i = 1; i < arrayFields.length; i++) {
String classFild = createClassFilds(arrayFields[i]);
if (i == 1) {
updateSql.append(arrayFields[i] + "=#{" + classFild + "}");
} else {
updateSql.append("," + arrayFields[i] + "=#{" + classFild + "}");
}
}
updateSql.append("\n where " + arrayFields[0] + "=#{" + createClassFilds(arrayFields[0]) + "}");
return updateSql.toString();
}
public String createDelete() {
String[] arrayFields = tableFields.split(",");
StringBuilder deleteSql = new StringBuilder();
deleteSql.append(
"delete from " + tbName + " where " + arrayFields[0] + "=#{" + createClassFilds(arrayFields[0]) + "}");
return deleteSql.toString();
}
public void createDeletes() {
String[] arrayFields = tableFields.split(",");
writeLine(getKongGe(1) + "<delete id=\"deletes\">");
writeLine(getKongGe(2) + "delete from " + tbName);
writeLine(getKongGe(2) + "where " + arrayFields[0] + " in");
writeLine(getKongGe(2)
+ "<foreach item=\"id\" collection=\"ids\" separator=\",\" open=\"(\" close=\")\" index=\"\">");
writeLine(getKongGe(3) + "#{id}");
writeLine(getKongGe(2) + "</foreach>");
writeLine(getKongGe(1) + "</delete>");
}
private String createClassFilds(String filed) {
String[] array = filed.split("_");
String ret = array[0];
if (array.length > 1) {
for (int i = 1; i < array.length; i++) {
ret = ret + captureName(array[i]);
}
}
return ret;
}
private String desplayFilds(String filed) {
String[] array = filed.split("_");
String ret = array[0];
if (array.length > 1) {
for (int i = 1; i < array.length; i++) {
ret = ret + captureName(array[i]);
}
}
return ret;
// System.out.println("private String " + ret + ";");
}
public String captureName(String name) {
return name.substring(0, 1).toUpperCase() + name.substring(1);
}
}
3.生成的文件
3.1TestModel.java
package com.xjc.test;
public class TestModel {
private String id;
private String moduleName;
private String enable;
private String name;
private String noteTime;
}
3.2 TestModelMapper.java
package com.xjc.test
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.xjc.test.TestModel;
public interface TestModelMapper{
public void insert(TestModel obj);
public void update(TestModel obj);
public void delete(String id);
deletes(@Param("ids") String[] ids)
}
3.3 TestModelMapper.xml
<?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.itumpsub.dao.itrm.AlarmCardForUserMapper">
<insert id="insert" parameterType="com.xjc.test.TestModel">
)insert into test_modeltest_model(module_name,enable,name,note_time)
values(#{moduleName},(#{enable},(#{name},(#{noteTime})
</insert>
<update id="update" parameterType="com.xjc.test.TestModel">
update test_model set module_name=#{moduleName},enable=#{enable},name=#{name},note_time=#{noteTime}
where id=#{id}
</update>
<delete id="delete">
delete from test_model where id=#{id}
</delete>
<delete id="deletes">
delete from test_model
where id in
<foreach item="id" collection="ids" separator="," open="(" close=")" index="">
#{id}
</foreach>
</delete>
</mapper>