spring 學習(四): spring 的 jdbcTemplate 操做
spring 針對 javaee 的每一層,都提供了相應的解決技術,jdbcTemplate 的主要操做在 dao 層。java
下面咱們來使用 jdbcTemplate 對數據庫進行 crud 操做。mysql
準備工做
1 咱們首先來導入 jar 包,仍是類似的使用 maven 來導入,修改配置文件,須要導入 jar 包的配置:spring
<!-- 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 建立對象,設置數據庫信息。這裏以我本身的爲例:sql
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 操做。app
下面就分別來說下 jdbcTemplate 的 curd 操做。maven
首先先建立一個數據庫命名爲 sampledb, 在數據庫中新增一個表。添加幾條記錄,以下:ide
增長
//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(); } }
運行測試文件,咱們在數據庫中查看結果:
能夠看到成功插入了"李雷"這條記錄。