Официальная документация: Официальная документация ACTable Открытые проекты не просты, если вы считаете, что этот проект помогает вашей работе, пожалуйста, оставьте звездочку (в правом верхнем углу страницы), спасибо При добавлении автора в WeChat, пожалуйста, укажите actable: ! Автор WeChat Технический обмен QQ-группа: 746531106 A.C.Table представляет собой улучшение функций Mybatis, поддерживающее SpringBoot и традиционную структуру SpringMvc проектов, простая настройка, этот фреймворк создан для того, чтобы разработчики, привыкшие к Hibernate, могли быстро освоить Mybatis. "A.C.Table" буквально означает "автоматическое создание таблиц", A.C.Table — это Maven-проект на основе Spring и Mybatis, который улучшает функции Mybatis, создавая таблицы и изменяя их структуру с помощью аннотаций модели, а также реализует общие функции CUDR для повышения производительности разработки. В то же время он совместим с tk.mybatis и mybatis-plus, если вам нужно использовать зависимости, вы можете использовать соответствующие зависимости pom, в настоящее время поддерживается только Mysql, но в будущем будет поддерживаться и другие базы данных. Документация Javadoc: https://apidoc.gitee.com/sunchenbin/mybatis-enhance A.C.Table использует структуру Maven на основе Spring и Mybatis, подробное описание приведено ниже:
<dependency>
<groupId>com.gitee.sunchenbin.mybatis.actable</groupId>
<artifactId>mybatis-enhance-actable</artifactId>
<version>1.5.0.RELEASE</version>
</dependency>
<!-- Если вам нужно использовать tk.mybatis вместе с этим, вам также потребуется зависимость этого jar-файла, ранее версии 1.3.1 и 1.3.0 по умолчанию включали эту зависимость, но некоторые пользователи столкнулись с конфликтами при использовании mybatis-plus, поэтому в этой версии по умолчанию зависимость не включена, если вам нужно использовать, вы можете добавить её самостоятельно -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
actable.table.auto=update
actable.model.pack=com.xxx.store.model(ps: директория моделей для сканирования и создания таблиц)
actable.database.type=mysql
В системе доступно четыре режима:
2.1 Когда actable.table.auto=create, система после запуска удаляет все таблицы, а затем заново создаёт таблицы в соответствии с конфигурацией структуры в моделях. Этот процесс уничтожает существующие данные.
2.Когда `auto=update`, система автоматически определяет, какие таблицы являются новыми, какие поля требуют изменения типа, какие поля нужно удалить, а какие поля нужно добавить. Этот процесс не уничтожает существующие данные.
3. Когда `auto=none`, система не выполняет никаких действий.
4. Когда `auto=add`, система поддерживает функции добавления таблиц, полей, индексов и уникальных ограничений, но не выполняет операции изменения и удаления (поддерживается начиная с версии 1.0.9.RELEASE).
5. Конфигурация `actable.model.pack` используется для указания пакета, который нужно сканировать для создания таблиц.
6. Конфигурация `actable.database.type` используется для различения типов баз данных. Ожидается поддержка четырёх типов баз данных: mysql/oracle/sqlserver/postgresql, но в настоящее время поддерживается только mysql.```
3. Поддержка конфигурации mybatis для actable (необходимая конфигурация)
<!-- В конфигурационном файле mybatis необходимо выполнить две конфигурации, так как проект mybatis-enhance-actable использует стандарты mybatis для выполнения SQL -->
1. classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml
2. com.gitee.sunchenbin.mybatis.actable.dao.*
4. Сканирование пакета actable и управление им в контейнере Spring (необходимая конфигурация)
1. com.gitee.sunchenbin.mybatis.actable.manager.*
#### Шаги использования проекта Springboot+Mybatis
1. Сначала добавьте зависимость к фреймворку actable в файл pom
<dependency>
<groupId>com.gitee.sunchenbin.mybatis.actable</groupId>
<artifactId>mybatis-enhance-actable</artifactId>
<version>1.5.0.RELEASE</version>
</dependency>
<!-- Если вы хотите использовать tk.mybatis, вам также потребуется зависимость к этому jar-файлу. В версиях 1.3.1 и 1.3.0 эта зависимость добавляется по умолчанию, но некоторые пользователи столкнулись с конфликтами при использовании mybatis-plus, поэтому в этой версии зависимость не добавляется по умолчанию. Если вам требуется использовать её, добавьте её самостоятельно -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
2. Конфигурация файла application.properties проекта, например:
# Конфигурация actable
actable.table.auto=update
actable.model.pack=com.xxx.store.model(ps: пакет модели для сканирования)
actable.database.type=mysql
# Конфигурация mybatis
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis.mapperLocations=classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml; свой mapper.xml отсутствует, можно не заполнять
1. С помощью аннотации @ComponentScan настроить, чтобы сканировался пакет actable для регистрации в spring "com.gitee.sunchenbin.mybatis.actable.manager.*"
2. С помощью аннотации @MapperScan настроить, чтобы сканировались mybatis mapper, путь "com.gitee.sunchenbin.mybatis.actable.dao.*"
```#### Традиционный Spring+Mybatis веб-проект шаги использования
1. Сначала в файле pom добавить зависимость на actable фреймворк
<dependency>
<groupId>com.gitee.sunchenbin.mybatis.actable</groupId>
<artifactId>mybatis-enhance-actable</artifactId>
<version>1.5.0.RELEASE</version>
</dependency>
<!-- Если требуется использовать tk.mybatis, необходимо добавить зависимость на этот jar -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
2. В вашем веб-проекте создать директорию, например, config, и создать файл autoCreateTable.properties с содержимым:
actable.table.auto=update
actable.model.pack=com.xxx.store.model(ps: путь к сканируемым моделям)
actable.database.type=mysql
3. В конфигурационном файле spring необходимо выполнить следующую настройку:
<!-- Автоматическое сканирование (автоматическая инъекция mybatis-enhance-actable Manager) обязательно для конфигурации, иначе не будет сканироваться нижележащие методы manager -->
<context:component-scan base-package="com.gitee.sunchenbin.mybatis.actable.manager.*" />
<!-- Это конфигурационный файл функциональных возможностей mybatis-enhance-actable, фактически это регистрация файла autoCreateTable.properties в spring, чтобы нижележащие методы mybatis-enhance-actable могли получить доступ к нему -->
<bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath*:config/autoCreateTable.properties</value>
</list>
</property>
</bean>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<property name="properties" ref="configProperties" />
</bean>
<!-- Конфигурационный файл mybatis должен содержать две настройки, так как проект mybatis-enhance-actable в основе использует стандарты mybatis для выполнения SQL-запросов. Поэтому необходимо сопоставить mapping и dao.
1. classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml
2. com.gitee.sunchenbin.mybatis.actable.dao.*
Примеры местоположения этих двух конфигураций
<!-- myBatis файл -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- Автоматическое сканирование директории entity, что позволяет избежать ручного конфигурирования в Configuration.xml -->
<property name="mapperLocations">
<array>
<value>classpath*:своего mappring.xml если он есть</value>
<value>classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml</value>
</array>
</property>
<property name="typeAliasesPackage" value="своего model.* если он есть" />
<!-- <property name="configLocation" value="classpath:core/mybatis-configuration.xml" /> -->
</bean>
<!-- Если tk.mybatis не используется, этот bean должен быть настроен следующим образом: -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.gitee.sunchenbin.mybatis.actable.dao.*;своего dao.* если он есть" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
<!-- Если tk.mybatis используется, этот bean должен быть настроен следующим образом: -->
<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.gitee.sunchenbin.mybatis.actable.dao.*;своего dao.* если он есть"/>
</bean> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="properties">
<value>
mappers=tk.mybatis.mapper.common.Mapper,tk.mybatis.mapper.common.special.InsertListMapper
</value>
</property>
</bean>
#### Пояснение к коду
1. MySqlCharsetConstant.java этот объект содержит конфигурацию типов данных MySQL. Чем больше типов данных указано, тем больше типов данных можно использовать при создании таблиц.
2. @Column.java также является пользовательской аннотацией, которая используется для пометки полей в модели, как основа для создания таблиц. Если поле не помечено, оно не будет обнаружено. У этой аннотации есть несколько свойств для установки имени поля, типа поля, длины и других параметров. Подробнее смотрите комментарии в коде.
3. @Table аннотация также является пользовательской аннотацией, используемой для пометки объектов модели. У неё есть одно свойство name для установки имени таблицы, которое будет создано для этой модели. Если аннотация не установлена, модель не будет обнаружена.
4. @Index аннотация является пользовательской аннотацией, используемой для пометки полей в модели, чтобы создать индекс для этого поля. У неё есть два свойства: одно для установки имени индекса, другое для установки полей индекса. Поддерживает объединение нескольких полей в индекс. Если эти свойства не установлены, по умолчанию будет создан индекс для текущего поля.
5. @Unique аннотация является пользовательской аннотацией, используемой для пометки полей в модели, чтобы создать уникальное ограничение для этого поля. У неё есть два свойства: одно для установки имени ограничения, другое для установки полей ограничения. Поддерживает объединение нескольких полей в ограничение. Если эти свойства не установлены, по умолчанию будет создано уникальное ограничение для текущего поля.
6. @TableComment используется для настройки комментариев таблицы, может заменить комментарий в аннотации @Table.
7. @IsKey/@IsAutoIncrement/@IsNotNull используются для замены свойств isKey/isAutoIncrement/isNull в аннотации @Column, конечно, старый способ настройки всё ещё поддерживается.
8. @ColumnComment используется для замены свойства comment в аннотации @Column.
9. @DefaultValue используется для замены свойства defaultValue в аннотации @Column.
10. @ColumnType используется для замены свойства type в аннотации @Column, значения которого берутся из перечисления MySqlTypeConstant.java.
11. @TableCharset используется для замены свойства charset в аннотации @Table, значения которого берутся из перечисления MySqlCharsetConstant.java.
12. @TableEngine используется для замены свойства engine в аннотации @Table, значения которого берутся из перечисления MySqlEngineConstant.java.
13. Поддерживает некоторые аннотации из пакета javax.persistence для поддержки tk.mybatis.
javax.persistence.Column эквивалентен com.gitee.sunchenbin.mybatis.actable.annotation.Column
javax.persistence.Column.name эквивалентен com.gitee.sunchenbin.mybatis.actable.annotation.Column.name
javax.persistence.Column.length эквивалентен com.gitee.sunchenbin.mybatis.actable.annotation.Column.length
javax.persistence.Column.scale эквивалентен com.gitee.sunchenbin.mybatis.actable.annotation.Column.decimalLength
javax.persistence.Table эквивалентен com.gitee.sunchenbin.mybatis.actable.annotation.Table
javax.persistence.Id эквивалентен com.gitee.sunchenbin.mybatis.actable.annotation.IsKey
13. После запуска системы будет автоматически вызван метод createMysqlTable() класса SysMysqlCreateTableManagerImpl.java. Именно этот метод является ключевым и отвечает за создание, удаление и изменение таблиц.
#### пример написания модели (здесь @Table и @Column используются из пакета actable, но также поддерживаются @Table и @Column из пакета javax.persistence, а также @Id)
@Builder @Data @NoArgsConstructor @AllArgsConstructor @Table(name = "test") @TableComment("тестовая таблица") @TableEngin(MySqlEngineConstant.INNODB) @TableCharset(MySqlCharsetConstant.UTF8MB4) public class UserEntity extends BaseModel{ private static final long serialVersionUID = 5199200306752426433L; // Первый способ задания первичного ключа @Column(name = "id",type = MySqlTypeConstant.INT,length = 11,isKey = true,isAutoIncrement = true) private Integer id; // Второй упрощённый способ задания первичного ключа @IsKey @IsAutoIncrement @Column @ColumnType(MySqlTypeConstant.INT) private Integer id; // Первый способ задания индекса, этот способ создаёт индекс с именем actable_idx_{login_name} по полю login_name @Index // Второй способ задания индекса, этот способ создаёт индекс с именем actable_idx_{t_idx_login_name} по полю login_name
// Третий способ задания индекса, этот способ создаёт индекс с именем actable_idx_{t_idx_login_name} по полю login_name
@Index(value="t_idx_login_name",columns={"login_name"})
// Четвёртый способ задания индекса, этот способ создаёт составной индекс с именем actable_idx_{login_name_mobile} по полям login_name и mobile
@Index(columns={"login_name","mobile"})
// Пятый способ задания индекса, этот способ создаёт составной индекс с именем actable_idx_{login_name_mobile} по полям login_name и mobile
@Index(value="t_idx_login_name_mobile",columns={"login_name","mobile"})
// Пример использования аннотации уникального ограничения, аналогично @Index
@Unique
@Column(name = "login_name", type = MySqlTypeConstant.VARCHAR, length = 111)
private String loginName;
// Упрощённый способ задания столбца, если имя столбца не указано, используется имя свойства, тип свойства автоматически преобразуется к типу, поддерживаемому MySQL
@Column
``````markdown
#### Правила автоматического преобразования типов при отсутствии явного указания типа в аннотации `@Column` (рекомендуется использовать объектные типы, а не примитивные типы)
```java
javaToMysqlTypeMap.put("class java.lang.String", MySqlTypeConstant.VARCHAR);
javaToMysqlTypeMap.put("class java.lang.Long", MySqlTypeConstant.BIGINT);
javaToMysqlTypeMap.put("class java.lang.Integer", MySqlTypeConstant.INT);
javaToMysqlTypeMap.put("class java.lang.Boolean", MySqlTypeConstant.BIT);
javaToMysqlTypeMap.put("class java.math.BigInteger", MySqlTypeConstant.BIGINT);
javaToMysqlTypeMap.put("class java.lang.Float", MySqlTypeConstant.FLOAT);
javaToMysqlTypeMap.put("class java.lang.Double", MySqlTypeConstant.DOUBLE);
javaToMysqlTypeMap.put("class java.math.BigDecimal", MySqlTypeConstant.DECIMAL);
javaToMysqlTypeMap.put("class java.sql.Date", MySqlTypeConstant.DATE);
``````java
DATE);
javaToMysqlTypeMap.put("class java.util.Date", MySqlTypeConstant.DATE);
javaToMysqlTypeMap.put("class java.sql.Timestamp", MySqlTypeConstant.DATETIME);
javaToMysqlTypeMap.put("class java.sql.Time", MySqlTypeConstant.TIME);
manager
или Controller
внедрить интерфейс BaseCRUDManager
.BaseMysqlCRUDManager
устарел, его использование не рекомендуется.tk.mybatis
, что позволяет использовать более гибкие методы CUDR, если используются аннотации javax.persistence.Column
, Table
и Id
.См. официальную документацию tk.mybatis для использования.
import com.gitee.sunchenbin.mybatis.actable.annotation.Index;
import com.gitee.sunchenbin.mybatis.actable.annotation.IsAutoIncrement;
import com.gitee.sunchenbin.mybatis.actable.annotation.IsKey;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "user_entity")
public class UserEntity extends UserEntity1 implements Serializable {
@Id
@IsKey
@IsAutoIncrement
@Column
private Long id;
@Column(name = "login_name")
@Index
private String loginName;
@Column(name = "nick_name")
private String nickName;
@Column(name = "real_name")
private String realName;
@Column(name = "password")
private String password;
}
``` @Column(name = "mobile")
private String mobile;
@Column(name = "istrue")
private Boolean isTrue;
@Column(name = "it")
private Integer it;
@Column
private Date createTime;
@Column
private Date modifyTime;
}
import com.alex.orderapi.dao.entity.UserEntity;
import tk.mybatis.mapper.common.Mapper;
public interface UserMapper extends Mapper<UserEntity> {
}
@RequestMapping("/select/user1")
public String select1(HttpServletRequest request) {
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("1").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("2").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("3").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("4").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("5").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("6").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("7").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("8").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("9").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("10").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("11").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("12").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("13").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("14").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("15").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("16").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("17").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("18").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("19").build());
userMapper.insert(UserEntity.builder().loginName("s").createTime(new Date()).realName("v").password("r").mobile("20").build());
}loginName("s"). createTime(new Date()). realName("v"). password("r"). mobile("13"). build());
userMapper. insert(UserEntity. builder(). loginName("s"). createTime(new Date()). realName("v"). password("r"). mobile("14"). build());
userMapper. insert(UserEntity. builder(). loginName("s"). createTime(new Date()). realName("v"). password("r"). mobile("2"). build());
List<UserEntity> userEntities1 = userMapper. selectAll();
List<UserEntity> select = userMapper. select(UserEntity. builder(). mobile("2"). build());
Example example = new Example(UserEntity. class);
example. createCriteria(). andEqualTo("mobile", "3"). andEqualTo("loginName", "s");
List<UserEntity> userEntities = userMapper. selectByExample(example);
UserEntity v = userMapper. selectOne(UserEntity. builder(). id(30L). build());
UserEntity userEntity = userMapper. selectByPrimaryKey(10);
List<UserEntity> userEntities2 = userMapper. selectByRowBounds(UserEntity. builder(). build(), new RowBounds(0, 3));
List<UserEntity> userEntities3 = userMapper. selectByExampleAndRowBounds(Example. builder(UserEntity. class). build(), new RowBounds(3, 3));
Example example1 = new Example(UserEntity. class);
example1. setOrderByClause("id desc");
List<UserEntity> userEntities4 = userMapper. selectByExampleAndRowBounds(example1, new RowBounds(0, 3));
return "selectAll: " + JSON. toJSONString(userEntities1) +
"<p> select: " + JSON. toJSONString(select) +
"<p> selectByExample: " + JSON. toJSONString(userEntities) +
"<p> selectOne: " + JSON. toJSONString(v) +
"<p> selectByPrimaryKey: " + JSON. toJSONString(userEntity) +
"<p> selectByRowBounds: " + JSON. toJSONString(userEntities2) +
"<p> selectByExampleAndRowBounds: " + JSON. toJSONString(userEntities3) +
"<p> selectByExampleAndRowBounds: " + JSON. toJSONString(userEntities4);
}
#### Пример использования BaseCRUDManager
@Controller public class TestController{ @Autowired private TestManager testManager; @Autowired private BaseCRUDManager baseCRUDManager; /** * Главная страница */ @RequestMapping("/testDate") @ResponseBody public String testDate(){ UserEntity insert = baseCRUDManager. insert(UserEntity. builder(). loginName("111"). build()); UserEntity insertSelective = baseCRUDManager. insertSelective(UserEntity. builder(). loginName("222"). build()); List userEntities1 = baseCRUDManager. selectAll(UserEntity. class); boolean b = baseCRUDManager. updateByPrimaryKey(UserEntity. builder(). id(1L). mobile("1111"). build()); boolean b1 = baseCRUDManager. updateByPrimaryKeySelective(UserEntity. builder(). id(2L). mobile("1111"). build()); UserEntity userEntity = baseCRUDManager. selectOne(UserEntity. builder(). id(1L). mobile("1111"). build()); UserEntity userEntity1 = baseCRUDManager. selectByPrimaryKey(UserEntity. builder(). id(8L). mobile("1111"). build()); List select = baseCRUDManager. select(UserEntity. builder(). mobile("1111"). build()); int i = baseCRUDManager. selectCount(UserEntity. builder(). build()); int sss = baseCRUDManager. delete(UserEntity. builder(). realName("sss"). build()); int i1 = baseCRUDManager. deleteByPrimaryKey(UserEntity. builder(). id(5L). loginName("222"). build()); boolean b2 = baseCRUDManager. existsByPrimaryKey(UserEntity. builder(). id(1L). build()); boolean b3 = baseCRUDManager. existsByPrimaryKey(UserEntity. builder(). id(222L). build());
user. setCurrentPage(1);
user. setPageSize(5);
LinkedHashMap<String, String> ordermap = new LinkedHashMap<>();
ordermap. put("id", BaseModel. ASC);
user. setOrderBy(ordermap);
PageResultCommand<UserEntity> search = baseCRUDManager. search(user);
PageResultCommand<UserEntity> search3 = baseCRUDManager. search(user, 1, 5, ordermap);
return "успех";
}
}```markdown
#### AC. Таблица поддерживаемый базовый класс BaseCRUDManager методы CRUD интерфейса документация
/**
* Поиск результатов на основе непустых полей объекта сущности как условий WHERE. Если все поля объекта пустые, то возвращаются все данные, аналогично selectAll.
* @param t объект сущности
* @param <T> тип объекта сущности
* @return список объектов сущности
* @version поддерживаемая версия 1.1.0.RELEASE
*/
<T> List<T> select(T t);
/**
* Поиск результата на основе значения поля с аннотацией @IsKey объекта сущности как условия WHERE. Поле с аннотацией @IsKey не может быть пустым.
* @param t объект сущности (необходимо задать только значение поля с аннотацией @IsKey, значения других полей не будут считываться)
* @param <T> тип объекта сущности
* @return объект сущности
* @version поддерживаемая версия 1.1.0.RELEASE
*/
<T> T selectByPrimaryKey(T t);
/**
* Поиск всех данных таблицы
* @param clasz класс объекта сущности
* @param <T> тип объекта сущности
* @return список объектов сущности
* @version поддерживаемая версия 1.1.0.RELEASE
*/
<T> List<T> selectAll(Class<T> clasz);
/**
* Поиск количества результатов на основе непустых полей объекта сущности как условий WHERE. Если все поля объекта пустые, то подсчитывается количество всех записей таблицы.
* @param t объект сущности
* @param <T> тип объекта сущности
* @return количество результатов
* @version поддерживаемая версия 1.1.0.RELEASE
*/
<T> int selectCount(T t);
/**
``` * Поиск результата на основе непустых полей объекта сущности как условий WHERE. Если все поля объекта пустые, то возвращается первая запись таблицы, используя LIMIT 1.
* @param t объект сущности
* @param <T> тип объекта сущности
* @return объект сущности
* @version поддерживаемая версия 1.1.0.RELEASE
*/
<T> T selectOne(T t);
* @param <T> тип объекта сущности
* @return количество успешно выполненных операций
* @version поддерживаемая версия 1.1.0.RELEASE
*/
<T> int delete(T t);
/**
* Удаляет запись на основе значения поля @IsKey, являющегося первичным ключом объекта сущности. Поле первичного ключа не может быть null.
* @param t объект сущности (необходимо задать только значение поля первичного ключа, значения других полей не используются)
* @param <T> тип объекта сущности
* @return количество успешно выполненных операций
* @version поддерживаемая версия 1.1.0.RELEASE
*/
<T> int deleteByPrimaryKey(T t);
/**
* Проверяет наличие записи на основе значения поля @IsKey, являющегося первичным ключом объекта сущности. Поле первичного ключа не может быть null.
* @param t объект сущности (необходимо задать только значение поля первичного ключа, значения других полей не используются)
* @param <T> тип объекта сущности
* @return true, если запись существует, и false, если запись отсутствует
* @version поддерживаемая версия 1.1.0.RELEASE
*/
<T> boolean existsByPrimaryKey(T t);
/**
* Сохраняет запись на основе объекта сущности. Если поле первичного ключа не имеет свойства AUTO_INCREMENT, то оно не может быть null.
* @param t объект сущности
* @param <T> тип объекта сущности
* @return объект сущности
* @version поддерживаемая версия 1.1.0.RELEASE
*/
<T> T insert(T t);
/**
* Сохраняет запись на основе объекта сущности. Если значение атрибута null, то оно не вставляется, а вместо него используется значение по умолчанию из базы данных. Если поле первичного ключа не имеет свойства AUTO_INCREMENT, то оно не может быть null.
* @param t объект сущности
* @param <T> тип объекта сущности
* @return объект сущности
* @version поддерживаемая версия 1.1.0.RELEASE
*/
<T> T insertSelective(T t);
/**
* Обновляет запись на основе объекта сущности, используя значение поля первичного ключа в качестве условия WHERE. Поле первичного ключа не может быть null.
* @param t объект сущности
* @param <T> тип объекта сущности
* @return результат обновления
* @version поддерживаемая версия 1.1.0.RELEASE
*/
<T> boolean updateByPrimaryKey(T t);
/**
* Обновляет запись на основе объекта сущности, используя значение поля первичного ключа в качестве условия WHERE. Если значение атрибута null, то обновление пропускается. Поле первичного ключа не может быть null.
* @param t объект сущности
* @param <T> тип объекта сущности
* @return результат обновления
* @version поддерживаемая версия 1.1.0.RELEASE
*/ */
<T> boolean updateByPrimaryKeySelective(T t);
/**
* Выполняет запрос данных на основе SQL-запроса и возвращает преобразованный объект указанного типа
*
* @param sql Динамический SQL
* @param beanClass Тип объекта возвращаемого списка
* @param <T> Тип сущности
* @return Сущности возвращаемого списка
* @version Поддерживаемая версия 1.1.0.RELEASE
*/
<T> List<T> query(String sql, Class<T> beanClass);
/**
* Выполняет запрос на основе переданного SQL и возвращает данные в виде списка map
*
* @param sql Пользовательский SQL
* @return Список map структуры данных
* @version Поддерживаемая версия 1.1.0.RELEASE
*/
List<LinkedHashMap<String, Object>> query(String sql);
/**
* Выполняет запрос на основе непустых полей объекта и возвращает результат в виде объекта PageResultCommand
*
* @param t Объект сущности
* @param currentPage Параметр пагинации для определения страницы, по умолчанию 1
* @param pageSize Параметр пагинации для определения количества записей на странице, по умолчанию 10
* @param orderby Параметр пагинации для определения порядка сортировки, структура Map {key(имя поля для сортировки), value(desc/asc)}
* @param <T> Тип сущности
* @return Объект типа PageResultCommand
* @version Поддерживаемая версия 1.1.1.RELEASE
*/
<T> PageResultCommand<T> search(T t, Integer currentPage, Integer pageSize, LinkedHashMap<String, String> orderby);
/**
* Выполняет запрос на основе непустых полей объекта и возвращает результат в виде объекта PageResultCommand
*
* @param t Объект сущности
* @param currentPage Параметр пагинации для определения страницы, по умолчанию 1
* @param pageSize Параметр пагинации для определения количества записей на странице, по умолчанию 10
* @param orderby Параметр пагинации для определения порядка сортировки, структура Map {key(имя поля для сортировки), value(desc/asc)}
* @param <T> Тип сущности
* @return Объект типа PageResultCommand
* @version Поддерживаемая версия 1.1.1.RELEASE
*/ * @param <T> Тип объекта сущности
* @return Объект типа PageResultCommand
* @version Поддерживаемая версия 1.1.1.RELEASE
*/
<T> PageResultCommand<T> search(T t);
#### Версия A.C.Table для автоматического создания таблиц в mybatis
Версия исправляет ошибку, возникающую при изменении первичного ключа и его типа (версия 1.0.1)
Версия исправляет проблему создания полей родительского класса при создании модели (версия 1.0.1)
Версия добавляет поддержку уникальных ограничений (версия 1.0.1)
Отделена от исходного фреймворка и поддерживает использование в любом структурированном фреймворке spring+mybatis (версия 1.0.1)
Вновь объявляется, что A.C.Table поддерживает только базу данных MySQL (версия 1.0.1)
Исправлена проблема запуска при наличии таблиц с одинаковыми именами в разных базах данных (версия 1.0.2)
Исправлена проблема отсутствия данных при выполнении общего запроса, если имя свойства модели не совпадает с именем поля таблицы (версия 1.0.2)
Улучшена оптимизация публичных методов CUDR, успешное сохранение возвращает id, при выполнении запроса query можно устанавливать параметры для пагинации (pageSize: int, количество элементов на странице, currentPage: int, текущая страница, start: int, начальный элемент, orderField: string, поле для сортировки, sortStr: string, тип сортировки (desc, asc)) (версия 1.0.3)9. Добавлена поддержка типов данных longtext
и mediumtext
в MySQL, улучшена оптимизация публичных методов CUDR, метод query
был переименован в search
. Текущий метод query
поддерживает динамическое выполнение SQL-запросов. Поле orderField
поддерживает сортировку только по одному полю, новое поле orderBy
поддерживает сортировку по нескольким полям. Тип данных LinkedHashMap<String, String>
, упорядоченный, ключ — имя поля, значение — тип сортировки (версия 1.0.4)
Добавлена поддержка пяти типов данных в MySQL (timestamp/time/date/float/bit) (версия 1.0.5)
Добавлена поддержка фреймворка Spring Boot (версия 1.0.5)
Удалена реализация уникального ограничения в @Column
в старых версиях (версия 1.0.6.RELEASE)
Добавлен новый способ реализации уникального ограничения @Unique
, поддерживающий объединение нескольких полей для уникального ограничения (версия 1.0.6.RELEASE)
Добавлен новый способ создания индексов @Index
, поддерживающий объединение нескольких полей для создания индексов (версия 1.0.6.RELEASE)
Исправлен баг в методе query
, который не возвращал данные родительских полей (версия 1.0.6.RELEASE)
Исправлен баг, связанный с изменением типа данных поля, которое является первичным ключом, что приводило к ошибке multiple primary key defined (например, id: int(11)
, изменено на int(10)
, что приводило к повторению этого бага) (версия 1.0.7.RELEASE)17. Добавлена поддержка комментариев к полям, используя свойство comment в @Column (версия 1.0.7.RELEASE)
Исправлен баг issues/IZ6WQ: не удалось установить значение по умолчанию для типа данных bit, значение по умолчанию может быть 0, 1, true, false (версия 1.0.8.1.RELEASE)
Исправлен баг issues/IYTJ1: при использовании @Unique для объединения ограничений, при автоматическом создании структуры таблицы при запуске проекта, удаление объединения ограничений приводило к ошибке (версия 1.0.8.1.RELEASE)
Итерация issues/IYW9F: поддержка сканирования нескольких пакетов mybatis.model.pack, разделенных запятыми или точками с запятой (версия 1.0.8.1.RELEASE)
Исправлен баг issues/I160LP: исправлена ошибка в написании команды drop (версия 1.0.9.RELEASE)
Улучшена логика создания индексов и уникальных ограничений с помощью @Index и @Unique, по умолчанию добавляются префиксы actable_idx_ и actable_uni_ для индексов и уникальных ограничений соответственно, что облегчает обновление и удаление только этих префиксов, избегая удаления индексов и ограничений, созданных вручную (версия 1.0.9.RELEASE)23. Исправление проблем issues/I16OZQ: исправление ошибки при использовании @Index, @Unique без указания полей индекса, а только имени индекса (версия 1.0.9.RELEASE)
Итерация issues/I1IF5E: добавление поддержки типов данных tinyint/smallint/mediumint/year/blob/longblob/mediumblob/tinytext/tinyblob/binary (версия 1.0.9.RELEASE)
Итерация issues/I1IF5Q: добавление режима add в фреймворк, который поддерживает только добавление таблиц, полей, индексов и уникальных ограничений, без возможности изменения или удаления (версия 1.0.9.RELEASE)
Итерация issues/I193FC: свойство name у @Column сделано необязательным, при отсутствии значения используется имя свойства как имя столбца (версия 1.0.9.RELEASE)
Итерация issues/I193FC: свойство type у @Column сделано необязательным, при отсутствии значения используется тип данных свойства для преобразования, не преобразуемые поля не добавляются (версия 1.0.9.RELEASE) Поддержка преобразования типов Java в типы MySQL: java.lang.String java.lang.Long java.lang.Integer java.lang.Boolean java.math.BigInteger java.lang.Float java.lang.Double java.math.BigDecimal java.sql.Date java.util.Date java.sql.Timestamp java.sql.Time В данной итерации до версии 1.0.9.RELEASE значительно упрощена сложность использования аннотаций, при сохранении возможности сложной настройки, добавлены дополнительные возможности по умолчанию То есть, для аннотации @Column, если нет требований к названию полей, можно использовать аннотацию без указания типа и других параметров, и она будет использоваться по умолчанию для преобразования типов, указанных выше.
Итерация issues/I1ILS6: свойства @IsKey/@IsAutoIncrement/@IsNotNull заменены на свойства isKey/isAutoIncrement/isNull в @Column; конечно, старый способ конфигурации всё ещё поддерживается (версия 1.0.9.RELEASE).
Экстренное исправление проблемы версии 1.0.9.RELEASE CUDR, пожалуйста, не используйте версию 1.0.9.RELEASE (версия 1.0.9.1.RELEASE).
Итерация issues/I1IVXK: устаревший класс BaseMysqlCRUDManager, новый класс BaseCRUDManager, который позволяет использовать произвольные типы данных для первичного ключа (версия 1.1.0.RELEASE). Список методов нового класса BaseCRUDManager: List select(T t); T selectByPrimaryKey(T t); List selectAll(Class clasz); int selectCount(T t); T selectOne(T t); Подробное описание интерфейсов находится в конце документа.
Итерация issues/I1JC91: добавлена поддержка пагинации в инструментальный класс BaseCRUDManager, добавлены два метода поиска, один из которых принимает объект, содержащий поля пагинации, а другой — передает поля пагинации через параметры метода (версия 1.1.1.RELEASE). Список добавленных методов инструментального класса BaseCRUDManager представлен ниже, подробное описание интерфейсов находится в конце документа: PageResultCommand search(T t, Integer currentPage, Integer pageSize, LinkedHashMap<String, String> orderby); PageResultCommand search(T t);
При создании таблицы, если аннотация @Column не содержит имя поля, по умолчанию будет использоваться имя свойства, которое будет преобразовано в нижний регистр по правилам camelCase, например, loginName будет преобразован в login_name. Если имя свойства уже находится в нижнем регистре, оно будет использоваться как имя поля. Если имя поля указано в аннотации Column(name="LOGIN_NAME"), оно будет преобразовано в нижний регистр, то есть login_name. Таким образом, все имена полей будут преобразованы в нижний регистр (версия 1.2.0.RELEASE, этот выпуск не совместим с проектами, использующими имена полей в верхнем регистре, обновление до этой версии требует осторожности).
Исправлен баг, связанный с ошибкой при изменении имени поля после завершения создания индексного ограничения (версия 1.2.0.RELEASE, этот выпуск не совместим с проектами, использующими имена полей в верхнем регистре, обновление до этой версии требует осторожности).
Чтобы предотвратить неоднозначность конфигурационных данных (версия 1.2.0.RELEASE, этот выпуск не совместим с проектами, использующими имена полей в верхнем регистре, обновление до этой версии требует осторожности), mybatis.table.auto изменено на actable.table.auto mybatis.model.pack изменено на actable.model.pack mybatis.database.type изменено на actable.database.type 35.Исправлен баг, связанный с отсутствием чтения информации о полях из наследуемых классов при создании таблицы (версия 1.2.0.RELEASE, этот выпуск несовместим с проектами, использующими имена полей в верхнем регистре, обновление до этой версии требует осторожности). Итерация issues/I1LUAZ: исправление полей сущностей с несколькими заглавными буквами, конвертация в имена столбцов, конвертация только первого подчеркивания, добавление поддержки преобразования в формат CamelCase для аннотации @Table (если имя таблицы не указано, используется имя класса в формате CamelCase) (версия 1.2.1.RELEASE)
Поддержка использования аннотаций javax.persistence Column/Table/Id и т. д. для генерации и обновления таблиц (версия 1.3.0.RELEASE) javax.persistence.Column = com.gitee.sunchenbin.mybatis.actable.annotation.Column javax.persistence.Column.name = com.gitee.sunchenbin.mybatis.actable.annotation.Column.name javax.persistence.Column.length = com.gitee.sunchenbin.mybatis.actable.annotation.Column.length javax.persistence.Column.scale = com.gitee.sunchenbin.mybatis.actable.annotation.Column.decimalLength javax.persistence.Table = com.gitee.sunchenbin.mybatis.actable.annotation.Table javax.persistence.Id = com.gitee.sunchenbin.mybatis.actable.annotation.IsKey
Введение поддержки tk.mybatis для удобства более гибкого CUDR (только для использования аннотаций javax.persistence Column/Table/Id и т. д., если используются аннотации actable, поддерживается только BaseCRUDManager) (версия 1.3.0.RELEASE)
Добавление поддержки типа данных json (версия 1.3.0.RELEASE) 40.Добавление аннотации @ColumnComment для комментариев к полям, заменяет комментарий в аннотации @Column (версия 1.3.0.RELEASE)
Добавление аннотации @DefaultValue для значений по умолчанию полей, заменяет defaultValue в аннотации @Column (версия 1.3.0.RELEASE)
Добавление аннотации @ColumnType для типа полей, заменяет type в аннотации @Column, значения берутся из перечисления MySqlTypeConstant (версия 1.3.0.RELEASE)
Добавление аннотации @TableComment для конфигурации комментариев таблиц, заменяет комментарий в аннотации @Table (версия 1.3.0.RELEASE)
Итерация issues/I24UU4: добавление аннотации @TableCharset для конфигурации кодировки таблиц, заменяет charset в аннотации @Table, значения берутся из перечисления MySqlCharsetConstant (версия 1.3.1.RELEASE)
Добавление аннотации @TableEngine для конфигурации движка таблиц, заменяет engine в аннотации @Table, значения берутся из перечисления MySqlEngineConstant (версия 1.3.1.RELEASE)
Удаление стандартной зависимости tk.mybatis из конфигурации pom для избежания конфликтов с другими фреймворками, если требуется использование, добавьте зависимость самостоятельно, если добавлена зависимость tk.mybatis из pom, actable полностью совместима (версия 1.3.2.RELEASE)
Исправление ошибки, когда задано значение по умолчанию для типа данных bit, при запуске будет постоянно выводиться лог об изменении этого поля (версия 1.4.0.RELEASE, эта версия не совместима вниз, требуется небольшое изменение кода, осторожно обновляйтесь) 48. Исправление ошибки, когда используется стандартный тип поля, теперь можно настроить длину с помощью атрибутов length и decimalLength в аннотации @Column (версия 1.4.0.RELEASE, эта версия не обратно совместима и требует небольших изменений в коде, осторожно при обновлении)
В аннотации @ColumnType добавлены два атрибута length и decimalLength для настройки длины типа (версия 1.4.0.RELEASE, эта версия не обратно совместима и требует небольших изменений в коде, осторожно при обновлении)
Улучшена аннотация @Column для поля type и аннотация @ColumnType для поля value, тип изменен с String на перечисление, перечисление - MySqlTypeConstant (версия 1.4.0.RELEASE, эта версия не обратно совместима и требует небольших изменений в коде, осторожно при обновлении)
Улучшена аннотация @TableCharset для поля value и аннотация @TableEngine для поля value, тип изменен с String на перечисление, перечисление - MySqlCharsetConstant и MySqlEngineConstant (версия 1.4.0.RELEASE, эта версия не обратно совместима и требует небольших изменений в коде, осторожно при обновлении)
Исправлена ошибка, когда id имеет тип Long, и возникает ошибка при использовании методов сохранения и обновления в BaseCRUDManagerImpl (версия 1.4.0.RELEASE, эта версия не обратно совместима и требует небольших изменений в коде, осторожно при обновлении)
Улучшена поддержка mybatis-plus для более гибкого управления CUDR, поддерживается три аннотации: @TableName/@TableField/@TableId (версия 1.4.0.RELEASE, эта версия не обратно совместима и требует небольших изменений в коде, осторожно при обновлении)RELEASE. Эта версия не обратно совместима и требует небольших изменений в коде. Осторожно при обновлении.
Удалены аннотации @LengthCount и @LengthDefault (версия 1. 4. 0. RELEASE, эта версия не обратно совместима и требует небольших изменений в коде. Осторожно при обновлении).
issues/I28XQY: добавлена поддержка преобразования данных типа LocalDateTime/LocalDate/LocalTime в Java (версия 1. 4. 1. RELEASE).
Исправлена поддержка установки длины десятичной части для типов DOUBLE и FLOAT (версия 1. 4. 1. RELEASE).
В аннотации Table добавлен атрибут isSimple, указывающий на использование простого режима конфигурации, если включен, свойства объекта могут не иметь аннотации @Column и будут преобразованы в поля с использованием стандартного правила преобразования CamelCase, значение по умолчанию - false (версия 1. 4. 1. RELEASE).
В аннотации Table добавлен атрибут excludeFields для указания на исключение определенных свойств из процесса создания таблицы (версия 1. 4. 1. RELEASE).
Проверка на наличие дублирующихся имен таблиц в классах-сущностях, если такие имена найдены, выбрасывается исключение (версия 1. 4. 1. RELEASE).
issues/I2BL9O: добавлена поддержка типа данных Short, удалена поддержка типа данных byte (версия 1. 4. 2. RELEASE).
Исправлена ошибка, когда аннотации @TableEngine и @TableCharset не работают (версия 1. 4. 3. RELEASE).
Исправлена ошибка, когда аннотация @Column.isnull() и @javax.persistence.Column.nullable() не работают (версия 1. 4. 4. RELEASE). 63.Исправление ошибки, по умолчанию для типов данных float и double количество знаков после запятой равно 2, если явно указать 0, то это не срабатывает. После исправления количество знаков по умолчанию равно 0, а явно указанные значения учитываются (версия 1. 4. 5. RELEASE)
issues/I2DU0K, оптимизация дефолтных значений, ранее не удавалось задать дефолтные значения для некоторых специальных типов данных, например CURRENT_TIMESTAMP. Теперь это поддерживается, и значение будет определяться в зависимости от типа поля. В настоящее время для String и Boolean используются строки вида '#{}', а для остальных типов данных используется оригинальный синтаксис, например '${}' (версия 1. 4. 6. RELEASE)
Добавлен аннотация @IsNativeDefValue, значение которой может быть true или false. На основе предыдущего обновления 64, система автоматически определяет, использовать ли оригинальное значение как дефолтное. Эта аннотация позволяет вручную задать значение, что добавляет гибкость (версия 1. 4. 7. RELEASE)
Добавлены два параметра конфигурации, которые позволяют задать префиксы для сгенерированных индексов и уникальных ограничений. Если префиксы не заданы, используются значения по умолчанию actable_idx_ и actable_uni_ actable.index.prefix=свой префикс для индекса actable.unique.prefix=свой префикс для уникального ограничения 67.Если имя поля содержит символ ` (кавычка), оно будет игнорироваться по умолчанию, так как actable автоматически добавляет этот символ ко всем именам полей при создании таблицы. Это сделано для предотвращения ситуации, когда имя поля является ключевым словом базы данных (версия 1.4.8.RELEASE).
Исправление ошибки с использованием пользовательских префиксов для индексов и уникальных ограничений (версия 1.4.8.RELEASE).
SysMysqlCreateTableManagerImpl.getAllFields метод изменен на public, чтобы его можно было переопределять (версия 1.4.9.RELEASE).
issues/I38G7Q: исправление ошибки, связанной с созданием дубликатов полей при переопределении свойств родительского класса в дочернем классе (версия 1.4.9.RELEASE).
issues/I2CVCS: улучшение поддержки конфигурации actable.model.pack для поддержки размытого поиска, поддерживаются пути вида com.bz.**.entity, а также поддерживается указание нескольких путей через запятую или точку с запятой (версия 1.4.9.RELEASE).
Добавлена аннотация @EnableTimeSuffix, которая позволяет добавлять временной суффикс к имени таблицы (версия 1.5.0.RELEASE).
issues/I3PRVK: добавлена аннотация @IgnoreUpdate, которая позволяет указать, что поле участвует в создании таблицы, но не участвует в обновлении. Это решает проблему, когда поле обновляется при каждом перезапуске проекта при использовании аннотации @DefaultValue("NULL ON UPDATE CURRENT_TIMESTAMP") (версия 1.5.0.RELEASE). issues/I3NGD2: добавлена аннотация @IgnoreTable, которая позволяет указать, что определенная модель не участвует в создании таблицы (версия 1.5.0.RELEASE)
issues/I3TNMB: исправление ошибки, связанной с использованием плагина многопользовательской системы в mybatisplus и использованием аннотации @ColumnComment (версия 1.5.0.RELEASE)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )