原生jdbc示例 與spring JDBC 示例

  • 2019 年 10 月 5 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/qq_37933685/article/details/81676680

個人部落格:https://suveng.github.io/blog/​​​​​​​

原生jdbc與spring整合

JDBC介紹

JDBC API 允許用戶訪問任何形式的表格數據,尤其是存儲在關係資料庫中的數據。

執行流程:

  • 連接數據源,如:資料庫。
  • 為資料庫傳遞查詢和更新指令。
  • 處理資料庫響應並返回的結果。

首先需要把jar包導進來,mysql-connector-java-6.0.6.jar,如果用maven把一下依賴添加進pom.xml

<!--mysql connnector-->  <dependency>      <groupId>mysql</groupId>      <artifactId>mysql-connector-java</artifactId>      <version>6.0.6</version>  </dependency>  <!--end-->

JDBC 編程步驟

  1. 載入驅動程式:
  2. 獲得資料庫連接
  3. 創建StatementPreparedStatement對象:

正在載入類com.mysql.jdbc.Driver'。 這已被棄用。 新的驅動程式類是com.mysql.cj.jdbc.Driver』。 驅動程式通過SPI自動註冊,通常不需要手動載入驅動程式類。

準備數據表

CREATE DATABASE suveng DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;    use suveng;  create table user(  	id int NOT NULL PRIMARY KEY auto_increment,  	name VARCHAR(50) ,  	age int  ) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

原生JDBC示例:

/**   * @author Veng Su [email protected]   * @date 2018/8/14 21:03   */    public class DBUtils {      private String url;      private String username;      private String password;        public String getUrl() {          return url;      }        public void setUrl(String url) {          this.url = url;      }        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;      }        public static void main(String[] args) throws ClassNotFoundException, SQLException {          DBUtils dbUtils=new DBUtils();          dbUtils.setUrl("jdbc:mysql://localhost:3306/suveng?serverTimezone=Asia/Shanghai&characterEncoding=utf8");          dbUtils.setUsername("root");          dbUtils.setPassword("root");  //        1. 載入驅動          Class.forName("com.mysql.cj.jdbc.Driver");          //2. 獲得資料庫連接          Connection conn = DriverManager.getConnection(dbUtils.getUrl(), dbUtils.getUsername(), dbUtils.getPassword());          //3.操作資料庫,實現增刪改查          //預編譯SQL,減少sql執行          String sql="INSERT INTO user (name, age) VALUES ('suveng', 22)";          PreparedStatement  stmt = conn.prepareStatement(sql);          stmt.executeUpdate();            ResultSet rs2 = stmt.executeQuery("SELECT * FROM user");          //如果有數據,rs.next()返回true          while(rs2.next()){              System.out.println(rs2.getString("name")+" 年齡:"+rs2.getInt("age"));          }      }  }

這是使用原生的jdbc鏈接資料庫和增查操作,然而我們spring已經封裝了jdbc了,這樣讓我們的操作變得更簡單。

Spring JDBC示例

編程步驟:

  1. 配置數據源datasource
  2. 初始化jdbcTemplate
  3. 使用jdbcTemplate對資料庫做增刪查改
/**   * @author Veng Su [email protected]   * @date 2018/8/14 22:14   */  public class SpringJDBCDemo {     @Test      public void springJDBCTest() {          //初始化DataSource          DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();          driverManagerDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");          driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/suveng?serverTimezone=Asia/Shanghai&characterEncoding=utf8");          driverManagerDataSource.setUsername("root");          driverManagerDataSource.setPassword("root");          //初始化jdbcTemplate          JdbcTemplate jdbcTemplate = new JdbcTemplate(driverManagerDataSource);          // 查詢一條數據          User user1 = jdbcTemplate.queryForObject("select * from user where id = ?", new BeanMapper(), 1);          System.out.println(user1);            // 刪除  //         jdbcTemplate.update("delete from user where id = ?", 1);            // 修改          jdbcTemplate.update("update user set name = ? where id = ?", "春花", 1);            // 插入          jdbcTemplate.update("insert into user(name,age) values( '花花', 10)");            // 方式2:查詢所有的數據          List<User> list2 = jdbcTemplate.query("select * from user", new BeanMapper());            for (User user : list2) {              System.out.println(user);          }          // 方式1: 查詢所有的數據          List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from user");          for (Map<String, Object> map : list) {              //  map.keySet() 用於獲取所有的 key              for (String key : map.keySet()) {                  // 通過 key 獲取到對應的 value 值                  System.out.print(map.get(key));              }              // 相當於換行效果              System.out.println();          }        }        private class BeanMapper implements org.springframework.jdbc.core.RowMapper<User> {          // 查詢的時候,有可能會返回多個數據,所有的數據都會放在 rs 結果集中          // rounum 代表的是記錄的下表值          public User mapRow(ResultSet resultSet, int i) throws SQLException {              User user=new User();              user.setId(resultSet.getInt("id"));              user.setName(resultSet.getString("name"));              user.setAge(resultSet.getInt("age"));              return user;          }      }  }

測試:

運行結果;

問題

為什麼是用jdbcTemplate需要傳datasource? 這個可以通過類圖說明,初始化jdbcTemplate需要一個datasource介面 而,DriverManagerDateSource的父類實現了dataSource介面,所以可以傳進去構造。如下圖。

DriverManagerDateSource

JdbcTemplate

既然可以new 出來的實例,我們應該交給spring去管理。

在beans.xml配置DataSource和jdbcTemplate

<!--配置DataSource-->  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">      <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>      <property name="url" value="jdbc:mysql://localhost:3306/suveng?serverTimezone=Asia/Shanghai &amp;characterEncoding=utf8"/>      <property name="username" value="root"/>      <property name="password" value="root"/>  </bean>  <!--配置jdbcTemplate-->  <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">      <property name="dataSource" ref="dataSource"/>  </bean>

配置好了,我們可以開始注入了。

/**   * @author Veng Su [email protected]   * @date 2018/8/14 22:14   */  @RunWith(SpringJUnit4ClassRunner.class)  @ContextConfiguration("classpath:spring/config/beans.xml")  public class SpringJDBCDemo {      @Resource      JdbcTemplate jdbcTemplate;      @Test      public void springJDBCXMLTest(){          // 查詢一條數據          User user1 = jdbcTemplate.queryForObject("select * from user where id = ?", new BeanMapper(), 1);          System.out.println(user1);            // 刪除  //         jdbcTemplate.update("delete from user where id = ?", 1);            // 修改          jdbcTemplate.update("update user set name = ? where id = ?", "春花", 1);            // 插入          jdbcTemplate.update("insert into user(name,age) values( ?, ?)", "花花", 1000);            // 方式2:查詢所有的數據          List<User> list2 = jdbcTemplate.query("select * from user", new BeanMapper());            for (User user : list2) {              System.out.println(user);          }          // 方式1: 查詢所有的數據          List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from user");          for (Map<String, Object> map : list) {              //  map.keySet() 用於獲取所有的 key              for (String key : map.keySet()) {                  // 通過 key 獲取到對應的 value 值                  System.out.print(map.get(key));              }              // 相當於換行效果              System.out.println();          }        }      @Test      public void springJDBCTest() {          //初始化DataSource          DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();          driverManagerDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");          driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/suveng?serverTimezone=Asia/Shanghai&characterEncoding=utf8");          driverManagerDataSource.setUsername("root");          driverManagerDataSource.setPassword("root");          //初始化jdbcTemplate          JdbcTemplate jdbcTemplate = new JdbcTemplate(driverManagerDataSource);          // 查詢一條數據          User user1 = jdbcTemplate.queryForObject("select * from user where id = ?", new BeanMapper(), 1);          System.out.println(user1);            // 刪除  //         jdbcTemplate.update("delete from user where id = ?", 1);            // 修改          jdbcTemplate.update("update user set name = ? where id = ?", "春花", 1);            // 插入          jdbcTemplate.update("insert into user(name,age) values( '花花', 10)");            // 方式2:查詢所有的數據          List<User> list2 = jdbcTemplate.query("select * from user", new BeanMapper());            for (User user : list2) {              System.out.println(user);          }          // 方式1: 查詢所有的數據          List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from user");          for (Map<String, Object> map : list) {              //  map.keySet() 用於獲取所有的 key              for (String key : map.keySet()) {                  // 通過 key 獲取到對應的 value 值                  System.out.print(map.get(key));              }              // 相當於換行效果              System.out.println();          }        }          private class BeanMapper implements org.springframework.jdbc.core.RowMapper<User> {          // 查詢的時候,有可能會返回多個數據,所有的數據都會放在 rs 結果集中          // rounum 代表的是記錄的下表值          public User mapRow(ResultSet resultSet, int i) throws SQLException {              User user=new User();              user.setId(resultSet.getInt("id"));              user.setName(resultSet.getString("name"));              user.setAge(resultSet.getInt("age"));              return user;          }      }  }

運行結果:

碼雲程式碼地址:

https://gitee.com/suwenguang/SpringFrameworkDemo

donwnload下來後,其中src/main/java/spring/my/suveng/jdbc才是本文的程式碼源。其他是其他文章的引用。

結論

這就是使用spring jdbc 的快捷之處。更多的對jdbc的探索還是需要時間去研究。加油