此方法无侵入性,项目如果没有使用mybaits plus, 请配合配合上一篇文章,两者一起使用,快速敏捷开发(懒人能创造世界)。看效果直接操作对象
@Override
public int update(Long id) {
File bean=new File();
Timestamp lastModifyTime = new Timestamp(new Date().getTime());
bean.setLastModifyTime(lastModifyTime);
bean.setId(id);
return fileDAO.update(bean);
}
生成的sql
上代码:
1.新建两个自定义注解PrimaryKey标注主键,ExcludeField过滤字段
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author zhanqi
* @since 2021/4/17 9:21
* 声明字段为注解
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PrimaryKey {
String value() default "";
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author zhanqi
* @since 2021/4/17 9:21
* 过滤实体类字段
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcludeField {
}
2.创建bean,sql字段转换类ToolByBeanSql
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author zhanqi
* @since 2021/4/17 9:18
* 驼峰名称和下划线名称的相互转换
*/
public class ToolByBeanSql {
private static Pattern linePattern = Pattern.compile("_(\\w)");
private static Pattern humpPattern = Pattern.compile("[A-Z]");
/**
* 下划线转驼峰
*/
public static String lineToHump(String str) {
str = str.toLowerCase();
Matcher matcher = linePattern.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
}
matcher.appendTail(sb);
return sb.toString();
}
/**
* 驼峰转下划线
*/
public static String humpToLine(String str) {
Matcher matcher = humpPattern.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
}
matcher.appendTail(sb);
return sb.toString();
}
}
3.创建BaseSqlProvider
/**
* @author zhanqi
* @since 2021/4/17 9:22
* sql生成类
*/
@Component
public class BaseSqlProvider<T> {
/**
* 新增
* @param bean
* @return
*/
//@Options自增主键
public String add(T bean) {
SQL sql = new SQL();
Class clazz = bean.getClass();
String tableName = clazz.getSimpleName();
String realTableName = ToolByBeanSql.humpToLine(tableName).replaceAll("_entity", "").substring(1);
sql.INSERT_INTO(realTableName);
List<Field> fields = getFields(bean,clazz);
for (Field field : fields) {
field.setAccessible(true);
String column = field.getName();
//System.out.println("column:" + Tool.humpToLine(column));
sql.VALUES(ToolByBeanSql.humpToLine(column), String.format("#{" + column + "}"));
}
return sql.toString();
}
/**
* 删除
* @param bean
* @return
*/
public String delete(T bean) {
SQL sql = new SQL();
Class clazz = bean.getClass();
String tableName = clazz.getSimpleName();
String realTableName = ToolByBeanSql.humpToLine(tableName).replaceAll("_entity", "").substring(1);
sql.DELETE_FROM(realTableName);
findPrimaryKey(sql,bean, clazz);
return sql.toString();
}
/**
* 查找主键生成where id=?
* @param sql
* @param bean
* @param clazz
*/
private void findPrimaryKey(SQL sql, T bean,Class clazz) {
List<Field> primaryKeyField = getPrimaryKeyFields(bean,clazz);
if (!primaryKeyField.isEmpty()) {
for (Field pkField : primaryKeyField) {
pkField.setAccessible(true);
sql.WHERE(pkField.getName() + "=" + String.format("#{" + pkField.getName() + "}"));
}
} else {
sql.WHERE(" 1= 2");
throw new RuntimeException("未包含PrimaryKey属性");
}
}
/**
* 查询主键
* @param bean
* @param clazz
* @return
*/
private List<Field> getPrimaryKeyFields(T bean, Class clazz) {
List<Field> primaryKeyField = new ArrayList<>();
List<Field> fields = getFields(bean,clazz);
try {
clazz.newInstance();
for (Field field : fields) {
field.setAccessible(true);
PrimaryKey key = field.getAnnotation(PrimaryKey.class);
if (key != null) {
primaryKeyField.add(field);
}
}
} catch (IllegalAccessException | InstantiationException e) {
e.printStackTrace();
}
return primaryKeyField;
}
/**
* 获取字段
* @param bean
* @param clazz
* @return
*/
private List<Field> getFields(T bean,Class clazz) {
List<Field> fieldList = new ArrayList<>();
Field[] fields = clazz.getDeclaredFields();
try {
for (Field field : fields) {
field.setAccessible(true);
ExcludeField key = field.getAnnotation(ExcludeField.class);
if (key == null) {
//System.out.println("属性值: " + field.get(bean));
if (field.get(bean) != null) {
fieldList.add(field);
}
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return fieldList;
}
/**
* 查询
* @param bean
* @return
*/
public String get(T bean) {
SQL sql = new SQL();
Class clazz = bean.getClass();
String tableName = clazz.getSimpleName();
String realTableName = ToolByBeanSql.humpToLine(tableName).replaceAll("_entity", "").substring(1);
sql.SELECT("*").FROM(realTableName);
findPrimaryKey(sql, bean,clazz);
System.out.println("getSql:" + sql.toString());
return sql.toString();
}
/**
* 新增
* @param bean
* @return
*/
public String update(T bean) {
SQL sql = new SQL();
Class clazz = bean.getClass();
String tableName = clazz.getSimpleName();
String realTableName = ToolByBeanSql.humpToLine(tableName).replaceAll("_entity", "").substring(1);
sql.UPDATE(realTableName);
List<Field> fields = getFields(bean,clazz);
for (Field field : fields) {
field.setAccessible(true);
String column = field.getName();
if (column.equals("id")) {
continue;
}
System.out.println(ToolByBeanSql.humpToLine(column));
// sql.SET(Tool.humpToLine(column) + "=" + String.format("#{" + column + ,jdbcType=VARCHAR"}"));
sql.SET(ToolByBeanSql.humpToLine(column) + "=" + String.format("#{" + column + "}"));
}
findPrimaryKey(sql,bean,clazz);
System.out.println("updateSql:" + sql.toString());
return sql.toString();
}
}
4.FileDAO update方法
import java.util.List;
/**
* @author zhanqi
* @since 2021/03/19
*/
@Repository
public interface FileDAO {
//修改一条数据
@UpdateProvider(method = "update", type = BaseSqlProvider.class)
int update(File bean);
/**
* 通过编号获取文件
*
* @param id 编号
* @return {@link File}
*/
@Select("select * from file where id=#{id}")
File getById(long id);
/**
* 获取所有文件
*
* @param userId 用户编号
* @param offset 偏移
* @param categoryId 分类编号
* @param orderBy 排序方式
* @param search 搜索
* @return {@link List}
*/
@SelectProvider(type = FileSqlProvider.class, method = "getAll")
List<FileRecord> listAll(@Param("userId") int userId, @Param("offset") int offset, @Param("categoryId") int
categoryId, @Param("orderBy") String orderBy, @Param("search") String search);
}
5.IFileService
/**
* @author zhanqi
* @since 2021/03/29
*/
public interface IFileService {
/**
* 修改数据
* @param id
* @return
*/
int update(Long id);
}
6.FileServiceImpl
/**
* @author zhanqi
* @since 2021/03/29
*/
@Service
public class FileServiceImpl implements IFileService {
@Override
public int update(Long id) {
File bean=new File();
Timestamp lastModifyTime = new Timestamp(new Date().getTime());
bean.setLastModifyTime(lastModifyTime);
bean.setId(id);
return fileDAO.update(bean);
}
}
7.File 实体类
/**
* 文件表
*
* @author zhanqi
* @since 2021/04/11
*/
public class File {
@PrimaryKey
private Long id;
private String name;
private Timestamp lastModifyTime;
public Timestamp getLastModifyTime() {
return lastModifyTime;
}
public void setLastModifyTime(Timestamp lastModifyTime) {
this.lastModifyTime = lastModifyTime;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}