SmartJdbc: лёгкий ORM-фреймворк
1. Введение
SmartJdbc — это простой в использовании ORM-фреймворк, который поддерживает построение SQL, выполнение SQL, привязку именованных параметров, автоматическое сопоставление результатов запросов и автоматическое объединение таблиц.
Не нужно писать DAO, не нужно писать SQL, не нужно писать XML.
2. Начало работы
Чтобы использовать 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. Особенности
4. Примеры
Создаём таблицу 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);
Помимо основных типов данных, которые будут автоматически сопоставлены, сложные типы данных 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",
}
Запрос пользователей с именем, содержащим «王»:
//запрос пользователей с именем, содержащим '王'
List<User> list=dao.getList(User.class, QueryWhere.create().where("name",SqlOperator.LIKE,"王"));
System.out.println(DumpUtil.dump(list));
Расширяем класс 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;
}
Запрос пользователя с именем «张三»:
/**запрос пользователя с именем '张三'*/
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;
}
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
— псевдоним главной таблицы.
@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 )