/**
* Copyright (c) 2011-2020, hubin (jobob@qq.com).
* <p>
* 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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 com.baomidou.mybatisplus.mapper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.transaction.annotation.Transactional;
import com.baomidou.mybatisplus.entity.GlobalConfiguration;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.toolkit.StringUtils;
/**
* <p>
* SqlRunner 执行 SQL
* </p>
*
* @author Caratacus
* @Date 2016-12-11
*/
public class SqlRunner {
public static final String INSERT = "com.baomidou.mybatisplus.mapper.SqlRunner.Insert";
public static final String DELETE = "com.baomidou.mybatisplus.mapper.SqlRunner.Delete";
public static final String UPDATE = "com.baomidou.mybatisplus.mapper.SqlRunner.Update";
public static final String SELECT_LIST = "com.baomidou.mybatisplus.mapper.SqlRunner.SelectList";
public static final String SELECT_OBJS = "com.baomidou.mybatisplus.mapper.SqlRunner.SelectObjs";
public static final String COUNT = "com.baomidou.mybatisplus.mapper.SqlRunner.Count";
public static final String SQLScript = "${sql}";
public static final String SQL = "sql";
// 单例Query
public static final SqlRunner DEFAULT = new SqlRunner();
// 默认FACTORY
public static SqlSessionFactory FACTORY;
private SqlSessionFactory sqlSessionFactory;
private Class<?> clazz;
public SqlRunner() {
this.sqlSessionFactory = FACTORY;
}
public SqlRunner(Class<?> clazz) {
this.clazz = clazz;
}
/**
* 获取默认的SqlQuery(适用于单库)
*
* @return
*/
public static SqlRunner db() {
// 初始化的静态变量 还是有前后加载的问题 该判断只会执行一次
if (DEFAULT.sqlSessionFactory == null) {
DEFAULT.sqlSessionFactory = FACTORY;
}
return DEFAULT;
}
/**
* 根据当前class对象获取SqlQuery(适用于多库)
*
* @param clazz
* @return
*/
public static SqlRunner db(Class<?> clazz) {
return new SqlRunner(clazz);
}
@Transactional
public boolean insert(String sql, Object... args) {
return SqlHelper.retBool(sqlSession().insert(INSERT, sqlMap(sql, args)));
}
@Transactional
public boolean delete(String sql, Object... args) {
return SqlHelper.retBool(sqlSession().delete(DELETE, sqlMap(sql, args)));
}
/**
* 获取sqlMap参数
*
* @param sql
* @param args
* @return
*/
private Map<String, String> sqlMap(String sql, Object... args) {
Map<String, String> sqlMap = new HashMap<>();
sqlMap.put(SQL, StringUtils.sqlArgsFill(sql, args));
return sqlMap;
}
@Transactional
public boolean update(String sql, Object... args) {
return SqlHelper.retBool(sqlSession().update(UPDATE, sqlMap(sql, args)));
}
public List<Map<String, Object>> selectList(String sql, Object... args) {
return sqlSession().selectList(SELECT_LIST, sqlMap(sql, args));
}
public List<Object> selectObjs(String sql, Object... args) {
return sqlSession().selectList(SELECT_OBJS, sqlMap(sql, args));
}
public Object selectObj(String sql, Object... args) {
return SqlHelper.getObject(selectObjs(sql, args));
}
public int selectCount(String sql, Object... args) {
return SqlHelper.retCount(sqlSession().<Integer>selectOne(COUNT, sqlMap(sql, args)));
}
public Map<String, Object> selectOne(String sql, Object... args) {
return SqlHelper.getObject(selectList(sql, args));
}
@SuppressWarnings({"unchecked", "rawtypes"})
public Page<Map<String, Object>> selectPage(Page page, String sql, Object... args) {
if (null == page) {
return null;
}
page.setRecords(sqlSession().selectList(SELECT_LIST, sqlMap(sql, args), page));
return page;
}
/**
* <p>
* 获取Session 默认自动提交
* <p/>
*/
private SqlSession sqlSession() {
return (clazz != null) ? SqlHelper.sqlSession(clazz) : GlobalConfiguration.getSqlSession(FACTORY.getConfiguration());
}
}