spring 學習(四): spring 的 jdbcTemplate 操作
spring 針對 javaee 的每一層,都提供了相應的解決技術,jdbcTemplate 的主要操作在 dao 層。
下面我們來使用 jdbcTemplate 對數據庫進行 crud 操作。
准備工作
1 我們首先來導入 jar 包,還是相似的使用 maven 來導入,修改配置文件,需要導入 jar 包的配置:
<!-- jdbcTemplate 使用的 jar 包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- 數據庫驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
2 創建對象,設置數據庫信息。這里以我自己的為例:
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///sampledb");
dataSource.setUsername("root");
dataSource.setPassword("");
3 創建 jdbcTemplate 對象,設置數據源:
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
4 調用 jdbcTemplate 對象里面的方法來實現curd 操作。
下面就分別來講下 jdbcTemplate 的 curd 操作。
首先先創建一個數據庫命名為 sampledb, 在數據庫中新增一個表。添加幾條記錄,如下:
增加
//1.添加操作
@Test
public void add(){
//設置數據庫信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///sampledb");
dataSource.setUsername("root");
dataSource.setPassword("");
//創建jdbcTemplate對象,設置數據源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//調用jdbcTemplate對象里面的方法實現操作
//創建sql 語句
String sql = "insert into user values(?,?)";
int rows = jdbcTemplate.update(sql, "lucy", "250");
System.out.println(rows);
}
修改
//2.修改操作
@Test
public void update(){
//設置數據庫信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///sampledb");
dataSource.setUsername("root");
dataSource.setPassword("");
//創建jdbcTemplate對象,設置數據源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//調用jdbcTemplate對象里面的方法實現操作
//創建sql 語句
String sql = "update user set password=? where username=?";
int rows = jdbcTemplate.update(sql, "1314", "lucy");
System.out.println(rows);
}
刪除
//3.刪除操作
@Test
public void delete(){
//設置數據庫信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///sampledb");
dataSource.setUsername("root");
dataSource.setPassword("");
//創建jdbcTemplate對象,設置數據源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//調用jdbcTemplate對象里面的方法實現操作
//創建sql 語句
String sql = "DELETE FROM USER WHERE username=?";
int rows = jdbcTemplate.update(sql, "lucy");
System.out.println(rows);
}
這里的增刪改操作都是使用 jdbcTemplate.update()
方法。
查詢
查詢返回某一個值
使用 queryForObject(String sql, Class<T> requiredType)
方法。
(1)第一個參數是 sql 語句。
(2)第二個參數返回類型的 class。
舉個栗子:
//查詢操作
@Test
public void query(){
//設置數據庫信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///sampledb");
dataSource.setUsername("root");
dataSource.setPassword("");
//創建jdbcTemplate對象,設置數據源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//調用jdbcTemplate對象里面的方法實現操作
//查詢方法得到記錄數
String sql = "select count(*) from user";
//調用 jdbcTemplate的方法
int count = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(count);
}
將從 user 表中查詢所有的記錄數量。
jdbc實現
為了方便理解,我們使用 jdbc 來實現查詢某個返回對象的操作。
還是舉個栗子,查詢 user 表下的所有返回對象。
新建 User.java 文件,對數據庫中的 username 和 password 實現封裝操作:
package cn.itcast.jdbc;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
使用 jdbc 實現查詢返回 User 對象操作:
//jdbc 實現代碼
@Test
public void testJDBC() throws SQLException {
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
//加載驅動
try {
Class.forName("com.mysql.jdbc.Driver");
//創建連接
conn = DriverManager.getConnection("jdbc:mysql:///sampledb", "root" , "");
//編寫 sql 語句
String sql = "select * from user where username=?";
//預編譯 sql
psmt = conn.prepareStatement(sql);
//設置參數值
psmt.setString(1, "lucy");
//執行 sql
rs = psmt.executeQuery();
//遍歷結果集
while (rs.next()){
//得到返回值
String username = rs.getString("username");
String password = rs.getString("password");
//放到 user 對象里
User user = new User();
user.setUsername(username);
user.setPassword(password);
System.out.println(user);
}
} catch (Exception e){
e.printStackTrace();
} finally {
rs.close();
conn.close();
psmt.close();
}
}
使用 jdbcTemplate 實現查詢返回對象操作
將使用到 queryForObject(String sql, RowMapper<T> rowMapper, Object... args)
方法。
- 第一個參數是 SQL 語句
- 第二個參數是 RowMapper,是接口,需要自己封裝
- 第三一參數是可變參數
還是舉個栗子:
//查詢返回對象
@Test
public void testObject(){
//設置數據庫信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///sampledb");
dataSource.setUsername("root");
dataSource.setPassword("");
//創建jdbcTemplate對象,設置數據源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//寫 SQL 語句,根據 username 查詢
String sql = "select * from user where username=?";
//調用 jdbcTemplate的方法實現
//第二個參數是接口 rowMapper, 需要自己寫類實現接口,自己做數據封裝
User user = jdbcTemplate.queryForObject(sql, new MyRowMapper(), "lucy");
System.out.println(user);
}
RowMapper 封裝的接口類:
class MyRowMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet rs, int num) throws SQLException {
//1 從結果集里面把數據得到
String username = rs.getString("username");
String password = rs.getString("password");
//2 把得到數據封裝到對象里面
User user = new User();
user.setUsername(username);
user.setPassword(password);
return user;
}
}
查詢返回列表
使用 query(String sql, RowMapper<T> rowMapper, Object... args):List<T>
方法。
- 第一個參數:SQL 語句
- 第二個參數:RowMapper 接口,自己寫類實現數據封裝
- 第三個參數:可變參數
舉個栗子:
//查閱返回列表
@Test
public void testList(){
//設置數據庫信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///sampledb");
dataSource.setUsername("root");
dataSource.setPassword("");
//創建jdbcTemplate對象,設置數據源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//寫 SQL 語句,根據 username 查詢
String sql = "select * from user";
//調用 jdbcTemplate的方法實現
//第二個參數是接口 rowMapper, 需要自己寫類實現接口,自己做數據封裝
List<User> list = jdbcTemplate.query(sql, new MyRowMapper());
System.out.println(list);
}
}
spring 配置連接池和 dao 層使用 jdbcTemplate
上述的方法雖然能實現數據庫的 crud 操作,但未免太過繁瑣,我們更希望能以更簡單的方式來實現數據的 crud 操作,spring 為我們提供了通過配置 xml 文件的方式來實現上述操作。
spring 配置 c3p0連接池
首先我們導入相應的 jar 包,還是相似的,利用 maven 來導入:
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId>
<version>0.2.15</version>
</dependency>
然后創建 spring 配置文件,配置連接池:
<!-- 配置c3p0連接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 注入屬性值 -->
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///sampledb"></property>
<property name="user" value="root"></property>
<property name="password" value=""></property>
</bean>
dao 使用 jdbctemplate
(1)創建 UserDao.java 和 UserService.java 文件
UserDao.java:
package cn.itcast.c3p0;
import org.springframework.jdbc.core.JdbcTemplate;
public class UserDao {
//得到 jdbcTemplate 對象
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void add(){
String sql = "insert into user values(?,?)";
jdbcTemplate.update(sql, "李雷", "520");
}
}
UserService.java:
package cn.itcast.c3p0;
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add(){
userDao.add();
}
}
(2)將代碼放在配置文件中進行配置:
<!-- 創建 jdbcTemplate對象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 把 dataSource 傳遞到模板對象里面 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 創建service 和 dao 對象,在 service 注入 dao 對象 -->
<bean id="userDao" class="cn.itcast.c3p0.UserDao">
<!-- 注入 jdbcTemplate對象 -->
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<bean id="userService" class="cn.itcast.c3p0.UserService">
<!-- 注入 dao 對象 -->
<property name="userDao" ref="userDao"></property>
</bean>
(3)創建測試文件 TestService.java:
package cn.itcast.c3p0;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestService {
@Test
public void testDemo(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService service = (UserService) context.getBean("userService");
service.add();
}
}
運行測試文件,我們在數據庫中查看結果:
可以看到成功插入了"李雷"這條記錄。