В соответствии с принципом «не изобретай велосипед», универсальный слой доступа к данным реализован на основе ORM-фреймворков, таких как MyBatis, Spring JDBC, Hibernate и MongoDB. Этот слой поддерживает разделение чтения и записи на основе источников данных, автоматическое переключение между основным и резервным серверами, а также перенаправление при возникновении ошибок. Поддерживается простое балансирование нагрузки.
id
, а в NoSQL — _id
.С появлением новых решений, таких как NoSQL, отношение к использованию реляционных баз данных изменилось. Большинство компаний больше не используют реляционные базы данных для работы с большими объемами данных, такими как отчетность. Однако для 90% бизнес-данных требуется только работа с одной таблицей, без необходимости объединения таблиц. Цель данного компонента заключается в том, чтобы автоматизировать эти задачи, что позволяет избежать повторной работы и увеличивает скорость разработки. После внедрения этого компонента нет необходимости использовать MyBatis для генерации SQL, Spring JDBC для написания SQL-запросов или аннотации Hibernate. Компонент берет на себя все эти задачи. Тем не менее, он основан на ORM-фреймворках и выполняет все операции с одной таблицой, поэтому он не заменяет работу ORM. Это решение может быть применено как к новым, так и к старым проектам без влияния на текущие бизнес-процессы. Он просто упрощает работу, позволяя избавиться от множества DAO-классов и сосредоточиться на необходимых сервисах. Компонент следует определенным правилам COC, поэтому существуют некоторые ограничения на использование, которые следует учитывать.
## Maven
Для скачивания последней версии перейдите на страницу релизов: http://git.oschina.net/uncode/uncode-dal-all/releases
<dependency>
<groupId>cn.uncode</groupId>
<artifactId>uncode-dal</artifactId>
<version>1.0.3</version>
</dependency>
<dependence>
<groupId>cn.uncode</groupId>
<artifactId>uncode-dal-mybatis</artifactId>
<version>1.0.3</version>
</dependence>
<dependence>
<groupId>cn.uncode</groupId>
<artifactId>uncode-dal</artifactId>
<version>1.0.3</version>
</dependence>
<dependence>
<groupId>cn.uncode</groupId>
<artifactId>uncode-dal-spring-jdbc</artifactId>
<version>1.0.3</version>
</dependence>
<dependence>
<groupId>cn.uncode</groupId>
<artifactId>uncode-dal</artifactId>
<version>1.0.3</version>
</dependence>
<dependence>
<groupId>cn.uncode</groupId>
<artifactId>uncode-dal-mongo</artifactId>
<version>1.0.3</version>
</dependence>
Динамический источник данных может автоматически обрабатывать отказоустойчивое восстановление и обнаружение ошибок. При разделении чтения и записи несколько источников данных используются случайным образом. Кэш можно настроить самостоятельно; он может быть глобально включен или отключен, что удобно для использования в среде разработки. ### 1 Настройка DataSource
Можно использовать любой компонент пула соединений базы данных, рекомендуется использовать Druid. Конфигурирование Fastser-DAL динамического источника данных позволяет автоматически реализовать разделение чтения и записи, автоматическое переключение между основной и резервной системами и отказоустойчивое восстановление. Рекомендовано использование. После использования Fastser-DAL динамического источника данных все ref="dataSource"
в конфигурации Spring JDBC/MyBatis следует заменить на ref="dynamicDataSource"
.
<!-- Необходимо, но не обязательно, конфигурация динамического источника данных -->
<bean id="dynamicDataSource" class="cn.uncode.dal.datasource.DynamicDataSource">
<!-- Конфигурация источника данных для чтения, используется для операций чтения, текущий механизм балансировки нагрузки — случайное получение одного источника -->
<property name="slaveDataSources">
<map key-type="java.lang.String">
<entry key="readDataSourceOne" value-ref="dataSource3"/>
<entry key="readDataSourceTwo" value-ref="dataSource4"/>
</map>
</property>
<!-- Конфигурация основного источника данных -->
<property name="masterDataSource" ref="dataSource1" />
<!-- Конфигурация резервного источника данных -->
<property name="standbyDataSource" ref="dataSource2" />
</bean>
<!-- Необходимо при использовании динамического источника данных для разделения чтения и записи -->
<!-- Опционально, конфигурация глобального использования кэша, значение по умолчанию true -->
<property name="useCache" value="false" />
<!-- Опционально, оптимистическая блокировка, если указано это свойство и существует поле с названием ver, то таблица может использовать механизм оптимистической блокировки -->
<property name="version" value="ver" />
``` ```markdown ### 4 Конфигурация реализации MongoDB
<bean id="dalCache" class="cn.uncode.dal.cache.impl.ConcurrentMapCache"/>
<bean id="cacheManager" class="cn.uncode.dal.cache.support.SimpleCacheManager">
<property name="cache" ref="dalCache"/>
</bean>
<bean id="mongoDataBase" class="cn.uncode.dal.mongo.MongoDataBase">
<property name="host" value="172.16.30.98"/>
<property name="port" value="27017"/>
<property name="db" value="test"/>
<property name="username" value="xiaocong"/>
<property name="password" value="xiaocong"/>
</bean>
<bean id="mongoDAL" class="cn.uncode.dal.mongo.MongoDAL">
<property name="database" ref="mongoDataBase"/>
<!-- Опциональная конфигурация глобального использования кэша, значение по умолчанию true -->
<property name="useCache" value="false"/>
</bean>
Этот компонент обрабатывает все операции с одной таблицей. Для сложных операций, таких как связывание нескольких таблиц, рекомендуется использовать нативные фреймворки, чтобы обеспечить выполнение всех требуемых функций при повышении производительности разработки и снижении затрат.
```java
JdbcTemplate jdbcTemplate = (JdbcTemplate) baseDAL.getTemplate();
```### 2 MyBatis
```xml
<!-- Измените конфигурацию SqlSessionFactory следующим образом -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis.xml"/>
<property name="mapperLocations" value="classpath:/cn/uncode/mapper/*Mapper.xml"/>
</bean>
<!-- Настройте сканирование Dao -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.uncode.mapper"/>
</bean>
MongoDB mongoDB = (MongoDB) baseDAL.getTemplate();
fields
— поля для отображения, queryCriteria
— условия запроса, seconds
— время кэширования.
QueryResult selectByCriteria(List<String> fields, QueryCriteria queryCriteria);
QueryResult selectByCriteria(String[] fields, QueryCriteria queryCriteria);
QueryResult selectByCriteria(List<String> fields, QueryCriteria queryCriteria, int seconds);
QueryResult selectByCriteria(String[] fields, QueryCriteria queryCriteria, int seconds);
QueryResult selectByCriteria(QueryCriteria queryCriteria);
QueryResult selectByCriteria(QueryCriteria queryCriteria, int seconds);
QueryResult selectPageByCriteria(List<String> fields, QueryCriteria queryCriteria);
QueryResult selectPageByCriteria(String[] fields, QueryCriteria queryCriteria);
QueryResult selectPageByCriteria(List<String> fields, QueryCriteria queryCriteria, int seconds);
QueryResult selectPageByCriteria(String[] fields, QueryCriteria queryCriteria, int seconds);
QueryResult selectPageByCriteria(QueryCriteria queryCriteria);
QueryResult selectPageByCriteria(QueryCriteria queryCriteria, int seconds);
queryCriteria
— условия запроса, seconds
— время кэширования.
int countByCriteria(QueryCriteria queryCriteria);
int countByCriteria(QueryCriteria queryCriteria, int seconds);
```### 3 Поиск по первичному ключу
`obj` — объект с первичным ключом, `fields` — поля для отображения, `queryCriteria` — условия запроса, `seconds` — время кэширования, `clazz` — тип экземпляра объекта, `id` — первичный ключ объекта.```java
QueryResult selectByPrimaryKey(Object obj);
QueryResult selectByPrimaryKey(Object obj, int seconds);
Объект с первичным ключом
Object insert(Object obj);
Object insert(String table, Map<String, Object> obj);
Object insert(String database, String table, Map<String, Object> obj);
void asynInsert(Object obj);
void asynInsert(String table, Map<String, Object> obj);
void asynInsert(String database, String table, Map<String, Object> obj);
Объект с первичным ключом, query_criteria — условие запроса
int updateByCriteria(Object obj, QueryCriteria query_criteria);
int updateByPrimaryKey(Object obj);
int updateByPrimaryKey(String table, Map<String, Object> obj);
int updateByPrimaryKey(String database, String table, Map<String, Object> obj);
Объект с первичным ключом, query_criteria — условие запроса, clazz — тип объекта, id — первичный ключ объекта
int deleteByPrimaryKey(Object obj);
int deleteByPrimaryKey(String table, Map<String, Object> obj);
int deleteByPrimaryKey(Class<?> clazz, Object id);
int deleteByPrimaryKey(String table, Object id);
int deleteByPrimaryKey(String database, String table, Object id);
int deleteByCriteria(QueryCriteria query_criteria);
database — имя базы данных, table_name — имя таблицы
void reloadTable(String table_name);
void clearCache(String table_name);
void reloadTable(String database, String table_name);
void clearCache(String database, String table_name);
setOrderByClause(String orderByClause)
//Удаление повторений
setDistinct(boolean distinct)
//Запрос одной записи
setSelectOne(boolean selectOne)
//Размер страницы, первая страница - 1
setPageSize(int pageSize)
//Установка имени таблицы
setTable(String table)
//Установка имени базы данных, обычно это не требуется
setDatabase(String database)
//Установка версии при использовании оптимистичной блокировки, используется только для операций обновления
setVersion(Object version)
//Установка имени таблицы на основе типа DTO объекта, в этом случае имя класса DTO должно совпадать с именем таблицы
setTable(Class<?> clazz)### 9 Методы Criteria
Criteria append(Condition condition, String field, Object value)
Criteria append(String field, Object value)
Criteria append(String sql)
andColumnIsNull(String column)
andColumnIsNotNull(String column)
andColumnEqualTo(String column, Object value)
andColumnNotEqualTo(String column, Object value)
andColumnGreaterThan(String column, Object value)
andColumnGreaterThanOrEqualTo(String column, Object value)
andColumnLessThan(String column, Object value)
andColumnLessThanOrEqualTo(String column, Object value)
andColumnIn(String column, List<Object> values)
andColumnNotIn(String column, List<Object> values)
andColumnLike(String column, Object value)
andColumnNotLike(String column, Object value)
andColumnBetween(String column, Object value1, Object value2)
andColumnNotBetween(String column, Object value1, Object value2)
Map<String, Object> get()
// Получение одной строки данных в виде map, замена полей на псевдонимы
Map<String, Object> getWithAliasName(Map<String, String> aliasName)
// Получение одной строки данных в виде map, скрытие ненужных полей
Map<String, Object> get(List<String> hiddenFields)
// Получение одной строки данных в виде map, скрытие ненужных полей и замена полей на псевдонимы
Map<String, Object> getWithAliasName(List<String> hiddenFields, Map<String, String> aliasName)
// Получение нескольких строк данных в виде списка
List<Map<String, Object>> getList()
// Получение списка записей с возможностью скрытия ненужных полей
List<Map<String, Object>> getList(List<String> скрытые_поля)
// Получение списка записей с заменой полей на псевдонимы
List<Map<String, Object>> getList(Map<String, String> псевдонимы)
// Получение списка записей с скрытием ненужных полей и заменой полей на псевдонимы
List<Map<String, Object>> getList(List<String> скрытые_поля, Map<String, String> псевдонимы)
// Преобразование одной записи в объект
<T> T какОбъект(Class<T> типКласса)
// Преобразование нескольких записей в объекты
<T> List<T> какСписокОбъектов(Class<T> типКласса)
// Получение информации о пагинации
Map<String, Object> получитьСтраницу()
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT NULL COMMENT 'Имя пользователя',
`pwd` VARCHAR(50) DEFAULT NULL -- Пароль
);
`email` varchar(30) DEFAULT NULL 'Электронная почта',
`status` int(11) DEFAULT '0' COMMENT '1 - активен, 0 - заблокирован',
`age` int(11) DEFAULT NULL 'Возраст',
PRIMARY KEY (`id`),
UNIQUE KEY `unique_user_userName` (`userName`)
) ENGINE=MyISAM AUTO_INCREMENT=167 DEFAULT CHARSET=utf8;
### 2 Класс User
import java.io.Serializable;
@Table(name="tb_user")
public class User implements Serializable {
private static final long serialVersionUID = 4799201163494761002L;
public static final String ID = "id";
public static final String NAME = "name";
public static final String PWD = "pwd";
public static final String EMAIL = "email";
public static final String STATUS = "status";
public static final String AGE = "age";
private int id;
@Field(name="fd_name")
private String name;
private String pwd;
private String email;
private int status;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
### 3 Внедрение BaseDal
* Аннотация
import cn.uncode.dal.core.BaseDAL;
@Service
public class UserService implements IUserService {
@Autowired
private BaseDAL baseDAL;
...
}
* XML
<bean id="userService" class="cn.uncode.web.service.UserService">
<property name="baseDAL" ref="baseDAL"></property>
Map<String, Object> user = new HashMap<String, Object>();
user.put("id", 1);
// Кэширование на 20 секунд
QueryResult result = baseDAL.selectByPrimaryKey(user, 20);
user = result.get();
// Также можно передать DTO объект
User dto = result.as(User.class);
``` ```
// Отображение части полей, без использования кэша
QueryResult result = baseDAL.selectByPrimaryKey(new String[]{"name", "pwd"}, "user", 1, BaseDal.NO_CACHE);
Map<String, Object> user = result.get();
// Без использования DTO объекта, прямое указание имени таблицы
QueryResult result = baseDAL.selectByPrimaryKey("user", 1, BaseDal.NO_CACHE);
Map<String, Object> user = result.get();
// Поиск с составным первичным ключом
QueryCriteria queryCriteria = new QueryCriteria();
queryCriteria.setTable("user");
Criteria criteria = queryCriteria.createCriteria();
criteria.andColumnEqualTo("name", "uncode-dal");
criteria.andColumnEqualTo("pwd", "uncode-dal-mybatis");
queryCriteria.setSelectOne(true);
QueryResult result = baseDAL.selectByCriteria(queryCriteria);
Map<String, Object> user = result.get();
* Пример 1
```java
Map<String, Object> user = new HashMap<String, Object>();
user.put("name", "uncode");
user.put("pwd", "faster");
// Первый аргумент — имя таблицы
int result = baseDAL.insert("user", user);
```* Обновление данных
* Пример 1
```java
Map<String, Object> user = new HashMap<String, Object>();
user.put("name", "uncode-dal-mybatis");
user.setName("uncode-dal-mybatis");
QueryCriteria queryCriteria = new QueryCriteria();
queryCriteria.setTable("user");
Criteria criteria = queryCriteria.createCriteria();
criteria.andColumnEqualTo("name", "uncode");
int result = baseDAL.updateByCriteria(user, queryCriteria);
```
* Пример 2
```java
Map<String, Object> user = new HashMap<String, Object>();
user.put("email", "ywj_316@qq.com");
user.put("id", 1);
// Первый аргумент — имя таблицы, в user должны быть все первичные ключевые поля
int result = baseDAL.updateByPrimaryKey("user", user);
```
* Пример 3
```java
Map<String, Object> user = new HashMap<String, Object>();
// Устанавливаем значение как null
user.put("email", null);
user.put("id", 1);
// Первый аргумент — это имя таблицы, в user должны присутствовать все первичные ключи
int result = baseDAL.updateByPrimaryKey("user", user);
```
* Пример 4
```java
Map<String, Object> user = new HashMap<String, Object>();
// Устанавливаем значение с помощью функции
user.put("email", "=concat('11','22')");
user.put("age", "=age+1");
user.put("id", 1);
// Первый аргумент — это имя таблицы, в user должны присутствовать все первичные ключи
int result = baseDAL.updateByPrimaryKey("user", user);
```
* Удаление
* Пример 1
```java
Map<String, Object> user = new HashMap<String, Object>();
user.put("email", "ywj_316@qq.com");
user.put("id", 1);
// В user должны присутствовать все первичные ключи
int result = baseDAL.deleteByPrimaryKey("user", user);
```
* Пример 2
```java
// Первым аргументом является имя таблицы
int result = baseDAL.deleteByPrimaryKey("user", 165);
```
* Пример 3
```java
// Первым аргументом является имя таблицы
int result = baseDAL.deleteByPrimaryKey("user", 165);
``` QueryCriteria queryCriteria = new QueryCriteria();
queryCriteria.setTable("user");
Criteria criteria = queryCriteria.createCriteria();
criteria.andColumnEqualTo("name", "uncode");
int result = baseDAL.deleteByCriteria(queryCriteria);
* Другие операции
* Пример 1
QueryCriteria queryCriteria = new QueryCriteria();
queryCriteria.setTable("user");
Criteria criteria = queryCriteria.createCriteria();
criteria.andColumnGreaterThan("age", 18);
criteria.andColumnEqualTo("status", 1);
// Подсчет количества записей
int result = baseDAL.countByCriteria(queryCriteria);
### 5 Пример использования DTO
* Поиск списков
* Пример 1
// Создание объекта запроса
QueryCriteria queryCriteria = new QueryCriteria();
// Установка имени таблицы, при этом имя класса должно совпадать с именем таблицы
queryCriteria.setTable(User.class);
// Создание объекта условий
Criteria criteria = queryCriteria.createCriteria();
// Установка условий
criteria.append(Condition.GREATER_THAN, "age", 18).append("status", 1);
// Запрос всех полей и кэширование
QueryResult result = baseDAL.selectByCriteria(queryCriteria);
// Запрос части полей без кэширования
QueryResult result = baseDAL.selectByCriteria(new String[]{"name", "pwd"}, queryCriteria, BaseDal.NO_CACHE);
List<User> users = result.asList(User.class); * Пример 2
// Создание объекта запроса
QueryCriteria queryCriteria = new QueryCriteria();
// Установка таблицы запроса, при этом имя класса должно совпадать с именем таблицы
queryCriteria.setTable(User.class);
// Установка пагинации
queryCriteria.setPageIndex(1);
queryCriteria.setPageSize(20);
// Установка сортировки
queryCriteria.setOrderByClause(User.AGE + " desc");
// Пагинированный запрос с кэшированием на 60 секунд
QueryResult result = baseDAL.selectPageByCriteria(queryCriteria, 60);
List<User> users = result.asList(User.class);
Map<String, Object> page = result.getPage();
Запрос по первичному ключу * Пример 1 User user = new User(); user.setId(1); // Кэширование на 20 секунд, все поля первичного ключа должны быть установлены QueryResult result = baseDAL.selectByPrimaryKey(user, 20); user = result.as(User.class);
Пример 2 // Отображение части полей, без использования кэша QueryResult result = baseDAL.selectByPrimaryKey(new String[]{"name", "pwd"}, User.class, 1, BaseDal.NO_CACHE); User user = result.as(User.class);
Пример 3 // Для объединенного первичного ключа можно использовать этот способ запроса QueryCriteria queryCriteria = new QueryCriteria(); queryCriteria.setTable(User.class); Criteria criteria = queryCriteria.createCriteria(); criteria.andColumnEqualTo(User.NAME, "uncode-dal"); criteria.andColumnEqualTo(User.PWD, "uncode-dal-mybatis"); queryCriteria.setSelectOne(true); QueryResult result = baseDAL.selectByCriteria(queryCriteria); User user = result.as(User.class);
Вставка
User user = new User();
user.setName("uncode-dal-mybatis");
QueryCriteria queryCriteria = new QueryCriteria();
queryCriteria.setTable(User.class);
Criteria criteria = queryCriteria.createCriteria();
criteria.andColumnEqualTo(User.NAME, "uncode");
int result = baseDAL.updateByCriteria(user, queryCriteria);
User user = new User();
user.setEmail("ywj_316@qq.com");
user.setId(1);
// В объекте user должны быть установлены все первичные ключи
int result = baseDAL.updateByPrimaryKey(user);
Удаление
User user = new User();
user.setId(1);
// В объекте user должны быть установлены все первичные ключи
int result = baseDAL.deleteByPrimaryKey(user);
int result = baseDAL.deleteByPrimaryKey(User.class, 165);
QueryCriteria queryCriteria = new QueryCriteria();
queryCriteria.setTable(User.class);
Criteria criteria = queryCriteria.createCriteria();
criteria.andColumnEqualTo(User.NAME, "uncode");
int result = baseDAL.deleteByCriteria(queryCriteria);
Другие операции
QueryCriteria queryCriteria = new QueryCriteria();
queryCriteria.setTable(User.class);
Criteria criteria = queryCriteria.createCriteria();
criteria.andColumnGreaterThan(User.AGE, 18);
criteria.andColumnEqualTo(User.STATUS, 1);
// Подсчет количества записей
int result = baseDAL.countByCriteria(queryCriteria);
Автор: Янь Вэйцзюнь (ywj_316@qq.com, WeChat: yeweijun) Группа поддержки QQ: 47306892 Copyright © 2013 www.uncode.cn
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )