传统使用mybatis时候,通过将sql语句写到mapper.xml中,映射到dao中。这样每次创建一个新的模块又要重复创建(ps:虽然idea有easycode插件)
因此可以将重复的方法打包上去,以这个思路,我们可以用mybatis的注解实现sql语句的统一和调用。
具体做法与之前的区别是:
- 写一个basedao接口;注释dao的增删改方法,继承这个接口;
- 注释xml的语句;
- service这些业务逻辑不用动(删除需要动一点);
- 增加MySqlProvider方法;
- 增加stringutil方法;
- 为entity(dto)的表最上面加上@Table(数据库.表名);
- 为为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;
}
}
查询正在弄,有时间改
版权声明:本文为weixin_41487978原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。