Java tutorial
/* * Copyright 2015 serg. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package das.orm; /* http://mybatis.github.io/mybatis-3/ http://mybatis.github.io/generator/ http://blog.mybatis.org/p/products.html */ import das.dao.props.BeanPropertyMapping; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import org.apache.ibatis.exceptions.PersistenceException; import org.apache.ibatis.io.Resources; import org.apache.ibatis.mapping.ResultFlag; import org.apache.ibatis.mapping.ResultMap; import org.apache.ibatis.mapping.ResultMapping; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ORMBackendConnector { protected static Logger log = LoggerFactory.getLogger(ORMBackendConnector.class); protected static Map<String, Class<?>> sqlTypeClassMap; protected static Map<Class<?>, String> classSqlTypeMap; private SqlSessionFactory sqlSessionFactory; private Connection connection; private final boolean keepDBConnection; public ORMBackendConnector(String configURI) throws IOException, PersistenceException { this(configURI, null); } public ORMBackendConnector(String configURI, Connection conn) throws IOException, PersistenceException { log.trace(">>> constructor"); if ((configURI == null) || configURI.length() == 0) { //String fs = System.getProperty("file.separator"); // ? ? ?? String fs = "/"; configURI = getClass().getPackage().getName().replace(".", fs).concat(fs).concat("orm-config.xml"); } log.debug("configURI=" + configURI); InputStream config = Resources.getResourceAsStream(configURI); log.debug("config ready"); this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(config); log.debug("SqlSessionFactoryBuilder created"); connection = conn; if (conn != null) { this.keepDBConnection = true; } else { Configuration conf = getConfiguration(); Properties props = conf.getVariables(); // ? ? "" ??. // ? ? ? ? ? SqlSession // ?? ?, ? , // ? ? - ? ?, // . // ? , ? ? ? String prop = props.getProperty("keepDBConnection", "false"); this.keepDBConnection = Boolean.parseBoolean(prop); } log.debug("keepDBConnection=" + keepDBConnection); } public SqlSessionFactory getSqlSessionFactory() { return sqlSessionFactory; } public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } public Configuration getConfiguration() { log.trace(">>> getConfiguration"); if (sqlSessionFactory != null) { return sqlSessionFactory.getConfiguration(); } else return null; } public SqlSession createDBSession() { return createDBSession(null, false); } public SqlSession createDBSession(Connection conn, boolean keepThisConnection) { log.trace(">>> createDBSession"); if (sqlSessionFactory != null) { SqlSession ses; if (conn != null) { if (keepThisConnection) { connection = conn; } ses = sqlSessionFactory.openSession(conn); } else { if ((keepDBConnection || keepThisConnection) && (connection != null)) { ses = sqlSessionFactory.openSession(connection); } else { ses = sqlSessionFactory.openSession(); connection = ses.getConnection(); } } return ses; } else return null; } public Connection getConnection() { return connection; } /* private void checkORMapperClass(Class<?> mapperClass, Object dao) { //?, ? mapperClass dao. //? , ? . ? , ?? log.trace(">>> checkMapperClass"); Configuration conf = getConfiguration(); //conf.getMapperRegistry().getMappers(); if (conf != null) { if (mapperClass == null) { if (dao != null) { // ?? ?. - ? ? ? MyBatis Class<?>[] itf = dao.getClass().getInterfaces(); log.debug("Interfaces.length="+itf.length); for (int i=0; i < itf.length; i++) { log.debug("Interfaces["+i+"]="+itf[i].getName()); if (conf.hasMapper(itf[i])) { mapperClass = itf[i]; log.debug("mapperClass="+mapperClass.getName()); break; } } } else { throw new IllegalArgumentException("Wrong parameter dao = NULL"); } } else { if (! conf.hasMapper(mapperClass)) { throw new IllegalArgumentException("Wrong mapperClass="+mapperClass.getName()); } else { log.debug("mapperClass="+mapperClass.getName()); } } } else { log.debug("getConfiguration == null. checkMapperClass failed."); } } */ private boolean isCompatibleMap(ResultMap rm, Class<?> beanClass) { // ?, ?? ResultMap ?? beanClass if ((rm != null) && (beanClass != null)) { return (beanClass == rm.getType()); } else return false; } public List<BeanPropertyMapping> getBeanPropertiesMapping(Class<?> beanClass) { log.trace(">>> getBeanPropertiesMapping()"); List<BeanPropertyMapping> DAOprops = new ArrayList<BeanPropertyMapping>(); Configuration conf = getConfiguration(); if (conf != null) { // //checkDAOMapperClass(mapperClass, dao); Collection<ResultMap> rmc = conf.getResultMaps(); //log.debug("ResultMaps size="+rmc.size()); Iterator<ResultMap> rmci = rmc.iterator(); while (rmci.hasNext()) { ResultMap rm = rmci.next(); // ID=com.example.server.dao.UserMapper.UserMap, Type=com.example.server.dao.UserDTO log.debug("ResultMap ID=" + rm.getId() + ", Type=" + rm.getType().getName()); // ?, ?? ResultMap ?? beanClass if (isCompatibleMap(rm, beanClass)) { List<ResultMapping> r = rm.getResultMappings(); Iterator<ResultMapping> i2 = r.iterator(); while (i2.hasNext()) { ResultMapping r2 = i2.next(); // ? ?? (?) . // ? ?? ? ? ?? DAOprops.add(new BeanPropertyMapping(r2.getProperty(), r2.getColumn(), r2.getJavaType(), r2.getFlags(), r2.getNotNullColumns())); StringBuilder s = new StringBuilder(); s.append("Column=").append(r2.getColumn()); s.append(", Property=").append(r2.getProperty()); s.append(", JavaType=").append(r2.getJavaType()); s.append(", Flags=["); List<ResultFlag> flags = r2.getFlags(); for (ResultFlag rf : flags) { s.append(rf.name()).append(", "); } s.append("]"); s.append(", NotNullColumns=["); Set<String> nncs = r2.getNotNullColumns(); for (String nnc : nncs) { s.append(nnc).append(", "); } s.append("]"); log.debug(s.toString()); } break; // ?? , ? } } } return DAOprops; } /** * ? java * @param sqlTypeName ? * @param javaClass ?? java */ public void setSqlTypeForClass(String sqlTypeName, Class<?> javaClass) { if (sqlTypeClassMap == null) { synchronized (this) { sqlTypeClassMap = new HashMap<String, Class<?>>(); } log.debug("sqlTypeClassMap == null"); } else { log.debug("sqlTypeClassMap != null"); } if (classSqlTypeMap == null) { synchronized (this) { classSqlTypeMap = new HashMap<Class<?>, String>(); } log.debug("classSqlTypeMap == null"); } else { log.debug("classSqlTypeMap != null"); } sqlTypeClassMap.put(sqlTypeName, javaClass); classSqlTypeMap.put(javaClass, sqlTypeName); } public String getSqlTypeForClass(Class<?> javaClass) { String res = null; if (classSqlTypeMap != null) { res = classSqlTypeMap.get(javaClass); } return res; } public Class<?> getClassForSqlType(String sqlTypeName) { Class<?> res = null; if (sqlTypeClassMap != null) { res = sqlTypeClassMap.get(sqlTypeName); } return res; } /** * */ public void getParameterMapNames() { log.debug(">> getParameterMapNames()"); Configuration conf = getConfiguration(); if (conf != null) { log.debug("conf != null"); Collection<String> pmn = conf.getParameterMapNames(); if (pmn != null) { log.debug("pmn != null. pmn.size={}", pmn.size()); for (String n : pmn) { log.debug("ParameterMapName={}", n); } } else { log.debug("pmn = null"); } } else { log.debug("conf = null"); } } }