Oracle数据库中的javadao插入层
我有一个DAO层要像这样插入到DERBY db中Oracle数据库中的javadao插入层,java,sql,oracle,dao,Java,Sql,Oracle,Dao,我有一个DAO层要像这样插入到DERBY db中 try { long id = dbAccess.insert(connection, "INSERT INTO BOOKS(NAME, AUTHORS, PUBLISHYEAR, AVAIL) VALUES (?, ?, ?, ?)", new ScalarHandler<BigDecimal>(), book.getName(), book.getAuthor
try {
long id = dbAccess.insert(connection,
"INSERT INTO BOOKS(NAME, AUTHORS, PUBLISHYEAR, AVAIL) VALUES (?, ?, ?, ?)",
new ScalarHandler<BigDecimal>(),
book.getName(),
book.getAuthors(),
book.getPublishedYear(),
book.isAvailable()
).longValue();
return id;
} catch (Exception e) {
e.printStackTrace();
}
return -1L;
试试看{
long id=dbAccess.insert(连接、,
“在书中插入(姓名、作者、出版年份、效用)值(?,,?,?)”,
新建ScalarHandler(),
book.getName(),
book.getAuthors(),
book.getPublishedYear(),
可供使用的书
).longValue();
返回id;
}捕获(例外e){
e、 printStackTrace();
}
返回-1L;
如果我使用ORACLE DB作为数据源,如何翻译此内容?由于ORACLE不支持标识列,您必须做两件事才能使其正常工作:
- 创建触发器以使用序列分配ID值
- 按列名请求值
- 甲骨文:触发器
- MySQL:
自动增量
- MSSQL:
标识
- PostgreSQL:
SERIAL
- Derby:
始终作为标识生成
public static int getMaxBookID(Connection connection){
int id=0;
String sql = "SELECT NVL(MAX(ID),0)+1 FROM BOOK ";
try{
PreparedStatement statement = connection.prepareStatement(sql);
if(statement!=null){
try{
ResultSet results = statement.executeQuery();
if(results != null){
try{
if(results.next()){
id = results.getInt(1);
}
}
catch(Exception resultSetException) {resultSetException.printStackTrace();
}
results.close();
}
}
catch(Exception statmentExcption){statmentExcption.printStackTrace();
}
statement.close();
}
} catch (Exception generalException){generalException.printStackTrace();
}
return id;
}
public int AddBook(String name,String auth,String year , String avail){
int id=0;
Connection connection = lockConnection();
boolean ok = false;
String sql = "INSERT INTO BOOKS(ID,NAME, AUTHORS, PUBLISHYEAR, AVAIL)"
+ " VALUES(?,?,?,?,?)";
try{
PreparedStatement statement = connection.prepareStatement(sql);
if(statement!=null){
statement.setInt(1,getMaxBookID(connection));
statement.setString(2,name);
statement.setString(3,auther);
statement.setString(4,year);
statement.setString(5,avail);
try{
int count = statement.executeUpdate();
ok = count == 1;
if(!ok)id=0;
}
catch(Exception statmentExcption){statmentExcption.printStackTrace();statmentExcption.printStackTrace(); return 0 ;
}
statement.close();
}
} catch (Exception generalException){generalException.printStackTrace(); generalException.printStackTrace(); return 0;
}
closeMyConnection(connection);
return id;
}
这两种方法用于打开和关闭连接
private static final String DB_DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DB_CONNECTION = "jdbc:oracle:thin:@//host:1526/databasename";
private static final String DB_USER = "username";
private static final String DB_PASSWORD = "passowrd";
public static Connection lockConnection() {
Connection dbConnection = null;
try {
Class.forName(DB_DRIVER);
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
try {
return DriverManager.getConnection(
DB_CONNECTION, DB_USER, DB_PASSWORD);
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return dbConnection;
}
public static void closeMyConnection(Connection connection) {
try {
connection.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
现在,您可以将信息插入表中
public static int getMaxBookID(Connection connection){
int id=0;
String sql = "SELECT NVL(MAX(ID),0)+1 FROM BOOK ";
try{
PreparedStatement statement = connection.prepareStatement(sql);
if(statement!=null){
try{
ResultSet results = statement.executeQuery();
if(results != null){
try{
if(results.next()){
id = results.getInt(1);
}
}
catch(Exception resultSetException) {resultSetException.printStackTrace();
}
results.close();
}
}
catch(Exception statmentExcption){statmentExcption.printStackTrace();
}
statement.close();
}
} catch (Exception generalException){generalException.printStackTrace();
}
return id;
}
public int AddBook(String name,String auth,String year , String avail){
int id=0;
Connection connection = lockConnection();
boolean ok = false;
String sql = "INSERT INTO BOOKS(ID,NAME, AUTHORS, PUBLISHYEAR, AVAIL)"
+ " VALUES(?,?,?,?,?)";
try{
PreparedStatement statement = connection.prepareStatement(sql);
if(statement!=null){
statement.setInt(1,getMaxBookID(connection));
statement.setString(2,name);
statement.setString(3,auther);
statement.setString(4,year);
statement.setString(5,avail);
try{
int count = statement.executeUpdate();
ok = count == 1;
if(!ok)id=0;
}
catch(Exception statmentExcption){statmentExcption.printStackTrace();statmentExcption.printStackTrace(); return 0 ;
}
statement.close();
}
} catch (Exception generalException){generalException.printStackTrace(); generalException.printStackTrace(); return 0;
}
closeMyConnection(connection);
return id;
}
可能不同之处在于如何设置连接—当您在Oracle数据库中尝试此操作时遇到某种问题?该代码不会返回新插入行的ID,我认为这是问题的主要点(无论如何,我的解释)。我已经重新发布了我的答案,您可以再次检查。如果两个线程并行执行此操作,它们将尝试添加相同的ID。此外,这也不是很有效。使用SEQUENCE对象分配ID会更好,但会使SQL语句特定于Oracle,除非您在触发器中这样做,但如何获取值呢?使用可以返回生成的值列的值的
prepareStatement
版本。那样的话,你只有一个数据库的周转时间。那很好,我在我的帖子中使用了prestatmnet,但由于我对您的表结构一无所知,我建议您创建一个触发器以避免ID重复,有一个示例说明如何从oracle数据库返回序列值,您只需在创建触发器后更改我在getNextBookId中发布的select查询和序列“SelectyourSeqName.NEXTVAL FROM DUAL”,它将正确地用于标识列的racle。@Mick助记符啊,是的,忘了那个。我猜我的大脑被旧版本卡住了。因为OP并没有指定版本,所以我将把答案作为一个版本无关的解决方案。