# dynamic-dao **Repository Path**: haosijiahsj/dynamic-dao ## Basic Information - **Project Name**: dynamic-dao - **Description**: 基于jdbcTemplate开发的注解驱动orm工具包,支持spring和非spring环境使用 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-06-15 - **Last Updated**: 2021-08-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: ORM, JdbcTemplate ## README # dynamic-dao java, simple-orm, reflect ## 概述 基于jdbcTemplate实现的注解驱动的orm框架 ## 配置方式 * 使用注解方式,该方式使用BeanPostProcessor处理,因此在service层使用dao时,需要使用@InjectDao或@DynamicDao进行注入 ```java @Configuration public class DynamicDaoConfig { @Bean public InjectDaoBeanPostProcessor injectDaoBeanPostProcessor() { return new InjectDaoBeanPostProcessor(); } } ``` * 使用注解方式,该方式与sping无缝集成,service层使用dao可直接使用sping的@Autowire进行注入 ```java @Configuration @DynamicDaoScan(value = "com.husj.dynamicdao.dao", dataSourceRef = "dataSource") public class DynamicDaoAutowiredConfig { private static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver"; @Bean public DataSource dataSource() { DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName(DRIVER_CLASS_NAME); druidDataSource.setUrl("jdbc:mysql://localhost:3306/hello-world?characterEncoding=utf-8"); druidDataSource.setUsername("root"); druidDataSource.setPassword("123456"); return druidDataSource; } } ``` * 使用xml方式 ```java ``` * 使用方式 dao层在接口上使用注解@Save @Update @BatchUpdate @Query service层在dao接口字段使用@DynamicDao注解 ## 使用示例 1. @Save * 使用?占位符 ```java @Save("INSERT INTO table_name(column1, column2, column3) VALUES (?, ?, ?)") int save(int column1, int column2, String column3); ``` * 使用具名占位符 ```java @Save("INSERT INTO table_name(column1, column2, column3) VALUES (:1, :2, :3)") int save(Map map); @Save("INSERT INTO table_name(column1, column2, column3) VALUES (:1, :2, :3)") int save(@Param("1") int a, @Param("2") int b, @Param("3") int c); ``` * 返回主键(默认返回成功条数) ```java @Save(value = "INSERT INTO table_name(column1, column2, column3) VALUES (?, ?, ?)", returnKey = true) int save(int column1, int column2, String column3); @Save(value = "INSERT INTO table_name(column1, column2, column3) VALUES (:1, :2, :3)", returnKey = true) int save(Map map); ``` * 实体类使用JPA注解 ```java @Save int save(Entity entity); ``` 2. @Update * 使用?占位符 ```java @Update("UPDATE table_name SET column1 = ?, column2 = ? WHERE id = ?") int update(String column1, String column2, int id); ``` * 使用具名占位符 ```java @Update(value = "UPDATE table_name SET column1 = :2, column2 = :3 WHERE id = :1") int update(Map map); ``` * 实体类使用JPA注解(此方式默认使用实体类中的@id字段作为WHERE条件) ```java @Update int update(Entity entity); ``` 3. @Query * 返回List> ```java @Query("select * from table_name where id = ?") List> query(int id); @Query("select * from table_name where id = :id") List> query(Map map); ``` * 返回值封装到对象中(返回列的名称要与实体类中字段名相同,不区分大小写) ```java @Query("select id, name, sex from table_name where id = ?") List query(int id); @Query("select id, name, sex from table_name where id = :id") List query(Map map); ``` * 动态查询(根据传入map中该值是否是null来决定是否拼接该条件,operator拼接到该条件前面,没有命名占位符的条件会直接拼接) ```java @Query("select id, name, sex from table_name where id = ?") @Conditions({ @Condition(value = "sex = :sex"), @Condition(value = "name LIKE :name", operator = Operator.OR) @Condition(value = "tel IS NOT NULL") }) List query(Map map); ``` * 分页查询(不返回页数条数相关信息) ```java @Query("select id, name, sex from table_name where id = :id") List query(Map paramMap, PageParam pageParam); ``` * 分页查询(返回页数条数相关信息) ```java @Query("select id, name, sex from table_name") @Conditions({ @Condition(value = "sex = :sex"), @Condition(value = "name LIKE :name", operator = Operator.OR) @Condition(value = "tel IS NOT NULL") }) PageWrapper query(Map paramMap, PageParam pageParam); ```