1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/icecooly-SmartJdbc

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

SmartJdbc: лёгкий ORM-фреймворк

1. Введение

SmartJdbc — это простой в использовании ORM-фреймворк, который поддерживает построение SQL, выполнение SQL, привязку именованных параметров, автоматическое сопоставление результатов запросов и автоматическое объединение таблиц.

Не нужно писать DAO, не нужно писать SQL, не нужно писать XML.

2. Начало работы

2.1 Установка

Чтобы использовать SmartJdbc, просто поместите файл SmartJdbc-2.0.38.jar в classpath.

Если вы используете Maven для сборки проекта, добавьте следующий код в файл pom.xml:

<dependency>
    <groupId>com.github.icecooly</groupId>
    <artifactId>smartjdbc</artifactId>
    <version>2.0.38</version>
</dependency>
<dependency>
    <groupId>com.github.icecooly</groupId>
    <artifactId>smartJdbc-spring</artifactId>
    <version>2.0.0</version>
</dependency>

Если вы используете Gradle для сборки проекта, добавьте следующий код в блок dependencies файла build.gradle:

compile 'com.github.icecooly:smartjdbc:2.0.38'
compile 'com.github.icecooly:smartjdbc-spring:2.0.0'

3. Особенности

  • Мощные операции CRUD.
  • Поддержка автоматического объединения таблиц без необходимости написания SQL.
  • Помимо автоматического сопоставления основных типов данных, также поддерживается автоматическое сопоставление объектов List, Set и т. д.
  • Поддерживает функции JSON.

4. Примеры

4.1 Простое добавление, удаление и изменение

Создаём таблицу t_user:

CREATE TABLE `t_user` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `user_name` varchar(32) DEFAULT NULL COMMENT '用户名',
  `name` varchar(32) DEFAULT NULL COMMENT '姓名',
  `department_id` int(11) DEFAULT NULL COMMENT '所属部门',
  `role_id_list` varchar(512) DEFAULT NULL COMMENT '角色列表',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Определяем класс User:

@Data
@Entity(tableName = "t_user")
public class User{
    
    @PrimaryKey
    private Long id;
    
    /**姓名*/
    private String name;
    
    /**所属部门*/
    @ForeignKey(entityClass=Department.class)
    private Integer departmentId;
    
    /**角色列表*/
    private List<Integer> roleIdList;
    
    /**创建时间*/
    private Date createTime;
    
    /**更新时间*/
    private Date updateTime;

Добавление:

User user=new User();
user.setName("张三");
user.setDepartmentId(1);
user.setRoleIdList(Arrays.asList(1,2,3));//будет автоматически преобразовано в JSON.toString(roleIdList)
user.setId((long)dao.insert(user));

Изменение:

  • Обновление всех полей:
/**обновление всех полей*/
User user=dao.getById(User.class, 1);
user.setName("张三2");
user.setDepartmentId(2);
user.setMobileNo("130000000000");
dao.update(user);
  • Обновление непустых полей:
/**обновление непустых полей*/
User user=new User();
user.setId(1L);
user.setDepartmentId(3);
user.setMobileNo("130000000000");
dao.updateExcludeNull(user);
  • Обновление определённых полей:

/**обновление определённых полей*/
User user=dao.getById(User.class, 2);
user.setAge(30);
dao.updateIncludeFields(user, "age");


/**с помощью SQL обновляем поля*/
dao.executeUpdate("update t_user set name='王五' where id=?",2);
dao.executeUpdate("update t_user set name='王五' where id=#{id}",
                new SqlParam("id", 2));
    

Удаление:

dao.deleteById(User.class, 1);

4.2 Базовый запрос

Помимо основных типов данных, которые будут автоматически сопоставлены, сложные типы данных List<объект>, Set<объект> и т.д. также могут быть автоматически сопоставлены.

Получаем объект User по идентификатору:

User user=dao.getById(User.class, 1);
User user=dao.getEntity(User.class,QueryWhere.create().where("name", "张三"));
result:{
    "id":1,
    "name":"张三",
    "userName":"zhangsan",
    "roleIdList":[
        1,
        2,
        3
    ],
    "createTime":"2020-04-12 12:08:43",
    "updateTime":"2020-04-25 18:36:19",
}

4.3 Список запросов

Запрос пользователей с именем, содержащим «王»:

//запрос пользователей с именем, содержащим '王'
List<User> list=dao.getList(User.class, QueryWhere.create().where("name",SqlOperator.LIKE,"王"));
System.out.println(DumpUtil.dump(list));

4.4 Сложный запрос

Расширяем класс UserQuery:

@Data
public class UserQuery extends Query<User>{

    @QueryField
    private String userName;
    
    @QueryField
    private Integer gender;
    
    @QueryField(field ="status",operator=SqlOperator.IN)
    private List<Integer> statusInList;
    
    @QueryField(foreignKeyFields="departmentId",field="name",operator=SqlOperator.LIKE)
    private String departmentName;
}

4.4.1 Операторы where: eq, ne, lt, le, gt, ge

Запрос пользователя с именем «张三»:

/**запрос пользователя с именем '张三'*/
dao.getEntity(User.class,QueryWhere.create().eq("name", "张三"));

/**запрос пользователя с именем не '张三'*/
dao.getEntity(User.class,QueryWhere.create().ne("name", "张сан"));

/**запрос пользователей младше 25 лет*/
dao.getEntity(User.class,QueryWhere.create().lt("age", 25));

/**запрос пользователей моложе 25 лет или равных 25 годам*/
dao.getEntity(User.class,QueryWhere.create().le("age", 25));

/**запрос пользователей старше 25 лет*/
dao.getEntity(User.class,QueryWhere.create().gt("age", 25)); **4.4.2 where-операторы like**

/*查询姓名包含'张'的用户/ dao.getEntity(User.class, QueryWhere.create().like("name", "��zhang"));

/*查询姓名是以'张'开头的用户/ dao.getEntity(User.class, QueryWhere.create().likeLeft("name", "zhang"));

/*查询姓名是以'张'结尾的用户/ dao.getEntity(User.class, QueryWhere.create().likeRight("name", "zhang"));

/*查询姓名不包含'张'的用户/ dao.getEntity(User.class, QueryWhere.create().notLike("name", "zhang"));

/*查询姓名不是以'张'开头的用户/ dao.getEntity(User.class, QueryWhere.create().notLikeLeft("name", "zhang"));

/*查询姓名不是以'张'结尾的用户/ dao.getEntity(User.class, QueryWhere.create().notLikeRight("name", "zhang"));


**4.4.3 where-операторы in и not in**

dao.getEntity(User.class, QueryWhere.create().in("status", Arrays.asList(1, 2, 3))); dao.getEntity(User.class, QueryWhere.create().in("status", new int[] {1, 2})); dao.getEntity(User.class, QueryWhere.create().in("status", new byte[] {1, 2})); dao.getEntity(User.class, QueryWhere.create().in("status", new long[] {1, 2}));

dao.getEntity(User.class, QueryWhere.create().in("name", Arrays.asList("张三", "张三2"))); dao.getEntity(User.class, QueryWhere.create().in("name", new String[] {"张三", "张san2"}));

dao.getEntity(User.class, QueryWhere.create().notin("status", Arrays.asList(1, 2, 3))); dao.getEntity(User.class, QueryWhere.create().notin("status", new int[] {1, 2})); dao.getEntity(User.class, QueryWhere.create().notin("status", new byte[] {1, 2})); dao.getEntity(User.class, QueryWhere.create().notin("status", new long[] {1, 2}));

dao.getEntity(User.class, QueryWhere.create().notin("name", Arrays.asList("张三", "张三2"))); dao.getEntity(User.class, QueryWhere.create().notin("name", new String[] {"张三", "张san2"}));


**4.4.4 where-оператор: пользовательское условие**

dao.getEntity(User.class, QueryWhere.create().whereSql("a.name=?","张三"));

dao.getEntity(User.class, QueryWhere.create().whereSql("a.name='张三'"));

dao.getEntity(User.class, QueryWhere.create().whereSql("a.name=#{name}", new SqlParam("name", "张三")));

dao.getEntity(User.class, QueryWhere.create().whereSql("a.name=${name}", new SqlParam("name", "张三")));

dao.getEntity(User.class, QueryWhere.create().whereSql("a.status=${status}", new SqlParam("status", 1)));

dao.getEntity(User.class, QueryWhere.create().whereSql("a.status=${status} or a.name like concat('%',#{name},'%')", new SqlParam("status", 1), new SqlParam("name", "zhang")));

dao.getEntity(User.class, QueryWhere.create().whereSql("a.status in ${status} or a.name like concat('%',#{name},'%')", new SqlParam("status", Arrays.asList(1,2,3)), new SqlParam("name", "zhang")));


**4.4.5 Сортировка и разбиение на страницы**

dao.getEntity(User.class,QueryWhere.create() .orderBy("id asc") .orderBy("name desc") .limit(0, 10));


## 5 Запрос по нескольким таблицам (Query<T> класс)

```java
public class Query<T> {
    //
    public int pageIndex;
    
    public int pageSize;
    
    public LinkedHashMap<String,OrderBy> orderBys;//<javaField,DESC> 
    
    public Map<String,Object> params;
    //
    public static Integer defaultPageSize=20;
}
@Data
public class UserQuery extends Query<User>{
    
    @QueryField(foreignKeyFields = "departmentId",field = "name")
    private String departmentName;
}

5.1 Запрос пользователей из отдела «технический»

UserQuery query=new UserQuery();
query.setDepartmentName("технический");
List<User> list=dao.getList(query);

Запрос эквивалентен следующему SQL-запросу:

inner join  t_department i1 on a.`department_id`=i1.`id`
where i1.`name` =   'технический'   

Здесь a — псевдоним главной таблицы.

5.2 Запрос пользователей, в чьих именах есть слово «технический»

@QueryField(foreignKeyFields = "departmentId",field = "name",operator = SqlOperator.LIKE)
private String likeDepartmentName;

UserQuery query=new UserQuery();
query.setLikeDepartmentName("технический");
List<User> list=dao.getList(query);
``` Этот пример похож на 5.1, единственное отличие  в операторе, заданном через @QueryField. По умолчанию используется EQ, здесь же используется LIKE.

Для более сложных запросов обратитесь к файлу test/QueryTestCase.java.

**6 Spring Boot 中使用 SmartJdbc**

SmartJdbcConfig.java
```java
@Configuration
@EnableTransactionManagement
@AutoConfigureAfter({DataSourceConfig.class})
public class SmartJdbcConfig implements TransactionManagementConfigurer {
    //
    private static final Logger logger = LoggerFactory.getLogger(SmartJdbcConfig.class);
    //
    @Autowired
    private DataSource dataSource;
    //
    @PostConstruct
    public void init() {
        SqlSessionFactory sessionFactory=new SqlSessionFactory();
        sessionFactory.setDataSource(dataSource);
        ConnectionManager.setTransactionManager(sessionFactory);
        Config.addSqlInterceptor(sessionFactory);
    }
    
    @Bean(name="annotationDrivenTransactionManager")
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }
}
  • Другие

проектная главная страница

  • Обновление журнала

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Лёгкий ORM-фреймворк SmartJdbc. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/icecooly-SmartJdbc.git
git@api.gitlife.ru:oschina-mirror/icecooly-SmartJdbc.git
oschina-mirror
icecooly-SmartJdbc
icecooly-SmartJdbc
master