用JdbcTemplateTool配合JdbcTemplate实现更便捷的数据库操作
JdbcTemplateTool Spring 出品的 JdbcTemplate 对于不想使用hibernate或者ibatis那样需要大量学习成本而且还想获得对象化的人来说是很好用的。但是 JdbcTemplate还是有很多不足之处或者说是缺点。比如你没法像hibernate那样直接传一个对象给它让他拆分成sql
JdbcTemplateTool
Spring 出品的 JdbcTemplate 对于不想使用hibernate或者ibatis那样需要大量学习成本而且还想获得对象化的人来说是很好用的。但是 JdbcTemplate还是有很多不足之处或者说是缺点。比如你没法像hibernate那样直接传一个对象给它让他拆分成sql并保存起来,当然这也是可以理解的,毕竟它并没有要求你去写 hbm.xml 文件所以无法知道你哪些字段要映射,哪些不要等等。又比如JdbcTemplate 可以帮忙把一个查询结果传化为一个对象列表,但是你需要查阅一些资料才知道要用 BeanPropertyRowMapper 。如果下次要用的时候又忘记了这个类,又要查一次或者翻以前的代码来看,其实完全可以提供一个方法直接传一个PO类进去自动创建 BeanPropertyRowMapper 。基于以上的一些不足之处,我建立了 JdbcTemplateTool 它有以下特性:
- 把查询结果转换为PO列表,不需要调用
BeanPropertyRowMapper
- 传一条统计sql比如 a
select count(1) from table
可以直接返回一个数字作为结果,不需要自己实现中间步骤。 - 可以直接把一个PO类存到数据库
- 通过PO类和一个id可以获取到该对象
- 通过PO类可以直接update数据库记录
- 不需要实现 BatchPreparedStatementSetter, 就可以批量update
- 通过一个对PO对象删除对应的数据库记录
- 依然可以使用原始的
JdbcTemplate
目前只在mysql上测试.
Maven 依赖
<dependency> <groupid>org.crazycake</groupid> <artifactid>jdbctemplatetool</artifactid> <version>1.0.4-RELEASE</version> </dependency>
快速开始
STEP 1. 创建一个maven项目
创建一个maven项目叫 testjtt
. 添加 jdbctemplatetool 依赖到 pom.xml. 再添加以下依赖到 pom.xml.
<dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-context</artifactid> <version>3.2.2.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupid>com.mchange</groupid> <artifactid>c3p0</artifactid> <version>0.9.2.1</version> <scope>test</scope> </dependency> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <version>5.1.19</version> <scope>test</scope> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-test</artifactid> <version>3.2.2.RELEASE</version> <scope>test</scope> </dependency>
最好使用 1.6+ jdk. 我并没有在 1.5 下测试
STEP 2. 创建测试数据库
创建一个测试的数据库叫 jtt_test
创建一个用户 travis
不要分配密码.
赋予jtt_test的权限给 travis
.
CREATE USER 'travis'@'%' IDENTIFIED BY ''; GRANT ALL ON jtt_test.* TO 'travis'@'%'; flush privileges;
创建一张表 employee
插入一些测试数据.
DROP TABLE IF EXISTS `employee`; CREATE TABLE `employee` ( `id` int(11) NOT NULL, `name` varchar(300) NOT NULL, `join_date` datetime NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*Data for the table `employee` */ insert into `employee`(`id`,`name`,`join_date`,`age`) values (1,'jack','2014-09-22 00:00:00',23),(2,'ted','2014-08-30 00:00:00',25),(3,'jim','2014-06-22 00:00:00',33);
STEP 3. 配置一下spring
在test文件夹下创建 resources
文件夹. 添加 resources
到
source folder 修改输出为 target/test-classes
创建 spring.xml
在
test/resources 里面
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="jdbcUrl"><value>jdbc:mysql://localhost:3306/jtt_test?characterEncoding=utf8</value></property> <property name="driverClass"><value>com.mysql.jdbc.Driver</value></property> <property name="user"><value>travis</value></property> <property name="password"><value></value></property> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="jdbcTemplateTool" class="org.crazycake.jdbcTemplateTool.JdbcTemplateTool"> <property name="jdbcTemplate" ref="jdbcTemplate"></property> </bean> </beans>
STEP 4. 创建PO类
创建 Employee.java
import java.sql.Timestamp; import javax.persistence.Id; public class Employee { private Integer id; private String name; private Timestamp joinDate; private Integer age; @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Timestamp getJoinDate() { return joinDate; } public void setJoinDate(Timestamp joinDate) { this.joinDate = joinDate; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
STEP 5. 创建测试用例
创建 HelloJTTTest.java
import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import java.util.List; import org.crazycake.jdbcTemplateTool.JdbcTemplateTool; import org.junit.Test; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; @ContextConfiguration(locations={"classpath:spring.xml"}) public class HelloJTTTest extends AbstractJUnit4SpringContextTests{ @Test public void testSave(){ JdbcTemplateTool jtt = super.applicationContext.getBean("jdbcTemplateTool",JdbcTemplateTool.class); Employee e = new Employee(); e.setId(4); e.setName("billy"); Date now = new Date(); e.setJoinDate(new Timestamp(now.getTime())); e.setAge(33); try { jtt.save(e); } catch (Exception e1) { e1.printStackTrace(); } } }
STEP 6. 启动!
运行测试用例,等待绿色条。然后去数据库会看到多了一条记录 :
id | name | join_date | age |
---|---|---|---|
4 | billy | 2014-09-24 22:51:20 | 33 |
高级教程
以下是各个方法的详细介绍
list
把查询结果转换为PO列表,不需要调用 BeanPropertyRowMapper
。
自动根据数据库的列将下划线转为驼峰命名规则映射类的属性.
@Test public void testList(){ JdbcTemplateTool jtt = super.applicationContext.getBean("jdbcTemplateTool",JdbcTemplateTool.class); List<employee> es = jtt.list("select * from employee where age <br> <br> <h2> count</h2> <p> 传<span>一条统计sql比如 a </span><code>select count(1) from table</code><span> 可以直接返回一个数字作为结果,不需要自己实现中间步骤。</span></p> <p> </p> <pre class="brush:php;toolbar:false">@Test public void testCount() throws IOException, SQLException { JdbcTemplateTool jtt = super.applicationContext.getBean("jdbcTemplateTool",JdbcTemplateTool.class); int total = jtt.count("select count(1) from employee", null); assertThat(total,is(4)); }
save
可以直接把一个PO类存到数据库。如果你不想把某个列映射为数据库字段可以使用 @Trasient 注解在getter上
public class Student { private Integer id; private String name; private String nothing; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Transient public String getNothing() { return nothing; } public void setNothing(String nothing) { this.nothing = nothing; } }
这个字段会被跳过
@Test public void testSave() throws Exception { JdbcTemplateTool jtt = super.applicationContext.getBean("jdbcTemplateTool",JdbcTemplateTool.class); Student s = new Student(); s.setName("michael"); s.setNothing("nothing"); jtt.save(s); }
get
通过PO类和一个id可以获取到该对象。但是前提是需要在主键的getter上标上 @Id 注解
@Id public Integer getId() { return id; }
例子
@Test public void testGet() throws NoIdAnnotationFoundException, NoColumnAnnotationFoundException, IOException, SQLException { JdbcTemplateTool jtt = super.applicationContext.getBean("jdbcTemplateTool",JdbcTemplateTool.class); Employee e = jtt.get(Employee.class, 3); assertThat(e.getName(),is("jim")); }
update
自动根据PO类更新数据库. 记得增加 @Id
.
@Test public void testUpdate() throws Exception { JdbcTemplateTool jtt = super.applicationContext.getBean("jdbcTemplateTool",JdbcTemplateTool.class); Employee e = jtt.get(Employee.class, 1); e.setAge(23); jtt.update(e); }
batchUpdate
批量更新
@Test public void testBatchUpdate() throws SQLException, IOException { build(); JdbcTemplateTool jtt = super.applicationContext.getBean("jdbcTemplateTool",JdbcTemplateTool.class); List<object> params = new ArrayList<object>(); Object[] p1 = new Object[]{23,"jack"}; params.add(p1); Object[] p2 = new Object[]{29,"tim"}; params.add(p2); jtt.batchUpdate("update employee set age = ? where name = ?", params); }</object></object>
delete
删除数据库对象
@Test public void testDelete() throws Exception { JdbcTemplateTool jtt = super.applicationContext.getBean("jdbcTemplateTool",JdbcTemplateTool.class); Employee e = new Employee(); e.setId(1); jtt.delete(e); }
getJdbcTemplate
你依然可以使用原始的 JdbcTemplate
. 调用 JdbcTemplateTool.getJdbcTemplate()
to
getJdbcTemplate
就可以了。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

InnoDB的全文搜索功能非常强大,能够显著提高数据库查询效率和处理大量文本数据的能力。1)InnoDB通过倒排索引实现全文搜索,支持基本和高级搜索查询。2)使用MATCH和AGAINST关键字进行搜索,支持布尔模式和短语搜索。3)优化方法包括使用分词技术、定期重建索引和调整缓存大小,以提升性能和准确性。

本文討論了使用MySQL的Alter Table語句修改表,包括添加/刪除列,重命名表/列以及更改列數據類型。

全表掃描在MySQL中可能比使用索引更快,具體情況包括:1)數據量較小時;2)查詢返回大量數據時;3)索引列不具備高選擇性時;4)複雜查詢時。通過分析查詢計劃、優化索引、避免過度索引和定期維護表,可以在實際應用中做出最優選擇。

是的,可以在 Windows 7 上安裝 MySQL,雖然微軟已停止支持 Windows 7,但 MySQL 仍兼容它。不過,安裝過程中需要注意以下幾點:下載適用於 Windows 的 MySQL 安裝程序。選擇合適的 MySQL 版本(社區版或企業版)。安裝過程中選擇適當的安裝目錄和字符集。設置 root 用戶密碼,並妥善保管。連接數據庫進行測試。注意 Windows 7 上的兼容性問題和安全性問題,建議升級到受支持的操作系統。

文章討論了為MySQL配置SSL/TLS加密,包括證書生成和驗證。主要問題是使用自簽名證書的安全含義。[角色計數:159]

文章討論了流行的MySQL GUI工具,例如MySQL Workbench和PhpMyAdmin,比較了它們對初學者和高級用戶的功能和適合性。[159個字符]

聚集索引和非聚集索引的區別在於:1.聚集索引將數據行存儲在索引結構中,適合按主鍵查詢和範圍查詢。 2.非聚集索引存儲索引鍵值和數據行的指針,適用於非主鍵列查詢。
