公司dao层使用的是jdbctemplate,但是有很多地方做的不是特别人性化,所以自己根据源码进行了一些改造,纯当练练手.很多地方还做的不是很到位,以后再慢慢优化吧
anno - 注解
JDBCTemplate - 基于jdbctemplate拓展类
params - 入参解析
row - 出参数据每行解析类
mapping - 结果映射
model - 实体
sql - sql文件解析
resources - 配置文件
1.支持实体,Map,数组入参,实体、Map出参,更加快速开发,不必做多余的非空判断
2.sql替换更加智能,支持动态替换表名,参数不必与字段对应
3.大数据反射优化
4.注解对应数据库字段
5.
- 添加
public static void insert() {
System.out.println("★★★★★★★★★★★★★★★★★★★★★insert★★★★★★★★★★★★★★★★★★★★★★★★");
TTest t = new TTest();
t.setUsername("添加数据");
t.setLove_name("mmm");
t.setName("你知道?");
t.setSex("男");
t.setCreated(new Date());
t.setTest_id("rrrrrrr");
t.setTime(new Date());
Long start = System.currentTimeMillis();
int i = jdbcTemplate.executeInsert("test.insert", t);
Long end = System.currentTimeMillis();
System.out.println(" 查询耗时 : " + (end - start) + " 数据大小:" + i);
}
- 修改
public static void update() {
System.out.println("★★★★★★★★★★★★★★★★★★★★★update★★★★★★★★★★★★★★★★★★★★★★★★");
TTest t = new TTest();
t.setLove_name("mmm");
t.setName("你知道?");
t.setSex("男");
t.setCreated(new Date());
t.setTest_id("rrrrrrr");
t.setTime(new Date());
t.setId(2);
Long start = System.currentTimeMillis();
int i = jdbcTemplate.executeUpdate("test.updateByPrimaryKey", t);
Long end = System.currentTimeMillis();
System.out.println(" 查询耗时 : " + (end - start) + " 数据大小:" + i);
}
- 查询 - 出参为RowSet对象
public static void findRowSet() {
System.out.println("★★★★★★★★★★★★★★★★★★★★★findRowSet★★★★★★★★★★★★★★★★★★★★★★★★");
String sql = " select\n" +
" id\n" +
" ,username,name,sex,status,created,time,test_id,love_name\n" +
" from t_test\n" +
" where\n" +
" id <= ?";
Long start = System.currentTimeMillis();
SqlRowSet sqlRowSet = jdbcTemplate.queryForRowSet(sql, "2");
Long end = System.currentTimeMillis();
System.out.println(" 查询耗时 : " + (end - start) + " 数据大小:" + sqlRowSet.getString(1));
}
- 查询 入参为map 出参也是map
public static void findMap() {
System.out.println("★★★★★★★★★★★★★★★★★★★★★findMap★★★★★★★★★★★★★★★★★★★★★★★★");
Map map = new LinkedHashMap();
map.put("id", 2);
map.put("age", 18);
map.put("ggg", "sssssss");
Long start = System.currentTimeMillis();
Map<String, Object> maps = jdbcTemplate.executeQueryMap("test.selectByPrimaryKey", map);
Long end = System.currentTimeMillis();
System.out.println(" 查询耗时 : " + (end - start) + " 数据大小:" + maps);
}
- 查询集合 入参为map 出参为对象
public static void findSqlOjbect() {
System.out.println("★★★★★★★★★★★★★★★★★★★★★findSqlOjbect★★★★★★★★★★★★★★★★★★★★★★★★");
Object[] ids = new Object[3];
ids[0] = "2";
ids[1] = "3307424";
ids[2] = "3307426";
Map params = new HashMap();
// params.put("username", "添加%");
params.put("table", "t_test");
params.put("id", ids);
//params.put("minId", "3307423");
//params.put("maxId", "3307426");
Long start = System.currentTimeMillis();
List<TTest> tTests = jdbcTemplate.executeQueryList("test.operationSql", params, TTest.class);
Long end = System.currentTimeMillis();
System.out.println(" 查询耗时 : " + (end - start) + " 数据大小:" + tTests.size());
}
6.查询 入参为对象 出参为对象
public static void findListObject() {
System.out.println("★★★★★★★★★★★★★★★★★★★★★findListObject★★★★★★★★★★★★★★★★★★★★★★★★");
TTest t = new TTest();
t.setStatus("1");
Long start = System.currentTimeMillis();
List<TTest> tTests = jdbcTemplate.executeQueryList("test.selectByExample", t, TTest.class);
Long end = System.currentTimeMillis();
System.out.println(" 查询耗时 : " + (end - start) + " 数据大小:" + tTests.size());
}
- 查询大数据量返回 入参为对象 出参为对象
public static void findBigList() {
System.out.println("★★★★★★★★★★★★★★★★★★★★★findBigList★★★★★★★★★★★★★★★★★★★★★★★★");
TTest t = new TTest();
t.setId(2900000);
// t.setStatus("10");
Long start = System.currentTimeMillis();
List<TTest> tTests = jdbcTemplate.executeQueryBigDataList("test.selectByExample", t, TTest.class);
Long end = System.currentTimeMillis();
System.out.println(" 查询耗时 : " + (end - start) + " 数据大小:" + tTests.size());
}
<?xml version="1.0" encoding="UTF-8" ?>
<sqlGroup name="test">
<sql id="selectByPrimaryKey">
select
a.id,a.username,a.name,a.sex,a.status,a.created,a.time,a.test_id,a.love_name,b.girl_name,b.status as girlStatus
from t_test a left join t_girl b on a.id = b.id and b.age > :age
where a.id = :id
</sql>
<sql id="selectByExample">
select
id
,username,name,sex,status,created,time,test_id,love_name
from t_test
where
id > :id and
and username = :username
and name = :name
and sex = :sex
and status = :status
and created = :created
and time = :time
and test_id = :test_id
and love_name = :love_name
</sql>
<sql id="deleteByKey">
delete from t_test
where id = :id
</sql>
<!-- 添加 -->
<sql id="insert">
insert into t_test (username, name, sex, status, created, time, test_id, love_name)
values (:username, :name, :sex, :status, :created, :time, :test_id, :love_name)
</sql>
<sql id="updateByPrimaryKey">
update t_test
set
username = :username,name = :name,sex = :sex,status = :status,created = :created,time = :time,test_id =
:test_id,love_name = :love_name
where
id = :id
</sql>
<!-- 动态替换表名 -->
<sql id="operationSql">
select
a.id,a.username,a.name,a.sex,a.status,a.created,a.time,a.test_id,a.love_name
from $table a
where a.username like :username and id in :id
</sql>
</sqlGroup>
当实体和数据库参数不对应的时候,需要进行配对的情况下,需要通过注解进行配对 使用方式:
// 数据库字段
@Column(name="username")
// 实体字段
private String loginName;
//案例:
public class TTest implements ColumnMapping{
public void mappingColumn(ResultSet rs) throws SQLException {
// 手动赋值,可以加快赋值速度
}
}
1.添加如果值为null 可以直接传递
set 后面的参数必须存在一个,顺序可以打乱.
where 后面的参数也必须存在一个,顺序可以打乱
3.1
where 后面的参数可以不存在
3.2
如果是in like 等函数:
1. sql.xml中
1. a.id like :a and a.id in :b
2. java 中
like 拼接 %a% in b
3.3
如果出现(columnA = :A or columnB = :B) 这种括号条件的话....
希望能够用表union去做,因为这种参数不太好替换
3.4
如果出现参数重名的情况下,比如:status在sql.xml中需要出现多次,并且值是一样的.
希望能够以第一个status为status1.第二个为status2,然后传参的时候,多传几次...
例如动态表名:$table
参数名称:table
如果存在动态符号的,则为必填项.
目前只支持动态表名传参..不支持动态列传参,,因为实在想不到那种场景需要动态传递列名,您可以写两条sql达到目的
配置文件必须存放在resources的sql目录下,目录级别没有限制..
可以到test.java.test 类里面进行查看,可以加快理解.
如有问题请联系:444368875