springboot技术实现SSM增删查改进阶之BaseDAO

传统使用mybatis时候,通过将sql语句写到mapper.xml中,映射到dao中。这样每次创建一个新的模块又要重复创建(ps:虽然idea有easycode插件)

因此可以将重复的方法打包上去,以这个思路,我们可以用mybatis的注解实现sql语句的统一和调用。

具体做法与之前的区别是:

  1. 写一个basedao接口;注释dao的增删改方法,继承这个接口;
  2. 注释xml的语句;
  3. service这些业务逻辑不用动(删除需要动一点);
  4. 增加MySqlProvider方法;
  5. 增加stringutil方法;
  6. 为entity(dto)的表最上面加上@Table(数据库.表名);
  7. 为为entity(dto)的表具体的id属性加上@Id

MySqlProvider.java

package com.lingnan.util;

import com.lingnan.annotation.Table;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.jdbc.SQL;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 */
public class MySqlProvider {
    public static final String INSERT = "insert";
    public static final String DELETE = "delete";
    public static final String UPDATE = "update";

    //插入
    public static String insert(Object obj) {
        String table = getTableName(obj);
        System.out.println(table);
        Map<String, String> map = getMap(obj);

        return new SQL(){
            {
                //insert into table() values()
                INSERT_INTO(table);//insert into table
                for (String key : map.keySet()) {
                    System.out.println("key:::"+key+",map.get(key)::"+map.get(key));
                    VALUES(key, map.get(key));
                }
            }
        }.toString();
    }
    //更新
    public static String update(Object obj) {
        String table = getTableName(obj);
        System.out.println(table);
        Map<String, String> map = getMap(obj);


        return new SQL(){
            {
                //insert into table() values()
                UPDATE(table);//insert into table
                for (String key : map.keySet()) {
                    if (key.equals("id")){
                        WHERE("id="+map.get(key));
                        continue;
                    }
                    System.out.println("key:::"+key+",map.get(key)::"+map.get(key));
                    String setValue=key+"="+map.get(key);
                    SET(setValue);
                }
            }
        }.toString();
    }
    //删除
    public static String delete(@Param("table")String table, @Param("where") String where) {
        System.out.println(table+":::"+where);
        if (StringUtil.isEmpty(table)) {
            return null;
        }

        if (StringUtil.isEmpty(where)) {
            return null;
        }

        return new SQL(){
            {
                DELETE_FROM(table);
                WHERE(where);
            }
        }.toString();
    }

    /**
     * 获取表名称
     * @param obj
     */
    private static String getTableName(Object obj) {
        Class c = obj.getClass();
        Table table = (Table)c.getAnnotation(Table.class);
        if (table != null) {
            return table.value();
        }

        return c.getSimpleName();
    }

    private static Map<String, String> getMap(Object obj) {
        Map<String, String> map = new HashMap<>();
        Class c = obj.getClass();
        Field[] fs = c.getDeclaredFields();//获取所有属性
        for (Field item : fs) {
            String key = item.getName();
            item.setAccessible(true);
            try {
                if (item.get(obj) != null) {
                    map.put(StringUtil.underscoreName(key), "#{" + key + "}");
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }

        return map;
    }

}

StringUtil工具类,一个是生成sql条件语句方法,一个是解决驼峰式命名的方法

package com.lingnan.util;

import org.springframework.util.StringUtils;

import java.util.List;

public class StringUtil extends StringUtils {

	/**
	 * 生成删除where条件语句
	 */

	public static String deleteWhere(List obj) {
		if (obj == null || obj.size() == 0) {
			return null;
		}

		StringBuffer sb = new StringBuffer("id in (");
		for (Object item : obj) {
			sb.append("'");
			sb.append(item);
			sb.append("',");
		}
		sb.deleteCharAt(sb.lastIndexOf(","));
		sb.append(")");
		return sb.toString();
	}
	/**
	 * 转换为下划线
	 * 
	 * @param camelCaseName
	 * @return
	 */
	public static String underscoreName(String camelCaseName) {
		StringBuilder result = new StringBuilder();
		if (camelCaseName != null && camelCaseName.length() > 0) {
			result.append(camelCaseName.substring(0, 1).toLowerCase());
			for (int i = 1; i < camelCaseName.length(); i++) {
				char ch = camelCaseName.charAt(i);
				if (Character.isUpperCase(ch)) {
					result.append("_");
					result.append(Character.toLowerCase(ch));
				} else {
					result.append(ch);
				}
			}
		}
		return result.toString();
	}
 
	/**
	 * 转换为驼峰
	 * 
	 * @param underscoreName
	 * @return
	 */
	public static String camelCaseName(String underscoreName) {
		StringBuilder result = new StringBuilder();
		if (underscoreName != null && underscoreName.length() > 0) {
			boolean flag = false;
			for (int i = 0; i < underscoreName.length(); i++) {
				char ch = underscoreName.charAt(i);
				if ("_".charAt(0) == ch) {
					flag = true;
				} else {
					if (flag) {
						result.append(Character.toUpperCase(ch));
						flag = false;
					} else {
						result.append(ch);
					}
				}
			}
		}
		return result.toString();
	}
 
}

Basedao.java
这里绑定mysqlprovider,通过前者输出的sql语句和注解实现对数据库的访问,省去.xml访问的方式。

package com.lingnan.dao;

import com.lingnan.util.MySqlProvider;
import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.UpdateProvider;

import java.util.List;

/**
 * @Author fa
 * @Date 9:59 2020/6/3
 */
public interface BaseDao<T> {

    /**
     * 新增数据
     *
     * @param bean 实例对象
     * @return 影响行数
     */
    @InsertProvider(type=MySqlProvider.class,method=MySqlProvider.INSERT)
    int insert(T bean);
    @UpdateProvider(type=MySqlProvider.class, method=MySqlProvider.UPDATE)
    int update(T bean);
    @DeleteProvider(type=MySqlProvider.class,method=MySqlProvider.DELETE)
    int delete(@Param("table") String table, @Param("where") String where);
}

需要增加table注解类和id

package com.lingnan.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    String value() default "";
}
package com.lingnan.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Id {
    String value() default "";
}

dto类需要再类名上加@Table(“数据库名.表名”)
id上加@Id

package com.lingnan.entity;

import com.lingnan.annotation.Id;
import com.lingnan.annotation.Table;

import java.io.Serializable;

/**
 * (Student)实体类
 *
 * @author makejava
 * @since 2020-06-01 20:49:57
 */
@Table("hotelbookidea.student")
public class Student {

    @Id
    private Integer id;
    
    private Integer xh;
    
    private String name;
    
    private String bj;
    
    private String note;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getXh() {
        return xh;
    }

    public void setXh(Integer xh) {
        this.xh = xh;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getBj() {
        return bj;
    }

    public void setBj(String bj) {
        this.bj = bj;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }

}

查询正在弄,有时间改

猜你喜欢

转载自blog.csdn.net/weixin_41487978/article/details/106542775