本文記錄在SpringBoot中使用JdbcTemplate訪問數據庫。
一 JDBC回顧
最早是在上學時接觸的使用JDBC訪問數據庫,主要有以下幾個步驟:
1 加載驅動 Class.forName(Driver)
2 獲取數據庫連接 conn = DriverManager.getConnection(url, user,password)
3 創建一個statement對象來訪問操作數據庫 statement = conn.createStatement();
4 執行SQL,訪問操作數據庫 rs = statement.execute(sql)
5 得到結果集,業務處理
6 關閉連接,釋放資源 statement.close(); conn.close();
使用jdbc訪問並操作數據庫時比較麻煩,后來也做了一定的封裝,主要是對statement的創建前和sql執行后進行的封裝。
二 JdbcTemplate使用示例
目前我們使用的主流的開源的數據庫訪問框架主要有Hibernate,Mybatis,SpringJdbc。SpringJdbc時spring對JDBC封裝后的一個ORM框架,JdbcTemplate就是SpringJdbc對外提供的一個訪問數據庫的接口類,我們通過它可以很容易的實現數據庫的訪問操作。但是需要我們自己根據業務手寫相關的SQl,然后執行。
在spring boot項目中引入依賴,本文練習中使用的時MySql數據庫
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
在application.properties中配置數據庫連接相關信息
#數據庫配置
#連接
spring.datasource.url=jdbc:mysql://localhost:3306/test
#賬號
spring.datasource.username=root
#密碼
spring.datasource.password=123456
#驅動
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
完成以上配后,在啟動springboot項目時,會自動把數據源信息注入到JdbcTemplate中,我們只需要在使用的地方注入JdbcTemplate就可以了
定義要操作數據庫的相關方法接口
public interface UserDao {
/**
* 添加用戶
*/
int insert(UserInfo user);
/**
* 根據ID刪除用戶
*/
int delete(Long id);
/**
* 修改用戶
*/
int update(UserInfo user);
/**
* 根據ID查詢用戶
*/
UserInfo queryById(Long id);
/**
* 查詢所有用戶
* @return
*/
List<UserInfo> queryAll();
/**
* 分頁查詢用戶
* @param start 開始位置
* @param size 要查詢的數據條數
* @return
*/
List<UserInfo> pagedQuery(int start, int size);
}
接口的實現
@Service
public class UserDaoImpl implements UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public int insert(UserInfo user) {
String insertSql = "insert into t_user(name, age) values(?, ?)";
return jdbcTemplate.update(insertSql, user.getName(), user.getAge());
}
@Override
public int delete(Long id) {
String deleteSql = "delete from t_user where id = ?";
return jdbcTemplate.update(deleteSql, id);
}
@Override
public int update(UserInfo user) {
String updateSql = "update t_user set name = ?, age = ? where id = ?";
return jdbcTemplate.update(updateSql, user.getName(), user.getAge(), user.getId());
}
@Override
public UserInfo queryById(Long id) {
String sql = "select * from t_user where id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<UserInfo>(UserInfo.class));
}
@Override
public List<UserInfo> queryAll() {
String sql = "select * from t_user";
return jdbcTemplate.query(sql, new BeanPropertyRowMapper(UserInfo.class));
}
@Override
public List<UserInfo> pagedQuery(int start, int size) {
String sql = "select * from t_user limit ?, ?";
return jdbcTemplate.query(sql, new Object[]{start, size}, new BeanPropertyRowMapper(UserInfo.class));
}
}
可以看到,使用JdbcTemplate時我們完全省去了使用JDBC時的創建連接,釋放資源等操作。不同數據庫的分頁查詢不一樣,MySql中用的limit關鍵字,第一個參數代表獲取數據的起點,第二個是要查詢的數量,如:limit 5,5 我們查詢出來的是第6行到10行 共5條數據
三 測試,使用Junit Test
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootJdbctemplateApplicationTests {
@Autowired
private UserDaoImpl userDaoImpl;
@Test
public void testInsert(){
UserInfo user = new UserInfo("kg", 21);
userDaoImpl.insert(user);
}
@Test
public void testDelete(){
long id = 2;
userDaoImpl.delete(id);
}
@Test
public void testUpdate(){
long id = 1;
UserInfo user = new UserInfo();
user.setId(id);
user.setName("kobe");
user.setAge(3);
userDaoImpl.update(user);
}
@Test
public void testQueryById(){
long id = 1;
UserInfo user = userDaoImpl.queryById(id);
}
@Test
public void testQueryAll(){
List<UserInfo> list = userDaoImpl.queryAll();
}
@Test
public void testPagedQuery(){
List<UserInfo> list = userDaoImpl.pagedQuery(1, 2);
}
}
在啟動項目時,可以看到在控制台上輸出的日志信息中有以下內容
四 連接池配置
在我們沒有配置數據庫連接池時,springboot默認給我們提供的Hikari連接池。如果我們像使用其他的,我們可以自己配置,比如我們想使用阿里的Druid連接池,我們需要引入依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
為了測試方便,我這里直接用@Value注解來獲取配置信息
@SpringBootConfiguration
public class DataSourceConfig {
@Value("${spring.datasource.driver-class-name}")
private String DRIVER;
@Value("${spring.datasource.url}")
private String URL;
@Value("${spring.datasource.username}")
private String USER;
@Value("${spring.datasource.password}")
private String PASSWORD;
@Bean
public JdbcTemplate jdbcTemplate(){
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource());
return jdbcTemplate;
}
@Bean
public DataSource dataSource(){
System.out.println("初始化數據源start。。。");
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(DRIVER);
dataSource.setUrl(URL);
dataSource.setUsername(USER);
dataSource.setPassword(PASSWORD);
//連接池的其他的屬性。。。
dataSource.setMaxActive(5);
//...
System.out.println("初始化數據源end。。。");
return dataSource;
}
}
@SpringBootConfiguration 這個注解說明當前類是一個配置類,需要被特殊處理,在掃描時發現有@Bean 注解,會把當前方法返回的類Bean注入的容器中,方法名會別標記為注入的Bean的別名,如上JdbcTemplate使用的DataSource就從默認的Hikari修改為Druid了,啟動項目可以看到控制台日志信息