Java Oracle 数据库中的 DAO 插入层
Java DAO Insert Layer in Oracle Database
我有一个 DAO 层可以像这样插入到 DERBY 数据库中,
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;
如果我使用 ORACLE DB 作为数据源,我该如何翻译?
由于 Oracle 不支持 IDENTITY 列,您必须做两件事才能使其正常工作:
- 创建一个 TRIGGER 以使用 SEQUENCE 分配 ID 值。
- 按列名询问值。
这意味着使用 prepareStatement(String sql, String[] columnNames)
version, not the prepareStatement(String sql, int autoGeneratedKeys)
version, when building your PreparedStatement
,因为 Oracle 不知道哪个列是 "auto-generated"。
使用版本名称适用于所有 DBMS 供应商,因此使用它可以使您的代码供应商不可知:
- 甲骨文:触发器
- MySQL:
AUTO_INCREMENT
- MSSQL:
IDENTITY
- PostgreSQL:
SERIAL
- 德比:
GENERATED ALWAYS AS IDENTITY
- ...
我对你的数据库一无所知,但你需要定义插入你的 table id 的方法,你需要为你的 oracle 数据库创建连接 class
你还需要管理你的 table id Increment 你应该创建一个触发器来在每次插入操作后增加 table id
我将 post 一个 select 来自 table 的最大 ID 的方法,您可以在
下面的 link 中找到增加序列的 oracle 触发器
How to create id with AUTO_INCREMENT on Oracle?
首先我们需要创建方法,return 来自您的 table
的最大 ID
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;
}
这两个方法用于打开和关闭您的连接
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();
}
}
现在您可以将您的信息插入您的 table
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;
}
我有一个 DAO 层可以像这样插入到 DERBY 数据库中,
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;
如果我使用 ORACLE DB 作为数据源,我该如何翻译?
由于 Oracle 不支持 IDENTITY 列,您必须做两件事才能使其正常工作:
- 创建一个 TRIGGER 以使用 SEQUENCE 分配 ID 值。
- 按列名询问值。
这意味着使用 prepareStatement(String sql, String[] columnNames)
version, not the prepareStatement(String sql, int autoGeneratedKeys)
version, when building your PreparedStatement
,因为 Oracle 不知道哪个列是 "auto-generated"。
使用版本名称适用于所有 DBMS 供应商,因此使用它可以使您的代码供应商不可知:
- 甲骨文:触发器
- MySQL:
AUTO_INCREMENT
- MSSQL:
IDENTITY
- PostgreSQL:
SERIAL
- 德比:
GENERATED ALWAYS AS IDENTITY
- ...
我对你的数据库一无所知,但你需要定义插入你的 table id 的方法,你需要为你的 oracle 数据库创建连接 class
你还需要管理你的 table id Increment 你应该创建一个触发器来在每次插入操作后增加 table id 我将 post 一个 select 来自 table 的最大 ID 的方法,您可以在
下面的 link 中找到增加序列的 oracle 触发器How to create id with AUTO_INCREMENT on Oracle?
首先我们需要创建方法,return 来自您的 table
的最大 ID 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;
}
这两个方法用于打开和关闭您的连接
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();
}
}
现在您可以将您的信息插入您的 table
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;
}