Java tutorial
/* * The MIT License (MIT) * * Copyright (c) 2014 abel533@gmail.com * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package message.mybatis.common.provider; import message.mybatis.common.mapper.EntityHelper; import message.mybatis.common.mapper.MapperHelper; import message.mybatis.common.mapper.MapperTemplate; import org.apache.ibatis.builder.StaticSqlSource; import org.apache.ibatis.jdbc.SQL; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.ParameterMapping; import org.apache.ibatis.scripting.xmltags.IfSqlNode; import org.apache.ibatis.scripting.xmltags.MixedSqlNode; import org.apache.ibatis.scripting.xmltags.SetSqlNode; import org.apache.ibatis.scripting.xmltags.SqlNode; import org.apache.ibatis.scripting.xmltags.StaticTextSqlNode; import org.apache.ibatis.scripting.xmltags.TrimSqlNode; import org.apache.ibatis.scripting.xmltags.VarDeclSqlNode; import org.apache.ibatis.scripting.xmltags.WhereSqlNode; import java.util.LinkedList; import java.util.List; import java.util.Set; /** * Mappper.{@code message.mybatis.common.dao.BaseRepository} * * @author sunhao(sunhao.java@gmail.com) * @version V1.0, 15/7/13 ?3:39 * @see message.mybatis.common.dao.BaseRepository */ public class MapperProvider extends MapperTemplate { public MapperProvider(Class<?> mapperClass, MapperHelper mapperHelper) { super(mapperClass, mapperHelper); } /** * ?id??? * * @param ms * @return */ public SqlNode select(MappedStatement ms) { Class<?> entityClass = getSelectReturnType(ms); // setResultType(ms, entityClass); List<SqlNode> sqlNodes = new LinkedList<SqlNode>(); //??sql:select column ... from table sqlNodes.add(new StaticTextSqlNode( "SELECT " + EntityHelper.getSelectColumns(entityClass) + " FROM " + tableName(entityClass))); //? Set<EntityHelper.EntityColumn> columnList = EntityHelper.getPKColumns(entityClass); List<SqlNode> whereNodes = new LinkedList<SqlNode>(); boolean first = true; //where =#{property} ? for (EntityHelper.EntityColumn column : columnList) { whereNodes.add(getColumnEqualsProperty(column, first)); first = false; } sqlNodes.add(new WhereSqlNode(ms.getConfiguration(), new MixedSqlNode(whereNodes))); return new MixedSqlNode(sqlNodes); } /** * ?null??? * * @param ms * @return */ public SqlNode inert(MappedStatement ms) { Class<?> entityClass = getSelectReturnType(ms); List<SqlNode> sqlNodes = new LinkedList<SqlNode>(); //insert into table sqlNodes.add(new StaticTextSqlNode("INSERT INTO " + tableName(entityClass))); //? Set<EntityHelper.EntityColumn> columnList = EntityHelper.getColumns(entityClass); List<SqlNode> ifNodes = new LinkedList<SqlNode>(); //Identity? Boolean hasIdentityKey = false; //?????? for (EntityHelper.EntityColumn column : columnList) { //? if (column.getSequenceName() != null && column.getSequenceName().length() > 0) { // ifNodes.add(new StaticTextSqlNode(column.getColumn() + ",")); } else if (column.isIdentity()) { //?,,??,? sqlNodes.add(new VarDeclSqlNode(column.getProperty() + "_cache", column.getProperty())); if (hasIdentityKey) { //jdbc?? if (column.getGenerator() != null && column.getGenerator().equals("JDBC")) { continue; } throw new RuntimeException(ms.getId() + "" + entityClass.getCanonicalName() + "?MySql,?!"); } //selectKey-MS newSelectKeyMappedStatement(ms, column); hasIdentityKey = true; // ifNodes.add(new StaticTextSqlNode(column.getColumn() + ",")); } else if (column.isUuid()) { //UUIDbind sqlNodes.add(new VarDeclSqlNode(column.getProperty() + "_bind", getUUID())); ifNodes.add(new StaticTextSqlNode(column.getColumn() + ",")); } else { ifNodes.add(getIfNotNull(column, new StaticTextSqlNode(column.getColumn() + ","))); } } //?sqlNodes sqlNodes.add(new TrimSqlNode(ms.getConfiguration(), new MixedSqlNode(ifNodes), "(", null, ")", ",")); ifNodes = new LinkedList<SqlNode>(); //?values(#{property},#{property}...) for (EntityHelper.EntityColumn column : columnList) { //??, //,,property_cache if (column.isIdentity()) { ifNodes.add(new IfSqlNode(new StaticTextSqlNode("#{" + column.getProperty() + "_cache },"), column.getProperty() + "_cache != null ")); } else { ifNodes.add(new IfSqlNode(new StaticTextSqlNode("#{" + column.getProperty() + "},"), column.getProperty() + " != null ")); } if (column.getSequenceName() != null && column.getSequenceName().length() > 0) { ifNodes.add(getIfIsNull(column, new StaticTextSqlNode(getSeqNextVal(column) + " ,"))); } else if (column.isIdentity()) { ifNodes.add(getIfCacheIsNull(column, new StaticTextSqlNode("#{" + column.getProperty() + " },"))); } else if (column.isUuid()) { ifNodes.add(getIfIsNull(column, new StaticTextSqlNode("#{" + column.getProperty() + "_bind },"))); } } //values(#{property},#{property}...) sqlNodes.add(new TrimSqlNode(ms.getConfiguration(), new MixedSqlNode(ifNodes), "VALUES (", null, ")", ",")); return new MixedSqlNode(sqlNodes); } /** * ??null * * @param ms */ public SqlNode update(MappedStatement ms) { Class<?> entityClass = getSelectReturnType(ms); List<SqlNode> sqlNodes = new LinkedList<SqlNode>(); //update table sqlNodes.add(new StaticTextSqlNode("UPDATE " + tableName(entityClass))); //? Set<EntityHelper.EntityColumn> columnList = EntityHelper.getColumns(entityClass); List<SqlNode> ifNodes = new LinkedList<SqlNode>(); //if property!=null and property!='' for (EntityHelper.EntityColumn column : columnList) { if (!column.isId()) { StaticTextSqlNode columnNode = new StaticTextSqlNode( column.getColumn() + " = #{" + column.getProperty() + "}, "); ifNodes.add(getIfNotNull(column, columnNode)); } } sqlNodes.add(new SetSqlNode(ms.getConfiguration(), new MixedSqlNode(ifNodes))); //? columnList = EntityHelper.getPKColumns(entityClass); List<SqlNode> whereNodes = new LinkedList<SqlNode>(); boolean first = true; //where =#{property} ? for (EntityHelper.EntityColumn column : columnList) { whereNodes.add(getColumnEqualsProperty(column, first)); first = false; } sqlNodes.add(new WhereSqlNode(ms.getConfiguration(), new MixedSqlNode(whereNodes))); return new MixedSqlNode(sqlNodes); } /** * ??? * * @param ms */ public void delete(MappedStatement ms) { final Class<?> entityClass = getSelectReturnType(ms); List<ParameterMapping> parameterMappings = getPrimaryKeyParameterMappings(ms); //sql String sql = new SQL() { { //delete from table DELETE_FROM(tableName(entityClass)); //where =#{property} ? WHERE(EntityHelper.getPrimaryKeyWhere(entityClass)); } }.toString(); //??SqlSource StaticSqlSource sqlSource = new StaticSqlSource(ms.getConfiguration(), sql, parameterMappings); //?SqlSource setSqlSource(ms, sqlSource); } }