|  | @@ -0,0 +1,312 @@
 | 
	
		
			
				|  |  | +# Elab-db 使用介绍
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +## 更新介绍:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +版本号: 2.0.4.10
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- 新增批量新增功能
 | 
	
		
			
				|  |  | +- 批量修改,参考`IBaseDaoSupport`
 | 
	
		
			
				|  |  | +- 新增SQL检测功能
 | 
	
		
			
				|  |  | +  - join 表超过3张会提示警告。
 | 
	
		
			
				|  |  | +  - union 超过3张会提示警告。
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#### 版本号 : 2.0.4.4
 | 
	
		
			
				|  |  | +- 增加通用的service业务处理
 | 
	
		
			
				|  |  | +	- 接口继承 : ICommonService<?>
 | 
	
		
			
				|  |  | +	- 实现继承 : CommonServiceAdaptor<?>
 | 
	
		
			
				|  |  | +**业务特殊可以通过重写来覆盖**
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- 查询分页结果的时候,可以指定order by
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +pageModel.setOrderby("order by id desc");
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- 如果涉及多个库的增删改查操作如何指定库?
 | 
	
		
			
				|  |  | +**通过catalog来指定,效果是在生成的sql语句中表名会变成 mvp.file 查询**
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +@Table(name = "file",catalog = "mvp")
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +修复若干BUG.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +## 功能描述
 | 
	
		
			
				|  |  | +- 单表的增删改差不需要写单独的SQL
 | 
	
		
			
				|  |  | +- 动态参数通过$指定,但前提是必须要有值
 | 
	
		
			
				|  |  | +- DAO只需要接口,就能够找到对应的sql文件中的sql
 | 
	
		
			
				|  |  | +- 实现基于一对多的关系映射
 | 
	
		
			
				|  |  | +- 参数可以通过对象或者Map的方式指定,SQL文件中的参数可以自由指定,没有限制
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +### 配置
 | 
	
		
			
				|  |  | +基于注解配置:
 | 
	
		
			
				|  |  | +```java
 | 
	
		
			
				|  |  | +@Configuration
 | 
	
		
			
				|  |  | +public class JdbcBeanConfig {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Bean
 | 
	
		
			
				|  |  | +  public JdbcTemplate jdbcTemplate(@Autowired DataSource dataSource) {
 | 
	
		
			
				|  |  | +	 JdbcTemplate jdbcTemplate = new JdbcTemplate();
 | 
	
		
			
				|  |  | +	 jdbcTemplate.setDataSource(dataSource);
 | 
	
		
			
				|  |  | +	 return jdbcTemplate;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Bean
 | 
	
		
			
				|  |  | +  public BasicBaseDao basicBaseDao(@Autowired JdbcTemplate jdbcTemplate) {
 | 
	
		
			
				|  |  | +	 BasicBaseDao basicBaseDao = new BasicBaseDao();
 | 
	
		
			
				|  |  | +	 basicBaseDao.setJdbcTemplate(jdbcTemplate);
 | 
	
		
			
				|  |  | +	 return basicBaseDao;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Bean
 | 
	
		
			
				|  |  | +  public ConfigurableFactory getConfigurableFactory() {
 | 
	
		
			
				|  |  | +	ConfigurableFactory configurableFactory = new ConfigurableFactory();
 | 
	
		
			
				|  |  | +	// 配置文件的文件位置
 | 
	
		
			
				|  |  | +	configurableFactory.setSqlConfigurableLocations("sql");
 | 
	
		
			
				|  |  | +    return configurableFactory;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Bean
 | 
	
		
			
				|  |  | +  public DaoScannerConfigurer daoScannerConfigurer(@Autowired ConfigurableFactory configurableFactory) {
 | 
	
		
			
				|  |  | +	  DaoScannerConfigurer daoScannerConfigurer = new DaoScannerConfigurer();
 | 
	
		
			
				|  |  | +	  // db层要扫描的包
 | 
	
		
			
				|  |  | +	  daoScannerConfigurer.setBasePackage("com.elab.service.business.daos.*");
 | 
	
		
			
				|  |  | +	  // 持久层操作对象
 | 
	
		
			
				|  |  | +	  daoScannerConfigurer.setBasicBaseDaoName("basicBaseDao");
 | 
	
		
			
				|  |  | +	  daoScannerConfigurer.setConfigurableFactory(configurableFactory);
 | 
	
		
			
				|  |  | +	 return daoScannerConfigurer;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +基于配置文件配置:
 | 
	
		
			
				|  |  | +```xml
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
 | 
	
		
			
				|  |  | +        <property name="dataSource" ref="mysqlDataSource"/>
 | 
	
		
			
				|  |  | +    </bean>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    <bean id="basicBaseDao" class="com.elab.core.dao.BasicBaseDao">
 | 
	
		
			
				|  |  | +        <property name="jdbcTemplate" ref="jdbcTemplate"/>
 | 
	
		
			
				|  |  | +    </bean>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    <!-- 构建一个配置工厂 -->
 | 
	
		
			
				|  |  | +    <bean id="configurableFactory" class="com.elab.core.sql.ConfigurableFactory">
 | 
	
		
			
				|  |  | +        <property name="sqlConfigurableLocations" value="sql"/>
 | 
	
		
			
				|  |  | +    </bean>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    <!-- 扫描包 -->
 | 
	
		
			
				|  |  | +    <bean id="daoScannerConfigurer" class="com.elab.core.spring.DaoScannerConfigurer">
 | 
	
		
			
				|  |  | +        <property name="basePackage" value="com.db.service.dao"/>
 | 
	
		
			
				|  |  | +        <property name="basicBaseDaoName" value="basicBaseDao"/>
 | 
	
		
			
				|  |  | +        <property name="configurableFactory" ref="configurableFactory"/>
 | 
	
		
			
				|  |  | +    </bean>
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +### 强制操作
 | 
	
		
			
				|  |  | +#### 接口层
 | 
	
		
			
				|  |  | +1. 必须实现IBaseDaoSupport接口,这样才会受框架的扫描
 | 
	
		
			
				|  |  | +```java
 | 
	
		
			
				|  |  | +// 指定配置文件的前缀路径 , 注意这里的配置文件为test-sql.xml , <TTest>构造参数对应的就是数据库的实体
 | 
	
		
			
				|  |  | +@XmlGroupName("test")
 | 
	
		
			
				|  |  | +public interface ITestDao extends IBaseDaoSupport<TTest> {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   public TTest getTestObject(String id);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   public List getTestList(TTest id);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +2. SQL文件通常放在resources/sql下面
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +SQL文件的规范参考
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +```xml
 | 
	
		
			
				|  |  | +<!-- 这里面的name对应dao的接口层指定的XmlGroupName的值 -->
 | 
	
		
			
				|  |  | +<sqlGroup name="test">
 | 
	
		
			
				|  |  | +    <!-- 对应dao的接口层的方法 -->
 | 
	
		
			
				|  |  | +    <sql id="getTestObject">
 | 
	
		
			
				|  |  | +        select
 | 
	
		
			
				|  |  | +        id
 | 
	
		
			
				|  |  | +        ,username,name,sex,status,created,time,test_id,love_name
 | 
	
		
			
				|  |  | +        from t_test
 | 
	
		
			
				|  |  | +        where
 | 
	
		
			
				|  |  | +        id = :id
 | 
	
		
			
				|  |  | +    </sql>
 | 
	
		
			
				|  |  | +</sqlGroup>
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- 规范类似Mybatis.
 | 
	
		
			
				|  |  | +- 增删改不需要指定,框架会通过语句识别执行sql类型
 | 
	
		
			
				|  |  | +- 简单的增删改查不需要写SQL,复杂的增删改查需要手动写。不用写的sql在IBaseDaoSupport已经写明了。(Mybatis类似)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#### 实体层
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- @Table 指定表名
 | 
	
		
			
				|  |  | +- @Id : 指定主键, 默认以id字段为主键
 | 
	
		
			
				|  |  | +- @Column 当数据库列名和实体属性名不一致时,可以使用该注解指定
 | 
	
		
			
				|  |  | +- @Ignore 忽略当前实体的字段,非数据库字段可以通过这个注解指定
 | 
	
		
			
				|  |  | +- @JoinTable 表关联操作
 | 
	
		
			
				|  |  | +	- schema 对应的sql.xml配置文件中的,sqlGroup的name加上sql的id , 参考test.selectByExample
 | 
	
		
			
				|  |  | +	- joinColumns 关联对象的属性名和数据库列名对应
 | 
	
		
			
				|  |  | +		- name 属性名称
 | 
	
		
			
				|  |  | +		- referencedColumnName  -> sql语句中的条件名称
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +参考实体 : **这里的一对多关系会根据你的属性对象来确定是返回一个或者多个**
 | 
	
		
			
				|  |  | +```java
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@Table(name = "t_test")
 | 
	
		
			
				|  |  | +public class TTest {
 | 
	
		
			
				|  |  | + // 表字段 : t_test.id//    @javax.persistence.Column(name="ids")
 | 
	
		
			
				|  |  | +  @Id
 | 
	
		
			
				|  |  | +  private Integer id;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | + // 表字段 : t_test.test_id  @Column(name = "test_id")
 | 
	
		
			
				|  |  | +  @Column(name = "test_id")
 | 
	
		
			
				|  |  | +  private String testId;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  @Ignore
 | 
	
		
			
				|  |  | +  private String girlName;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 对应的sql文件中的编号,参数就是JoinColumn中需要将实体和sql中的参数对应
 | 
	
		
			
				|  |  | +  @JoinTable(schema = "test.selectByExample", joinColumns = {
 | 
	
		
			
				|  |  | +            @JoinColumn(name = "id", referencedColumnName = "id"),
 | 
	
		
			
				|  |  | +  @JoinColumn(name = "status", referencedColumnName = "status")
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +    private TTest test;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  @JoinTable(schema = "test.selectByExample", joinColumns = {
 | 
	
		
			
				|  |  | +            @JoinColumn(name = "testId", referencedColumnName = "test_id")
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +    private List testList;
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +## 常用操作
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +下面是集成自IBaseDaoSupport的操作
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +1. 添加操作
 | 
	
		
			
				|  |  | +```java
 | 
	
		
			
				|  |  | +@Test
 | 
	
		
			
				|  |  | +public void testInserCase() throws Exception {
 | 
	
		
			
				|  |  | +    TTest test = new TTest();
 | 
	
		
			
				|  |  | +	test.setStatus("1");
 | 
	
		
			
				|  |  | +	test.setUsername("某某某xx111");
 | 
	
		
			
				|  |  | +	// 这里是非手写的语句,集成自IBaseDaoSupport操作
 | 
	
		
			
				|  |  | +	int insert = testDao.insert(test);
 | 
	
		
			
				|  |  | +	System.out.println(insert);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +2. 修改
 | 
	
		
			
				|  |  | +```java
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@Test
 | 
	
		
			
				|  |  | +public void testUpdateCase() throws Exception {
 | 
	
		
			
				|  |  | +	TTest test = new TTest();
 | 
	
		
			
				|  |  | +	test.setId(1);
 | 
	
		
			
				|  |  | +	test.setStatus("1");
 | 
	
		
			
				|  |  | +	test.setUsername("某某某xx33333333");
 | 
	
		
			
				|  |  | +	int insert = testDao.updateById(test);
 | 
	
		
			
				|  |  | +	System.out.println(insert);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +3. 查询
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +```java
 | 
	
		
			
				|  |  | +@Test
 | 
	
		
			
				|  |  | +  public void testQueryCase() throws Exception {
 | 
	
		
			
				|  |  | +        TTest test = new TTest();
 | 
	
		
			
				|  |  | +	test.setId(1123);
 | 
	
		
			
				|  |  | +	test.setStatus("1");
 | 
	
		
			
				|  |  | +  //        test.setUsername("某某某xx2121212");
 | 
	
		
			
				|  |  | +	List tTests = testDao.selectByList(test);
 | 
	
		
			
				|  |  | +	test.setId(1);
 | 
	
		
			
				|  |  | +	TTest test1 = testDao.selectByObject(test);
 | 
	
		
			
				|  |  | +	System.out.println(test1.toString());
 | 
	
		
			
				|  |  | +	System.out.println(tTests.size());
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +## 特殊操作
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +### 动态参数
 | 
	
		
			
				|  |  | +1. 例如动态表名,或者动态字段
 | 
	
		
			
				|  |  | +```xml
 | 
	
		
			
				|  |  | + 1. select * from $table
 | 
	
		
			
				|  |  | + 2. selct * from table order  by $column
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +1. 传值的时候,就传table这个字段
 | 
	
		
			
				|  |  | +2. 传值的时候就传column -> id asc 等等
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +## bean对象手动设置
 | 
	
		
			
				|  |  | +1. 实现RowMapper接口
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +// 该类已经是最底层的赋值方法了,可以根据具体业务去实现不同的处理
 | 
	
		
			
				|  |  | +public class TestRowMapper implements RowMapper {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +  public TTest mapRow(ResultSet resultSet, int i) throws SQLException {
 | 
	
		
			
				|  |  | +	  TTest test = new TTest();
 | 
	
		
			
				|  |  | +	  int id = resultSet.getInt("id");
 | 
	
		
			
				|  |  | +	  String username = resultSet.getString("username");
 | 
	
		
			
				|  |  | +	  String name = resultSet.getString("name");
 | 
	
		
			
				|  |  | +	  test.setId(id);
 | 
	
		
			
				|  |  | +	  test.setUsername(username);
 | 
	
		
			
				|  |  | +	  test.setName(name);
 | 
	
		
			
				|  |  | +	  return test;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 然后接口层
 | 
	
		
			
				|  |  | +可以通过公用的selectByMapper(参数,new TestRowMapper());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +TTest test = new TTest();
 | 
	
		
			
				|  |  | +test.setStatus("1");
 | 
	
		
			
				|  |  | +TestRowMapper mapper = new TestRowMapper();
 | 
	
		
			
				|  |  | +List tTests1 = testDao.selectByList(test);
 | 
	
		
			
				|  |  | +List tTests = testDao.selectByMapper(test, mapper);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +### in like 操作
 | 
	
		
			
				|  |  | +如果是in like 等函数:
 | 
	
		
			
				|  |  | +sql.xml中
 | 
	
		
			
				|  |  | +```java
 | 
	
		
			
				|  |  | +// sql
 | 
	
		
			
				|  |  | +select * from table where name like :name
 | 
	
		
			
				|  |  | +// java
 | 
	
		
			
				|  |  | +model.setName("%mmm%");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// sql
 | 
	
		
			
				|  |  | +select * from table where id in :idList
 | 
	
		
			
				|  |  | +// java
 | 
	
		
			
				|  |  | +List<String> list = new ArrayList();
 | 
	
		
			
				|  |  | +list.add("1");
 | 
	
		
			
				|  |  | +list.add("2");
 | 
	
		
			
				|  |  | +list.add("3");
 | 
	
		
			
				|  |  | +// 上面最好用对象包这这个list
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +# 使用建议
 | 
	
		
			
				|  |  | +1. 如果出现(columnA = :A or columnB = :B) 这种括号条件的话....希望传值不能为空!
 | 
	
		
			
				|  |  | +2. 传值的时候参数必须带有一个以上!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +## 加速开发
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +### 自动生成代码
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +[内部生成代码网站](http://192.168.0.25:8889/share;JSESSIONID=aa82cbce-e6d8-4816-af7f-fe0e01eb77f5)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +> 帐号: admin 密码:111111
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +选择表结构生成特定的内部代码结构。
 |