JAVA-JDBC连接数据库一个问题:我采用通过事务提交添加属性值,为什么没有虽然没有添加,但是ID自动增加

JAVA-JDBC连接数据库一个问题:我采用通过事务提交添加属性值,为什么没有虽然没有添加,但是ID自动增加,第1张

首先自增ID本来就被设计成为不参与数据库事务的,原因是什么呢?为了防止ID生成阻塞和防止ID错乱,因为对了一张表来说,不是只有你一个线程在申请ID,其他的新增线程了也在申请ID,假设你在事务中第一次申请到了ID=1,但这时你的事务并没提交,也就是这个等于1的ID现在并没有真正入库,想想这时别人的进程也去申请同一个表的ID时,ID生成器该给他1还是2?当然是2啦!如果你这时你回滚你的事务,假设事务把ID=1回滚了,给回ID生成器,ID生成器还能把它给出去别人用么?肯定不行啦,为啥,如果这时那个上次拿到2的线程这次又去拿,不是要拿到1了?说好的自增呢?!也许你会说可以等你下次申请ID时给你呀,把3给刚刚那个拿了2的呀,不好意思,数据库会话(SqlSession)一关,谁记得你呀!

Java程序向数据库中插入数据,代码如下:

//首先创建数据库,(access,oracle,mysql,sqlsever)其中之一,其中access,sqlsever需要配置数据源(odbc)

//然后再eclipse中创建类(ConnDb,Test,TestBean)ConnDb功能为连接数据库,查询,插入,删除,修改数据的类,Test为含有main方法的测试类,TestBean为数据表中的字段属性及set,get方法

//以下是ConnDb代码:

package db

import java.sql.Connection

import java.sql.DriverManager

import 

java.sql.ResultSet

import java.sql.SQLException

import 

java.sql.Statement

import java.util.ArrayList

public class ConnDb {

public Connection startConn(Connection conn){

  try {

   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")

   conn = DriverManager.getConnection("jdbc:odbc:数据库","用户名", "密码")

  } catch (Exception e) {

   System.out.println("连接数据库时出现错误")

  }

  return conn

 }

 

public ArrayList executeQuery(String sql){

  Connection conn = null

  Statement stmt = null

  ResultSet rs = null

  ArrayList list = new ArrayList()

  try {

   conn = startConn(conn)

   stmt = conn.createStatement()

   rs = stmt.executeQuery(sql)//sql为sql语句例如"select * from 

表名",从main方法中传进来,这里用的是ArrayList 类将查询结果存储起来

   while(rs.next()){

    TestBean tb = new TestBean()

    tb.setTid(rs.getString("tid"))

    tb.setTname(rs.getString("tname"))

    tb.setTinfo(rs.getString("tinfo"))

    list.add(tb)

   }

  } 

catch (SQLException e) {

   // TODO Auto-generated catch block

   e.printStackTrace()

  }finally{

   closeConn(rs,stmt,conn)

  }

  return list

 } 

 public void executeUpdate(String sql){

  Connection conn = null

  Statement stmt = null

  try {

   conn = 

startConn(conn)

   stmt = conn.createStatement()

   stmt.executeUpdate(sql)

  } 

catch (SQLException e) {

   System.out.println("修改,插入或者删除数据库数据时发生错误!")

  }finally{

   closeConn(stmt,conn)

  }

 }

 public void closeConn(ResultSet rs,Statement stmt,Connection conn){

  try {

   if(rs != 

null){

    rs.close()

   }

   if(stmt != null){

    stmt.close()

   }

   if(conn != null){

    conn.close()

   }

  } 

catch (SQLException e) {

   // TODO Auto-generated catch 

block

   System.out.println("关闭数据库的时候发生错误!")

  }

 }

 public void closeConn(Statement stmt,Connection conn){

  try {

   if(stmt != null){

    stmt.close()

   }

   if(conn != null){

    conn.close()

   }

  } 

catch (SQLException e) {

   // TODO Auto-generated catch block

   System.out.println("关闭数据库的时候发生错误!")

  }

 }

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10082479.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存