/** * 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.activerecord; import java.io.Serializable; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.enums.SqlMethod; import com.baomidou.mybatisplus.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.mapper.Condition; import com.baomidou.mybatisplus.mapper.SqlHelper; import com.baomidou.mybatisplus.mapper.SqlRunner; import com.baomidou.mybatisplus.mapper.Wrapper; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.toolkit.StringUtils; /** * <p> * ActiveRecord 模式 CRUD * </p> * * @param <T> * @author hubin * @Date 2016-11-06 */ @SuppressWarnings({"rawtypes"}) public abstract class Model<T extends Model> implements Serializable { private static final long serialVersionUID = 1L; /** * <p> * 插入(字段选择插入) * </p> */ @Transactional public boolean insert() { return SqlHelper.retBool(sqlSession().insert(sqlStatement(SqlMethod.INSERT_ONE), this)); } /** * <p> * 插入(所有字段插入) * </p> */ @Transactional public boolean insertAllColumn() { return SqlHelper.retBool(sqlSession().insert(sqlStatement(SqlMethod.INSERT_ONE_ALL_COLUMN), this)); } /** * <p> * 插入 OR 更新 * </p> */ @Transactional public boolean insertOrUpdate() { if (StringUtils.checkValNull(pkVal())) { // insert return insert(); } else { /* * 更新成功直接返回,失败执行插入逻辑 */ return updateById() || insert(); } } /** * <p> * 根据 ID 删除 * </p> * * @param id 主键ID * @return */ @Transactional public boolean deleteById(Serializable id) { return SqlHelper.retBool(sqlSession().delete(sqlStatement(SqlMethod.DELETE_BY_ID), id)); } /** * <p> * 根据主键删除 * </p> * * @return */ @Transactional public boolean deleteById() { if (StringUtils.checkValNull(pkVal())) { throw new MybatisPlusException("deleteById primaryKey is null."); } return deleteById(this.pkVal()); } /** * <p> * 删除记录 * </p> * * @param whereClause 查询条件 * @param args 查询条件值 * @return */ @Transactional public boolean delete(String whereClause, Object... args) { return delete(Condition.create().where(whereClause, args)); } /** * <p> * 删除记录 * </p> * * @param wrapper * @return */ @Transactional public boolean delete(Wrapper wrapper) { Map<String, Object> map = new HashMap<>(); // delete map.put("ew", wrapper); return SqlHelper.retBool(sqlSession().delete(sqlStatement(SqlMethod.DELETE), map)); } /** * <p> * 更新(字段选择更新) * </p> */ @Transactional public boolean updateById() { if (StringUtils.checkValNull(pkVal())) { throw new MybatisPlusException("updateById primaryKey is null."); } // updateById return SqlHelper.retBool(sqlSession().update(sqlStatement(SqlMethod.UPDATE_BY_ID), this)); } /** * <p> * 更新(所有字段更新) * </p> */ @Transactional public boolean updateAllColumnById() { if (StringUtils.checkValNull(pkVal())) { throw new MybatisPlusException("updateAllColumnById primaryKey is null."); } // updateById return SqlHelper.retBool(sqlSession().update(sqlStatement(SqlMethod.UPDATE_ALL_COLUMN_BY_ID), this)); } /** * <p> * 执行 SQL 更新 * </p> * * @param whereClause 查询条件 * @param args 查询条件值 * @return */ @Transactional public boolean update(String whereClause, Object... args) { // update return update(Condition.create().where(whereClause, args)); } /** * <p> * 执行 SQL 更新 * </p> * * @param wrapper * @return */ @Transactional public boolean update(Wrapper wrapper) { Map<String, Object> map = new HashMap<>(); map.put("et", this); map.put("ew", wrapper); // update return SqlHelper.retBool(sqlSession().update(sqlStatement(SqlMethod.UPDATE), map)); } /** * <p> * 查询所有 * </p> * * @return */ public List<T> selectAll() { return sqlSession().selectList(sqlStatement(SqlMethod.SELECT_LIST)); } /** * <p> * 根据 ID 查询 * </p> * * @param id 主键ID * @return */ public T selectById(Serializable id) { return sqlSession().selectOne(sqlStatement(SqlMethod.SELECT_BY_ID), id); } /** * <p> * 根据主键查询 * </p> * * @return */ public T selectById() { if (StringUtils.checkValNull(pkVal())) { throw new MybatisPlusException("selectById primaryKey is null."); } return selectById(this.pkVal()); } /** * <p> * 查询总记录数 * </p> * * @param wrapper * @return */ public List<T> selectList(Wrapper wrapper) { Map<String, Object> map = new HashMap<>(); map.put("ew", wrapper); return sqlSession().selectList(sqlStatement(SqlMethod.SELECT_LIST), map); } /** * <p> * 查询所有 * </p> * * @param whereClause * @param args * @return */ public List<T> selectList(String whereClause, Object... args) { return selectList(Condition.create().where(whereClause, args)); } /** * <p> * 查询一条记录 * </p> * * @param wrapper * @return */ public T selectOne(Wrapper wrapper) { return SqlHelper.getObject(selectList(wrapper)); } /** * <p> * 查询一条记录 * </p> * * @param whereClause * @param args * @return */ public T selectOne(String whereClause, Object... args) { return selectOne(Condition.create().where(whereClause, args)); } /** * <p> * 翻页查询 * </p> * * @param page 翻页查询条件 * @param wrapper * @return */ public Page<T> selectPage(Page<T> page, Wrapper<T> wrapper) { Map<String, Object> map = new HashMap<>(); SqlHelper.fillWrapper(page, wrapper); map.put("ew", wrapper); List<T> tl = sqlSession().selectList(sqlStatement(SqlMethod.SELECT_PAGE), map, page); page.setRecords(tl); return page; } /** * <p> * 查询所有(分页) * </p> * * @param page * @param whereClause * @param args * @return */ @SuppressWarnings("unchecked") public Page<T> selectPage(Page<T> page, String whereClause, Object... args) { return selectPage(page, Condition.create().where(whereClause, args)); } /** * <p> * 查询总数 * </p> * * @param whereClause 查询条件 * @param args 查询条件值 * @return */ public int selectCount(String whereClause, Object... args) { return selectCount(Condition.create().where(whereClause, args)); } /** * <p> * 查询总数 * </p> * * @param wrapper * @return */ public int selectCount(Wrapper wrapper) { Map<String, Object> map = new HashMap<>(); map.put("ew", wrapper); return SqlHelper.retCount(sqlSession().<Integer>selectOne(sqlStatement(SqlMethod.SELECT_COUNT), map)); } /** * <p> * 执行 SQL * </p> */ public SqlRunner sql() { return new SqlRunner(getClass()); } /** * <p> * 获取Session 默认自动提交 * <p/> */ protected SqlSession sqlSession() { return SqlHelper.sqlSession(getClass()); } /** * 获取SqlStatement * * @param sqlMethod * @return */ protected String sqlStatement(SqlMethod sqlMethod) { return sqlStatement(sqlMethod.getMethod()); } /** * 获取SqlStatement * * @param sqlMethod * @return */ protected String sqlStatement(String sqlMethod) { return SqlHelper.table(getClass()).getSqlStatement(sqlMethod); } /** * 主键值 */ protected abstract Serializable pkVal(); }