基于MyBatis注解扩展,实现无需配置就可拥有增删改
一、使用篇
如果项目本身基于SpringMVC+Mybatis构建,不需添加任何配置Mapper类只需继承
BaseMapper,即拥有增删改方法操作,无需任何配置文件
-
package com.springmvc.mapper; import org.springframework.stereotype.Repository; import com.nmtx.mybatis.ext.mapper.BaseMapper; import com.springmvc.model.User; @Repository public interface UserMapper extends BaseMapper<User>{ }
package com.springmvc.service.impl; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.springmvc.mapper.UserMapper; import com.springmvc.model.User; import com.springmvc.service.UserService; @Service public class UserServiceImpl implements UserService{ @Resource private UserMapper userMapper; public int insertUser(User user) { return userMapper.insert(user); } @Override public int updateUser(User user) { return userMapper.update(user); } @Override public int deleteUser(User user) { return userMapper.delete(user); } @Override public User findUser(User user) { return userMapper.findFirst(user); } }
user.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.springmvc.mapper.UserMapper"> </mapper>
二、扩展原理基于Mybatis中 @InsertProvider,@DeleteProvider,@UpdateProvider,@SelectProvider注解,具体实现代码如下
-
package com.nmtx.mybatis.ext.mapper; import org.apache.ibatis.annotations.DeleteProvider; import org.apache.ibatis.annotations.InsertProvider; import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.SelectProvider; import org.apache.ibatis.annotations.UpdateProvider; import com.nmtx.mybatis.ext.common.SqlProvider; public interface BaseMapper<T> { @InsertProvider(type = SqlProvider.class, method = "insert") @Options(useGeneratedKeys=true) public int insert(T bean); @DeleteProvider(type = SqlProvider.class, method = "delete") public int delete(T bean); @UpdateProvider(type = SqlProvider.class, method = "update") public int update(T bean); @SelectProvider(type = SqlProvider.class, method = "findFirst") public T findFirst(T bean); }
package com.nmtx.mybatis.ext.common; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.ArrayUtils; import org.springframework.util.StringUtils; import com.nmtx.mybatis.ext.common.table.TableFormat; import com.nmtx.mybatis.ext.common.table.annotation.Column; import com.nmtx.mybatis.ext.common.table.annotation.Table; import com.nmtx.mybatis.ext.common.table.impl.HumpToUnderLineFormat; public class SqlProvider { private TableFormat tableFormat = new HumpToUnderLineFormat(); public String insert(Object bean) { Class<?> beanClass = bean.getClass(); String tableName = getTableName(beanClass); Field[] fields = getFields(beanClass); StringBuilder insertSql = new StringBuilder(); List<String> insertParas = new ArrayList<String>(); List<String> insertParaNames = new ArrayList<String>(); insertSql.append("INSERT INTO ").append(tableName).append("("); try { for (int i = 0; i < fields.length; i++) { Field field = fields[i]; Column column = field.getAnnotation(Column.class); String columnName = ""; if (column != null) { if (!column.required()) continue; columnName = column.value(); } if (StringUtils.isEmpty(columnName)) { columnName = tableFormat.getColumnName(field.getName()); } field.setAccessible(true); Object object = field.get(bean); if (object != null) { insertParaNames.add(columnName); insertParas.add("#{" + field.getName() + "}"); } } } catch (Exception e) { new RuntimeException("get insert sql is exceptoin:" + e); } for (int i = 0; i < insertParaNames.size(); i++) { insertSql.append(insertParaNames.get(i)); if (i != insertParaNames.size() - 1) insertSql.append(","); } insertSql.append(")").append(" VALUES("); for (int i = 0; i < insertParas.size(); i++) { insertSql.append(insertParas.get(i)); if (i != insertParas.size() - 1) insertSql.append(","); } insertSql.append(")"); return insertSql.toString(); } public String update(Object bean) { Class<?> beanClass = bean.getClass(); String tableName = getTableName(beanClass); Field[] fields = getFields(beanClass); StringBuilder updateSql = new StringBuilder(); updateSql.append(" update ").append(tableName).append(" set "); try { for (int i = 0; i < fields.length; i++) { Field field = fields[i]; Column column = field.getAnnotation(Column.class); String columnName = ""; if (column != null) { if (!column.required()) continue; columnName = column.value(); } if (StringUtils.isEmpty(columnName)) { columnName = tableFormat.getColumnName(field.getName()); } field.setAccessible(true); Object beanValue = field.get(bean); if (beanValue != null) { updateSql.append(columnName).append("=#{").append(field.getName()).append("}"); if (i != fields.length - 1) { updateSql.append(","); } } } } catch (Exception e) { new RuntimeException("get update sql is exceptoin:" + e); } updateSql.append(" where ").append(tableFormat.getId()+" =#{id}"); return updateSql.toString(); } public String delete(Object bean) { Class<?> beanClass = bean.getClass(); String tableName = getTableName(beanClass); Field[] fields = getFields(beanClass); StringBuilder deleteSql = new StringBuilder(); deleteSql.append(" delete from ").append(tableName).append(" where "); try { for (int i = 0; i < fields.length; i++) { Field field = fields[i]; Column column = field.getAnnotation(Column.class); String columnName = ""; if (column != null) { if (!column.required()) continue; columnName = column.value(); } if (StringUtils.isEmpty(columnName)) { columnName = tableFormat.getColumnName(field.getName()); } field.setAccessible(true); Object beanValue = field.get(bean); if (beanValue != null) { deleteSql.append(columnName).append("=#{").append(field.getName()).append("}"); if (i != fields.length - 1) { deleteSql.append(" and "); } } } } catch (Exception e) { new RuntimeException("get delete sql is exceptoin:" + e); } return deleteSql.toString(); } public String findFirst(Object bean) { Class<?> beanClass = bean.getClass(); String tableName = getTableName(beanClass); Field[] fields = getFields(beanClass); StringBuilder selectSql = new StringBuilder(); List<String> selectParaNames = new ArrayList<String>(); List<String> selectParas = new ArrayList<String>(); selectSql.append("select "); try { for (int i = 0; i < fields.length; i++) { Field field = fields[i]; Column column = field.getAnnotation(Column.class); String columnName = ""; if (column != null) { if (!column.required()) continue; columnName = column.value(); } if (StringUtils.isEmpty(columnName)) { columnName = tableFormat.getColumnName(field.getName()); } field.setAccessible(true); Object object = field.get(bean); selectSql.append(field.getName()); if (object != null) { selectParaNames.add(columnName); selectParas.add("#{" + field.getName() + "}"); } if (i != fields.length - 1) selectSql.append(","); } } catch (Exception e) { new RuntimeException("get select sql is exceptoin:" + e); } selectSql.append(" from ").append(tableName).append(" where "); for (int i = 0; i < selectParaNames.size(); i++) { selectSql.append(selectParaNames.get(i)).append("=").append(selectParas.get(i)); if (i != selectParaNames.size() - 1) selectSql.append(" and "); } return selectSql.toString(); } private String getTableName(Class<?> beanClass) { String tableName = ""; Table table = beanClass.getAnnotation(Table.class); if (table != null) { tableName = table.value(); } else { tableName = tableFormat.getTableName(beanClass.getSimpleName()); } return tableName; } private Field[] getFields(Class<?> beanClass) { Field[] beanFields = beanClass.getDeclaredFields(); Class<?> beanSuperClass = beanClass.getSuperclass(); Field[] beanSuperFields = beanSuperClass.getDeclaredFields(); return ArrayUtils.addAll(beanFields, beanSuperFields); } }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
ES新提案:双问号操作符
摘要: 简单实用的新特性。 原文:ES新提案:双问号操作符 译者:前端小智 本文主要讲Gabriel Isenberg撰写的ES提案“Nullish coalescing for JavaScript”。 它提出?? 替换||的运算符,并提供默认值。这里先把这相提案叫作双问号操作符,如果你有好的叫法,欢迎留言讨论。 1. 概述 双问号 ?? 的操作符跟 || 类似,如果给定变量值为 null 或者 undefined,刚使用双问号后的默认值,否则使用该变量值。 如下: > undefined ?? 'default' 'default' > null ?? 'default' 'default' > false ?? 'default' false > '' ?? 'default' '' > 0 ?? 'default' 0 2. 早期的 || 运算符号 直接来个例子来演示一下 || 运算,下面两个等式是等价的: a || b a ? a : b 如果 a 是 truthy 值,则返回 a, 否则返回 b。 这使得使用||指定一个默认值成为可能,如果实际...
- 下一篇
JFinal一行代码搞定增删改,要的就是快
一、拓展篇 首先需要重写getModel方法,但是这有个问题,重写之后的方法和getModel的参数有点冲突,所以选择不重写,另外写个方法占且叫getBaseModel吧,getBaseModel的实现如下 /** * * @Description: 基础类扩展,实现在一些快速的一步操作 * @author lianghao * @date 2016年2月26日 下午3:02:04 */ public class BaseController extends Controller { public <T extends Model<?>> T getBaseModel(Class<?> modelClass, String... removeParas) { T model = null; try { model = (T) modelClass.newInstance(); } catch (Exception e) { logger.error("baseController init exception" + e); } Map<Stri...
相关文章
文章评论
共有0条评论来说两句吧...