All Downloads are FREE. Search and download functionalities are using the official Maven repository.

kim.zkp.quick.orm.session.Session Maven / Gradle / Ivy

/**
 * Copyright (c) 2017, ZhuKaipeng 朱开鹏 ([email protected]).

 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 kim.zkp.quick.orm.session;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import javax.sql.DataSource;

import com.xiaoleilu.hutool.io.IORuntimeException;
import com.xiaoleilu.hutool.log.Log;
import com.xiaoleilu.hutool.log.LogFactory;

import kim.zkp.quick.orm.connection.ConnectionProcessor;
import kim.zkp.quick.orm.connection.JDBCConfig;
import kim.zkp.quick.orm.exception.SqlBuilderException;
import kim.zkp.quick.orm.model.Page;
import kim.zkp.quick.orm.sql.SqlInfo;
import kim.zkp.quick.orm.sql.builder.SqlBuilder;
import kim.zkp.quick.orm.sql.builder.SqlBuilderProcessor;
import kim.zkp.quick.orm.table.CreateTable;
/**
 * class       :  Session
 * @author     :  zhukaipeng
 * @version    :  1.0  
 * description :  Session类似数据源,且提供了一套操作数据库的API
 * @see        :  *
 */
public class Session implements DataBaseManipulation,SqlDataBaseManipulation,FutureDataBaseManipulation,SqlFutureDataBaseManipulation,Transaction {
	private static final Log log = LogFactory.get();
	private static final Map sessionContainer = new HashMap();
	private ConnectionProcessor connectionProcessor;
	private ExecutorService futurePool;
	private SqlBuilderProcessor sqlBuilderProcessor;

	private Session(String jdbcConfigName) {
		super();
		JDBCConfig jdbcConfig = JDBCConfig.newInstance(jdbcConfigName);
		connectionProcessor = new ConnectionProcessor(jdbcConfig);
		sqlBuilderProcessor = new SqlBuilderProcessor(jdbcConfig.getDbType());
		futurePool = Executors.newFixedThreadPool(jdbcConfig.getAsyncPoolSize());
		if (jdbcConfig.getPackagePath()!=null) {
			CreateTable createTable = new CreateTable(this,sqlBuilderProcessor,jdbcConfig.getPackagePath());
			createTable.start();
		}
	}
	
	private DataSource getDataSource(){
		return connectionProcessor.getDataSource();
	}
	
	public static DataSource getDataSource(String jdbcConfigName){
		return getSession(jdbcConfigName).getDataSource();
	}
	/**
	 * method name   : getDefaultSession 
	 * description   : 获取jdbc.setting文件配置的Session
	 * @return       : Session
	 * @param        : @return
	 * modified      : zhukaipeng ,  2017年9月15日
	 * @see          : *
	 */
	public static Session getDefaultSession(){
		try {
			return getSession("jdbc.setting");
		} catch (IORuntimeException e) {
			log.warn("未配置默认数据源[jdbc.setting]");
			return null;
		}
	}
	/**
	 * method name   : getSession 
	 * description   : 获取Session
	 * @return       : Session
	 * @param        : @param jdbcName setting配置文件名
	 * @param        : @return
	 * modified      : zhukaipeng ,  2017年9月15日
	 * @see          : *
	 */
	public static Session getSession(String jdbcConfigName){
		Session session = sessionContainer.get(jdbcConfigName);
		if (session == null) {
			session = new Session(jdbcConfigName);
			sessionContainer.put(jdbcConfigName, session);
		}
		return session;
	}
	@Override
	public int save(Object o) {
		SqlInfo sqlInfo = sqlBuilderProcessor.getSql(SqlBuilder.SBType.SAVE, o);
		return connectionProcessor.update(getConnection(), sqlInfo);
	}
	@Override
	public int delete(Object o) {
		SqlInfo sqlInfo = sqlBuilderProcessor.getSql(SqlBuilder.SBType.DELETE, o);
		return connectionProcessor.update(getConnection(), sqlInfo);
	}
	
	@Override
	public int update(Object o) {
		SqlInfo sqlInfo = sqlBuilderProcessor.getSql(SqlBuilder.SBType.UPDATE, o);
		return connectionProcessor.update(getConnection(), sqlInfo);
	}
	
	@Override
	public Object get(Object o) {
		return this.get(o, o.getClass());
	}
	
	@Override
	public Object get(Object o,Class clzz) {
		SqlInfo sqlInfo = sqlBuilderProcessor.getSql(SqlBuilder.SBType.GET, o);
		return connectionProcessor.get(getConnection(), sqlInfo,clzz);
	}

	@Override
	public List list(Object o) {
		return this.list(o, o.getClass());
	}
	
	@Override
	public Page page(Object o) {
		return page(o,o.getClass());
	}
	
	@Override
	public Page page(Object o,Class clzz) {
		Map pageInfo = Page.getPageInfo();
		if (pageInfo == null || pageInfo.get("pageNum")==null || pageInfo.get("pageSize")==null) {
			throw new SqlBuilderException("PageNum or pageSize is null");
		}
		
		SqlInfo countSqlInfo = sqlBuilderProcessor.getSql(SqlBuilder.SBType.PAGE_COUNT, o);
		Integer total = (Integer) connectionProcessor.get(getConnection(), countSqlInfo,Integer.class);
		
		if (total == 0) {
			Page page = new Page(pageInfo.get("pageNum"),pageInfo.get("pageSize"), total, new ArrayList<>());
			return page;
		}
		
		SqlInfo listSqlInfo = sqlBuilderProcessor.getSql(SqlBuilder.SBType.PAGE_LIST, o);
		List list = connectionProcessor.list(getConnection(), listSqlInfo,clzz);
		return new Page(pageInfo.get("pageNum"),pageInfo.get("pageSize"), total, list);
	}
	
	@Override
	public Page sqlPage(String countSql,String listSql, Class clzz, Object ... params) {
		Map pageInfo = Page.getPageInfo();
		if (pageInfo == null || pageInfo.get("pageNum")==null || pageInfo.get("pageSize")==null) {
			throw new SqlBuilderException("PageNum or pageSize is null");
		}
		List paramList = Arrays.asList(params);
		SqlInfo countSqlInfo = new SqlInfo(countSql, paramList);
		Integer total = (Integer) connectionProcessor.get(getConnection(), countSqlInfo,Integer.class);
		
		if (total == 0) {
			Page page = new Page(pageInfo.get("pageNum"),pageInfo.get("pageSize"), total, new ArrayList());
			return page;
		}
		
		SqlInfo listSqlInfo = new SqlInfo(listSql, paramList);
		List list = connectionProcessor.list(getConnection(), listSqlInfo,clzz);
		return new Page(pageInfo.get("pageNum"),pageInfo.get("pageSize"), total, list);
	}
	
	@Override
	public List list(Object o,Class clzz) {
		SqlInfo sqlInfo = sqlBuilderProcessor.getSql(SqlBuilder.SBType.LIST, o);
		return connectionProcessor.list(getConnection(), sqlInfo,clzz);
	}
	
	@Override
	public int sqlSave(String sql, Object ... params) {
		List paramList = Arrays.asList(params);
		SqlInfo sqlInfo = new SqlInfo(sql, paramList);
		return connectionProcessor.update(getConnection(), sqlInfo);
	}
	
	@Override
	public int sqlDelete(String sql, Object ... params) {
		List paramList = Arrays.asList(params);
		SqlInfo sqlInfo = new SqlInfo(sql, paramList);
		return connectionProcessor.update(getConnection(), sqlInfo);
	}
	
	@Override
	public int sqlUpdate(String sql, Object ... params) {
		List paramList = Arrays.asList(params);
		SqlInfo sqlInfo = new SqlInfo(sql, paramList);
		return connectionProcessor.update(getConnection(), sqlInfo);
	}
	
	@Override
	public Object sqlGet(String sql,Class clzz, Object ... params) {
		List paramList = Arrays.asList(params);
		SqlInfo sqlInfo = new SqlInfo(sql, paramList);
		return connectionProcessor.get(getConnection(), sqlInfo, clzz);
	}
	
	@Override
	public List sqlList(String sql,Class clzz, Object ... params) {
		List paramList = Arrays.asList(params);
		SqlInfo sqlInfo = new SqlInfo(sql, paramList);
		return connectionProcessor.list(getConnection(), sqlInfo, clzz);
	}
	
	public Connection getConnection(){
		return connectionProcessor.getConnection();
	}
	@Override
	public void start(){
		connectionProcessor.setAutoCommit(getConnection(), false);
	}
	@Override
	public void rollback(){
		connectionProcessor.rollback(getConnection());
	}
	@Override
	public void commit(){
		connectionProcessor.commit(getConnection());
	}
	@Override
	public void close(){
		connectionProcessor.close(getConnection());
	}
	

	@Override
	public Future ftSave(Object o) {
		return futurePool.submit(new Callable() {
			public Integer call() throws Exception {
				return save(o);
			}
		});
	}

	@Override
	public Future ftDelete(Object o) {
		return futurePool.submit(new Callable() {
			public Integer call() throws Exception {
				return delete(o);
			}
		});
	}

	@Override
	public Future ftUpdate(Object o) {
		return futurePool.submit(new Callable() {
			public Integer call() throws Exception {
				return update(o);
			}
		});
	}

	@Override
	public Future ftGet(Object o) {
		return futurePool.submit(new Callable() {
			public Object call() throws Exception {
				return get(o);
			}
		});
	}

	@Override
	public Future ftGet(Object o, Class clzz) {
		return futurePool.submit(new Callable() {
			public Object call() throws Exception {
				return get(o, clzz);
			}
		});
	}

	@Override
	public Future> ftList(Object o) {
		return futurePool.submit(new Callable>() {
			public List call() throws Exception {
				return list(o);
			}
		});
	}

	@Override
	public Future> ftList(Object o, Class clzz) {
		return futurePool.submit(new Callable>() {
			public List call() throws Exception {
				return list(o, clzz);
			}
		});
	}

	@Override
	public Future ftSqlSave(String sql, Object ... params) {
		return futurePool.submit(new Callable() {
			public Integer call() throws Exception {
				return sqlSave(sql, params);
			}
		});
	}

	@Override
	public Future ftSqlDelete(String sql, Object ... params) {
		return futurePool.submit(new Callable() {
			public Integer call() throws Exception {
				return sqlUpdate(sql, params);
			}
		});
	}

	@Override
	public Future ftSqlUpdate(String sql, Object ... params) {
		return futurePool.submit(new Callable() {
			public Integer call() throws Exception {
				return sqlUpdate(sql, params);
			}
		});
	}

	@Override
	public Future ftSqlGet(String sql, Class clzz, Object ... params) {
		return futurePool.submit(new Callable() {
			public Object call() throws Exception {
				return sqlGet(sql, clzz, params);
			}
		});
	}

	@Override
	public Future> ftSqlList(String sql, Class clzz, Object ... params) {
		return futurePool.submit(new Callable>() {
			public List call() throws Exception {
				return sqlList(sql, clzz, params);
			}
		});
	}

	@Override
	public Future> ftPage(Object o) {
		return futurePool.submit(new Callable>() {
			public Page call() throws Exception {
				return page(o);
			}
		});
	}

	@Override
	public Future> ftPage(Object o, Class clzz) {
		return futurePool.submit(new Callable>() {
			public Page call() throws Exception {
				return page(o,clzz);
			}
		});
	}

	@Override
	public Future> ftSqlPage(String countSql, String listSql, Class clzz, Object ... params) {
		return futurePool.submit(new Callable>() {
			public Page call() throws Exception {
				return sqlPage(countSql, listSql, clzz, params);
			}
		});
	}
//	@Override
//	public int batchSave(List list) {
//		SqlInfo sqlInfo = sqlBuilderProcessor.getSql(SqlBuilder.SBType.BATCH_SAVE, list);
//		return connectionProcessor.update(getConnection(), sqlInfo);
//	}

	
	
}