SpringJDBC返回数据库最新id写法

应一个好友要求写一个SpringJDBC 的文章 , 介绍返回操作数据库最新id写法

原创  2015年07月29日 17:46:54

Spring Jdbc 解决了繁琐的statement 创建 连接的打开 关闭 异常的处理

spring给我们提供了jdbc的统一封装,和其它的orm不同,它是对jdbc api的封装,相当于我们自己写的java bean,而没有对对象模型进行封装(比如将po封装为pojo)。它保持了jdbc数据对象的原始性,具有极大程度的灵活性,其性能也极高。


下面所有代码都已经亲测


[java]  view plain  copy
  1. import java.sql.Connection;  
  2. import java.sql.PreparedStatement;  
  3. import java.sql.ResultSet;  
  4. import java.sql.SQLException;  
  5. import java.sql.Statement;  
  6. import java.util.ArrayList;  
  7. import java.util.Arrays;  
  8. import java.util.Collection;  
  9. import java.util.List;  
  10. import java.util.Map;  
  11.   
  12. import org.junit.After;  
  13. import org.junit.Before;  
  14. import org.junit.Test;  
  15. import org.springframework.jdbc.core.BatchPreparedStatementSetter;  
  16. import org.springframework.jdbc.core.JdbcTemplate;  
  17. import org.springframework.jdbc.core.PreparedStatementCreator;  
  18. import org.springframework.jdbc.core.PreparedStatementSetter;  
  19. import org.springframework.jdbc.core.RowCallbackHandler;  
  20. import org.springframework.jdbc.core.RowMapper;  
  21. import org.springframework.jdbc.datasource.DriverManagerDataSource;  
  22. import org.springframework.jdbc.support.GeneratedKeyHolder;  
  23. import org.springframework.jdbc.support.KeyHolder;  
  24.   
  25. public class SJTest {  
  26.   
  27.     JdbcTemplate jdbcTemplate = new JdbcTemplate();  
  28.   
  29.     @Before  
  30.     public void init() {  
  31.         DriverManagerDataSource ds = new DriverManagerDataSource();  
  32.         ds.setDriverClassName("com.mysql.jdbc.Driver");  
  33.         ds.setUrl("jdbc:mysql://127.0.0.1:3306/test");  
  34.         ds.setUsername("root");  
  35.         ds.setPassword(""); // 我的数据库没有密码  
  36.   
  37.         jdbcTemplate.setDataSource(ds);  
  38.     }  
  39.       
  40.   
  41.     /** 
  42.      * 添加 
  43.      */  
  44.     @Test  
  45.     public void add() {  
  46.         String sql = "insert into student(sid,name) values(?,?)";  
  47.         jdbcTemplate.update(sql, new Object[] { 3"321" });  
  48.     }  
  49.   
  50.     /** 
  51.      * 修改 
  52.      */  
  53.     @Test  
  54.     public void update() {  
  55.         String sql = "update student set name=? where sid=?";  
  56.         jdbcTemplate.update(sql, new Object[] { "432"3 });  
  57.     }  
  58.   
  59.     /** 
  60.      * 删除 
  61.      */  
  62.     @Test  
  63.     public void delete() {  
  64.         String sql = "delete from student where sid = ?";  
  65.         jdbcTemplate.update(sql, new Object[] { 3 });  
  66.     }  
  67.   
  68.     /** 
  69.      * 查询在程序设计当中占用的比重较重, 所以我出多种写法 来进行表现 
  70.      * 在spring 中拥有较多查询方法 
  71.      */  
  72.       
  73.       
  74.     // ----------------------------------首先介绍 query 开头方法  
  75.       
  76.     /** 
  77.      * 在下面的两个方法中 第一个不会产生非常多的系统开销,第二个非常浪费系统性能 不推荐使用 会产生 内存溢出 
  78.      * 产生的原因主要在 用法上 第一种 processRow() 方法里面在内部实现中逐行获取 user 数据 
  79.      *                    第二种  mapRow() 返回一个集合通过遍历来达成目的 
  80.      * 如果你无法理解 可以在网上查下 RowCallbackHandler 和 RowMapper 的比较 
  81.      */  
  82.       
  83.     @Test  
  84.     public void select() {  
  85.         // org.springframework.jdbc.core.RowCallbackHandler  是一个回调接口  
  86.         String sql = "select * from student where sid=?";  
  87.           
  88.         final Student student = new Student();  
  89.           
  90.         jdbcTemplate.query(sql, new Object[]{8} , new RowCallbackHandler() {  
  91.               
  92.             @Override  
  93.             public void processRow(ResultSet rs) throws SQLException {  
  94.                 // TODO Auto-generated method stub  
  95.                 student.setAge(rs.getString("age"));  
  96.                 student.setId(rs.getLong("sid"));  
  97.             }  
  98.         });  
  99.           
  100.         System.out.println(student.toString());  
  101.     }  
  102.       
  103.     @Test  
  104.     public void query() {  
  105.         String sql = "select * from student";  
  106.           
  107.         List<List<Student>> student2 = jdbcTemplate.query(sql, new RowMapper<List<Student>>(){  
  108.               
  109.             final List<Student >  student = new ArrayList<Student> ();  
  110.               
  111.             @Override  
  112.             public List<Student> mapRow(ResultSet rs, int rowNum) throws SQLException {  
  113.                 final Student stu = new Student();  
  114.                 stu.setAge(rs.getString("age"));  
  115.                 stu.setId(rs.getLong("sid"));  
  116.                 student.add(stu);  
  117.                 return student;  
  118.             }  
  119.         });  
  120.         System.out.println(Arrays.toString(student2.toArray()));  
  121.     }  
  122.       
  123.       
  124.       
  125.     /** 
  126.      * 在有些时候我们执行完操作需要返回数据库表的最新id spring 已经帮助我们做好了 不需要再编写sql 语句查询了 
  127.      * 我扩展下 其实spring 也是在jdbc 基础上封装的 很多刚学习的认为spring 怎么怎么样 
  128.      * 在jdbc 中 也有相应地方法我给大家演示下两种 Statement 和 PreparedStatement 
  129.      */  
  130.       
  131.     /** 
  132.      * 使用jdbc Statement 返回里面的id  
  133.      * @throws SQLException  
  134.      */  
  135.     @Test  
  136.     public void jdbcNativeID () throws SQLException {  
  137.          String sql = "insert into student(sid,name) values(7,'457')";  
  138.          Connection conn = jdbcTemplate.getDataSource().getConnection();  
  139.          Statement stmt = conn.createStatement();  
  140.            
  141.          // Statement.RETURN_GENERATED_KEYS 可以绑定数据库产生的id  
  142.          // Statement.NO_GENERATED_KEYS 不产生id 默认可能。  
  143.          stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);  
  144.            
  145.          ResultSet rs = stmt.getGeneratedKeys();  
  146.            
  147.          if(rs.next())  
  148.          System.out.println("这是一个返回 数据库id 的打印 " + rs.getInt(1));  
  149.     }  
  150.       
  151.     /** 
  152.      * 使用jdbc PreparedStatement 返回里面的id  
  153.      * @throws SQLException 
  154.      */  
  155.     @Test  
  156.     public void jdbcNativeId() throws SQLException {  
  157.          String sql = "insert into student(sid,name) values(8,'457')";  
  158.          Connection conn = jdbcTemplate.getDataSource().getConnection();  
  159.          PreparedStatement ps = conn.prepareStatement(sql,PreparedStatement.RETURN_GENERATED_KEYS);  
  160.          ps.executeUpdate();  
  161.          ResultSet rs  = ps.getGeneratedKeys();  
  162.            
  163.          if(rs.next())  
  164.          System.out.println("这是一个返回 数据库id 的打印 " + rs.getInt(1));  
  165.     }  
  166.       
  167.     /** 
  168.      * 这是在spring 中返回最新id 的处理方式 
  169.      */  
  170.     @Test  
  171.     public void resultID() {  
  172.           
  173.         KeyHolder keyHolder = new GeneratedKeyHolder();  
  174.   
  175.         final String sql = "insert into student(sid,name) values(?,?)";  
  176.           
  177.         jdbcTemplate.update(new PreparedStatementCreator() {  
  178.   
  179.             @Override  
  180.             public PreparedStatement createPreparedStatement(Connection con)  
  181.                     throws SQLException {  
  182.                 // TODO Auto-generated method stub  
  183.                   
  184.                 PreparedStatement ps = con.prepareStatement(sql);  
  185.                 ps.setString(1"4");  
  186.                 ps.setString(2"457");  
  187.                 return ps;  
  188.             }  
  189.         }, keyHolder);  
  190.           
  191.         /** 
  192.          * 可以调用 keyHolder.getKeyList(); 返回 List<Map<String, Object>> 或者 
  193.          * keyHolder.getKeys(); 返回 Map<String, Object> 
  194.          */   
  195.         System.out.println(keyHolder.getKey().intValue());  
  196.     }  
  197.   
  198.       
  199.       
  200.     /** 
  201.      * 这是一种spring 批处理方式 
  202.      */  
  203.     @Test  
  204.     public void batchUpdate() {  
  205.         String sql = "insert into student(sid,age) values(?,?)";  
  206.           
  207.         final List<Student>  list = new ArrayList<Student>();  
  208.           
  209.         for(int i =  1 ;  i< 10; i ++) {  
  210.             Student student = new Student();  
  211.             student.setAge(i + "1");  
  212.             student.setId(9 + i);  
  213.             list.add(student);  
  214.         }  
  215.           
  216.         jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {  
  217.               
  218.             @Override  
  219.             public void setValues(PreparedStatement ps, int i) throws SQLException {  
  220.                 // TODO Auto-generated method stub  
  221.                 Student  obj = list.get(i);  
  222.                 ps.setLong(1, obj.getId());  
  223.                 ps.setString(2, obj.getAge());  
  224.             }  
  225.               
  226.             @Override  
  227.             public int getBatchSize() {  
  228.                 // TODO Auto-generated method stub  
  229.                 return list.size();  
  230.             }  
  231.         });  
  232.     }  
  233.       
  234.     class Student {  
  235.         private long id;  
  236.         private String age;  
  237.   
  238.         public String getAge() {  
  239.             return age;  
  240.         }  
  241.   
  242.         public void setAge(String age) {  
  243.             this.age = age;  
  244.         }  
  245.   
  246.         public long getId() {  
  247.             return id;  
  248.         }  
  249.   
  250.         public void setId(long id) {  
  251.             this.id = id;  
  252.         }  
  253.   
  254.         @Override  
  255.         public String toString() {  
  256.             return "Student [id=" + id + ", age=" + age + "]";  
  257.         }  
  258.   
  259.           
  260.     }  
  261.   
  262. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值