淺析Spring的JdbcTemplate方法
spring對于數(shù)據(jù)訪問層提供了多種的模板技術(shù)。如果直接使用JDBC,那么可以選擇JdbcTemplate、如果使用的是對象關(guān)系映射框架,使用hibernate應(yīng)該使用HibernateTemplate模板,使用JPA則應(yīng)該使用JpaTemplate。
除此之外,Spring框架為每一項(xiàng)的持久層技術(shù)都提供了相應(yīng)的幫助類來簡化操作。對于Jdbc提供了JdbcDaoSupport類、對于Hibernate技術(shù)提供了HibernateDaoSupport類、對于MyBatis提供了SqlMapClientDaoSupport類。
本篇主要介紹Spring如何使用JdbcTemplate來訪問關(guān)系型數(shù)據(jù)庫。
1.首先引入使用Spring的jdbc模塊時的jar文件(maven項(xiàng)目可引入對應(yīng)的依賴)。
- spring-beans-3.2.0.RELEASE.jar
- spring-context-3.2.0.RELEASE.jar
- spring-core-3.2.0.RELEASE.jar
- spring-expression-3.2.0.RELEASE.jar
- commons-logging-1.2.jar
- spring-jdbc-3.2.0.RELEASE.jar
- spring-tx-3.2.0.RELEASE.jar
對應(yīng)的數(shù)據(jù)庫驅(qū)動(這里采用mysql)
2.在src下引入兩個文件:applicationContext.xml和log4j.xml
3.下面以連接兩種數(shù)據(jù)庫連接池的技術(shù)來介紹Spring關(guān)于JdbcTemplate的使用:
使用Spring內(nèi)置的數(shù)據(jù)庫連接池:
DriverManagerDataSource dataSource=new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///springjdbc");
dataSource.setUsername("root");
dataSource.setPassword("1997WFY.....");
JdbcTemplate template=new JdbcTemplate();
template.setDataSource(dataSource);
template.execute("create table book(id int primary key auto_increment,name varchar(20) not null,author varchar(25))");
或者:
<!-- XML配置Spring默認(rèn)的連接池 -->
<bean id="driverManagerDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///springjdbc"/>
<property name="username" value="root"/>
<property name="password" value="1997WFY....."/>
</bean>
<bean class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="driverManagerDataSource"/>
</bean>
Java代碼使用:
/**
* @author BeautifulSoup
* 首先使用Spring內(nèi)置的連接池
*/
@ContextConfiguration("classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringJdbcTest {
@Autowired
private JdbcTemplate template;
@Test
public void testDriverManagerDataSource() {
template.execute("create table book(id int primary key auto_increment,name varchar(20) not null,author varchar(25))");
}
}
使用世界上性能最好的Druid連接池:
<!-- 配置Druid的連接池 -->
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///springjdbc" />
<property name="username" value="root" />
<property name="password" value="1997WFY....." />
<!-- 設(shè)置初始的連接數(shù)目,最小的連接數(shù),最大的連接數(shù) -->
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<property name="maxActive" value="8" />
<!-- 配置獲取連接等待超時的時間 -->
<property name="maxWait" value="10000" />
<!-- 配置間隔多久才進(jìn)行一次檢測需要關(guān)閉的空閑連接 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一個連接在池中最小的生存時間 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="testWhileIdle" value="true" />
<!-- 這里建議配置為TRUE,防止取到的連接不可用 -->
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="false" />
<!-- 打開PSCache,并且指定每個連接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize"
value="20" />
<!-- 這里配置提交方式,默認(rèn)就是TRUE,可以不用配置 -->
<property name="defaultAutoCommit" value="true" />
<!-- 驗(yàn)證連接有效與否的SQL,不同的數(shù)據(jù)配置不同 -->
<property name="validationQuery" value="select 1 " />
<property name="filters" value="stat" />
</bean>
<bean class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="druidDataSource" />
</bean>
/**
* @author BeautifulSoup
* 首先使用Spring內(nèi)置的連接池
*/
@ContextConfiguration("classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringJdbcTest {
@Autowired
private JdbcTemplate template;
@Test
public void testSpringJdbc() {
template.execute("create table book(id int primary key auto_increment,name varchar(20) not null,author varchar(25))");
}
}
4.使用得到的JdbcTemplate進(jìn)行基本的增刪改查:
首先創(chuàng)建實(shí)體類對象,
/**
* @author BeautifulSoup
* 創(chuàng)建實(shí)體類對象
*/
public class Book {
private Integer id;
private String name;
private String author;
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 String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "Book [id=" + id + ", name=" + name + ", author=" + author + "]";
}
}
在配置文件中配置bean:
<bean class="com.fuyunwang.springjdbc.dao.BookDao">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
Dao層進(jìn)行持久層的開發(fā):
/**
* @author BeautifulSoup 完成基本的增刪改查
*/
public class BookDao extends JdbcDaoSupport {
public void add(Book book) {
String sql = "insert into book values(?,?,?)";
getJdbcTemplate().update(sql, book.getId(), book.getName(),
book.getAuthor());
}
public void update(Book book) {
String sql = "update book set name = ? , author = ? where id =?";
getJdbcTemplate().update(sql, book.getName(), book.getAuthor(),
book.getId());
}
public void delete(Book book) {
String sql = "delete from book where id =?";
getJdbcTemplate().update(sql, book.getId());
}
public int findCount() {
String sql = "select count(*) from book";
return getJdbcTemplate().queryForInt(sql);
}
public String findNameById(int id) {
String sql = "select name from book where id = ?";
return getJdbcTemplate().queryForObject(sql, String.class, id);
}
public Book findById(int id) {
String sql = "select * from book where id = ?";
return getJdbcTemplate().queryForObject(sql, new BookMapper(), id);
}
public List<Book> findAll(){
String sql="select * from book";
return getJdbcTemplate().query(sql, new BookMapper());
}
class BookMapper implements RowMapper<Book> {
public Book mapRow(ResultSet rs, int rowNum) throws SQLException {
Book book = new Book();
book.setId(rs.getInt("id"));
book.setName(rs.getString("name"));
book.setAuthor(rs.getString("author"));
return book;
}
}
}
單元測試,
/**
* @author BeautifulSoup
* 首先使用Spring內(nèi)置的連接池
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringJdbcTest {
@Autowired
private BookDao bookDao;
@Test
public void jdbcTemplateAdd(){
Book book=new Book();
book.setId(1);
book.setName("SpringBoot實(shí)戰(zhàn)");
book.setAuthor("Craig Walls");
bookDao.add(book);
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring中利用SchedulingConfigurer實(shí)現(xiàn)動態(tài)定時任務(wù)配置的示例
定時任務(wù)是一項(xiàng)至關(guān)重要的功能,它們使得我們能夠按照預(yù)定的時間執(zhí)行特定的任務(wù),本文主要介紹了Spring中利用SchedulingConfigurer實(shí)現(xiàn)動態(tài)定時任務(wù)配置的示例,感興趣的可以了解一下2024-05-05
springboot+redis緩存的實(shí)現(xiàn)方案
本文介紹了Spring Boot與Redis結(jié)合實(shí)現(xiàn)緩存的三種方案:注解方式、注解切面類方式和使用樣例,通過這些方案,可以有效地提高應(yīng)用程序的性能和響應(yīng)速度2025-03-03
Idea2019創(chuàng)建Springboot Web項(xiàng)目的方法步驟
這篇文章主要介紹了Idea2019創(chuàng)建Springboot Web項(xiàng)目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
SpringBoot使用 druid 連接池來優(yōu)化分頁語句
這篇文章主要介紹了SpringBoot使用 druid 連接池來優(yōu)化分頁語句,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
@PathVariable注解,讓spring支持參數(shù)帶值功能的案例
這篇文章主要介紹了@PathVariable注解,讓spring支持參數(shù)帶值功能的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
Apache?SkyWalking?修復(fù)TTL?timer?失效bug詳解
這篇文章主要為大家介紹了Apache?SkyWalking?修復(fù)TTL?timer?失效bug詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
基于java實(shí)現(xiàn)停車場管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于java實(shí)現(xiàn)停車場管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11
Java中StringBuilder與StringBuffer使用及源碼解讀
我們前面學(xué)習(xí)的String就屬于不可變字符串,因?yàn)槔碚撋弦粋€String字符串一旦定義好,其內(nèi)容就不可再被改變,但實(shí)際上,還有另一種可變字符串,包括StringBuilder和StringBuffer兩個類,那可變字符串有什么特點(diǎn),又怎么使用呢,接下來就請大家跟我一起來學(xué)習(xí)吧2023-05-05

