I have a problem.
try {
jdbcConnect( ); //get mysql connect
conn.setAutoCommit( false );
pstmt = conn.prepareStatement (
"INSERT INTO member ( member_name, member_introduce ) VALUES ( ?, ? )", Statement.RETURN_GENERATED_KEYS );
pstmt.setString( 1, "something" );
pstmt.setString( 2, "something" );
pstmt.executeUpdate( );
rs = pstmt.getGeneratedKeys( );
rs.next( );
String no = Integer.toString( rs.getInt( 1 );
pstmt = conn.prepareStatement ( "UPDATE account SET account_name = ? WHERE account_no = ?" );
pstmt.setString( 1, "something");
pstmt.setString( 2, no );
pstmt.executeUpdate( );
conn.commit( );
conn.setAutoCommit( true );
} catch ( SQLException t ) {
try {
if (conn != null) {
conn.rollback();
conn.setAutoCommit( true );
}
} catch ( SQLException e ) {
}
}//close conn and prepareStatement
I was expect working commit.
But If an error occurs update statement, insert statement is running.
What is wrong?
I think that you are using MyISAM table instead of InnoDB. MyISAM does not support transaction at all.
Related
Can Someone Help me to set the background color of a jtextfield using the result of the query statement
My code compiled but I didn't have my result for now
public void mouseClicked( MouseEvent arg0 )
{
DefaultTableModel model = (DefaultTableModel) table_Vols_Disponibles.getModel();
// get the selected row index
int selectedRowIndex = table_Vols_Disponibles.getSelectedRow();
// set the selected row data into jtextfields
txt_ID_Vol.setText( model.getValueAt( selectedRowIndex, 0 ).toString() );
txt_ID_Avion.setText( model.getValueAt( selectedRowIndex, 1 ).toString() );
txt_Heure_Depart.setText( model.getValueAt( selectedRowIndex, 2 ).toString() );
txt_Heure_Arrivee.setText( model.getValueAt( selectedRowIndex, 3 ).toString() );
txt_Duree.setText( model.getValueAt( selectedRowIndex, 4 ).toString() );
txt_Ville_Depart.setText( model.getValueAt( selectedRowIndex, 5 ).toString() );
txt_Ville_Arrivee.setText( model.getValueAt( selectedRowIndex, 6 ).toString() );
// int row =table_Vols_Disponibles.getSelectedRow();
// String cell=table_Vols_Disponibles.getModel().getValueAt(row, 0).toString();
try
{
Class.forName( "com.mysql.jdbc.Driver" );
Connection connection = DriverManager.getConnection( "jdbc:mysql://localhost:3306/billet_avion", "root", "" );
String sql = "Select siege from sieges where id_vo='" + txt_ID_Vol + "' ";
PreparedStatement preparedStatement = connection.prepareStatement( sql );
ResultSet resultSet = preparedStatement.executeQuery( sql );
String siege1 = txtTest.getText();
String NBsiege = resultSet.getString( "siege" );
if( NBsiege == siege1 )
{
txtTest.setBackground( Color.green );
}
}
catch( ClassNotFoundException e )
{
e.printStackTrace();
}
catch( SQLException throwables )
{
throwables.printStackTrace();
}
}
When you compare Strings you need to compare the content but not their memory addresses.
Since == is an operator, it compares memory addresses rather than the content
Change
if( NBsiege == siege1 )
{
txtTest.setBackground( Color.green );
}
to
if( siege1.equals(NBsiege) )
{
txtTest.setBackground( Color.green );
}
A suggestion.
Creating the database connection like this in methods is not a good practice. You can use a separate class to do it for you. Please note that creating a database connection is an expensive task. Therefore you should reuse created connection using a Connection pool or similar mechanisam
Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 3 years ago.
Improve this question
I have tried to add stmt.executeUpdate(); to insert to the database, but it still not working!! After processing, no error is shown but no data is insert into the database.
try {
// do insert
String preparedSQL = "insert into abc (NUM, ID) VALUES (?,?)";
for(int i = 1; i < r.length; i++)
{
stmt = conn.prepareStatement(preparedSQL);
// SQL parameters
setString(stmt, i++, Num);
setString(stmt, i++, r[i]);
stmt.executeQuery();
}
stmt.executeUpdate();
stmt.close();
} catch (SQLException e) {
PrintWriter out = new PrintWriter(new OutputStreamWriter(res
.getOutputStream(), "Big5"), true);
res.setContentType("text/html; charset=utf-8");
res.setHeader("cache-control", "no-cache");
res.setHeader("Pragma", "no-cache");
res.setIntHeader("expiry", -1000);
out.println("..<!--" + RSCommonUtil.HTMLEncode(e.toString()) + "para in title not valid" +
RSCommonUtil.HTMLEncode(pDate.toString())
+ " " + RSCommonUtil.HTMLEncode(startPubDateAndEndPubDate[0].toString()) + " "
+ RSCommonUtil.HTMLEncode(startPubDateAndEndPubDate[1].toString()) + "-->");
debug.p("insert error" + e);
failed = true;
} finally {
try {
// finalize DB
if (stmt != null) {
stmt.close();
stmt = null;
}
} catch (SQLException sqle) {
}
}
executeUpdate is for create, drop, insert, update, delete etc., (i.e., updating your table), executeQuery is for select. It returns an instance of ResultSet.
See here for simple explanation: https://www.javatpoint.com/PreparedStatement-interface
Also, your setString has an incorrect number of parameters and it should be called as a method of the statement object, and the parameterIndex (first parameter of the setString method) should just be i, as you will otherwise increment three times for each iteration. I also changed the loop to start at 0, don't know why you would start at 1 as a normal array should start at 0.
So your main block would be something like this:
...
// do insert
String preparedSQL = "insert into abc (NUM, ID) VALUES (?,?)";
PreparedStatement stmt = conn.prepareStatement(preparedSQL);
for(int i = 0; i < r.length; i++)
{
// SQL parameters
stmt.setString(i, Num);
stmt.setString(i, r[i]);
stmt.executeUpdate();
}
stmt.close();
...
Inside the try block, try rewriting the code as follows:
String preparedSQL = "insert into abc (NUM, ID) VALUES (?,?)";
for(int i = 1; i < r.length; i++)
{
stmt = conn.prepareStatement(preparedSQL);
// SQL parameters
stmt.setString(1, Num);
stmt.setString(2, r[i]);
stmt.executeUpdate();
stmt.close();
}
The setString method takes only two parameters.
public void setString(int paramIndex, String value)
Here 'paramIndex' refers to the index of the parameter in your prepared statement and 'value' refers to which value you want to insert at that index.
The executeQuery() method of prepared statement interface is used for SELECT queries. But in your case, since the statement is an INSERT query, you will have to use executeUpdate() method. This method is used for CREATE, DROP, UPDATE, INSERT, etc. statements.
Refer this for more information regarding prepared statements and sample code.
The other Answers by yalda and by Nitish are both correct, with good advice. Ditto for some comments on the Question. I can add one more thought, plus a full working example app that writes and reads rows using the H2 Database Engine.
Try-With-Resources
Use the try-with-resources syntax to shorten your code, and guarantee your resources get closed appropriately.
Example app
package work.basil.example;
import org.h2.jdbcx.JdbcDataSource;
import java.sql.*;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.util.UUID;
public class H2DateTimeExample
{
public static void main ( String[] args )
{
H2DateTimeExample app = new H2DateTimeExample ();
app.demo ();
}
private void demo ( )
{
JdbcDataSource dataSource = new JdbcDataSource ();
dataSource.setURL ( "jdbc:h2:mem:offsetdatetime_example_db;DB_CLOSE_DELAY=-1" ); // Set `DB_CLOSE_DELAY` to `-1` to keep in-memory database in existence after connection closes.
dataSource.setUser ( "scott" );
dataSource.setPassword ( "tiger" );
// Create table.
String sql = "CREATE TABLE person_ ( \n" +
" pkey_ UUID NOT NULL DEFAULT RANDOM_UUID() PRIMARY KEY , \n" +
" name_ VARCHAR NOT NULL , \n" +
"first_contacted_ TIMESTAMP WITH TIME ZONE NOT NULL " +
") ;";
// System.out.println ( sql );
try (
Connection conn = dataSource.getConnection () ;
Statement stmt = conn.createStatement () ;
)
{
stmt.execute ( sql );
} catch ( SQLException e )
{
e.printStackTrace ();
}
// Insert row.
sql = "INSERT INTO person_ ( name_ , first_contacted_ ) \n";
sql += "VALUES ( ? , ? ) \n";
sql += ";";
try (
Connection conn = dataSource.getConnection () ;
PreparedStatement pstmt = conn.prepareStatement ( sql , Statement.RETURN_GENERATED_KEYS ) ;
)
{
OffsetDateTime odt = OffsetDateTime.now ( ZoneOffset.UTC );
pstmt.setString ( 1 , "Jesse Johnson" );
pstmt.setObject ( 2 , odt );
pstmt.executeUpdate ();
ResultSet rs = pstmt.getGeneratedKeys ();
// System.out.println( "INFO - Reporting generated keys." );
// while ( rs.next() ) {
// UUID uuid = rs.getObject( 1 , UUID.class );
// System.out.println( "generated keys: " + uuid );
// }
} catch ( SQLException e )
{
e.printStackTrace ();
}
// Query table.
sql = "TABLE person_ ;";
try (
Connection conn = dataSource.getConnection () ;
PreparedStatement pstmt = conn.prepareStatement ( sql ) ;
)
{
try ( ResultSet rs = pstmt.executeQuery () ; )
{
while ( rs.next () )
{
UUID pkey = rs.getObject ( "pkey_" , UUID.class );
String name = rs.getString ( "name_" );
OffsetDateTime firstContacted = rs.getObject ( "first_contacted_" , OffsetDateTime.class );
System.out.println ( "pkey: " + pkey + " | name: " + name + " | firstContacted: " + firstContacted );
}
}
} catch ( SQLException e )
{
e.printStackTrace ();
}
System.out.println ( "Done." );
}
}
pkey: 0819123b-5c7f-4859-bd1b-f9dac82b855f | name: Jesse Johnson | firstContacted: 2019-08-03T18:16:30.367840Z
Done.
I have a program where I extract a text from PDF file and insert those text in a form of words into a table in MySQL.
I have two tables, a queue table and a word table.
The program retrieves a file from the queue table and build an index of words to the word table.
It works fine, but the problem is it only grabs one file but not the other files after that. Meaning, it only perform on the 1st file and then it closes. I am using a while loop and I disable autocommit so I have to commit it manually.
Did I make any mistake?
Code:
public void index1() throws Exception
{
try
{
// Connection con1=con.connect();
Connection con1 = con.connect();
Statement statement = con1.createStatement();
ResultSet rs = statement.executeQuery( "select * from filequeue where Status='Active' LIMIT 5" );
while ( rs.next() )
{
// get the filepath of the PDF document
String path1 = rs.getString( 2 );
int getNum = rs.getInt( 1 );
// while running the process, update status : Processing
//updateProcess_DB(getNum);
Statement test = con1.createStatement();
test.executeUpdate( "update filequeue SET STATUS ='Processing' where UniqueID=" + getNum );
try
{
// call the index function
/*Indexing process = new Indexing();
process.index(path1);*/
PDDocument document = PDDocument.load( new File( path1 ) );
if ( !document.isEncrypted() )
{
PDFTextStripper tStripper = new PDFTextStripper();
String pdfFileInText = tStripper.getText( document );
String lines[] = pdfFileInText.split( "\\r?\\n" );
for ( String line : lines )
{
String[] words = line.split( " " );
String sql = "insert IGNORE into test.indextable values (?,?);";
preparedStatement = con1.prepareStatement( sql );
int i = 0;
for ( String word : words )
{
// check if one or more special characters at end of string then remove OR
// check special characters in beginning of the string then remove
// insert every word directly to table db
word = word.replaceAll( "([\\W]+$)|(^[\\W]+)", "" );
preparedStatement.setString( 1, path1 );
preparedStatement.setString( 2, word );
preparedStatement.addBatch();
i++;
if ( i % 1000 == 0 )
{
preparedStatement.executeBatch();
System.out.print( "Add Thousand" );
}
}
if ( i > 0 )
{
preparedStatement.executeBatch();
System.out.print( "Add Remaining" );
}
}
}
// con1.commit();
// con1.close();
preparedStatement.close();
System.out.println( "Successfully commited changes to the database!" );
// After completing the process, update status: Complete
Statement pre = con1.createStatement();
pre.executeUpdate( "update filequeue SET STATUS ='Complete' where UniqueID=" + getNum );
con1.commit();
preparedStatement.close();
System.out.println( "Successfully commited changes to the database!" );
con1.close();
// updateComplete_DB(getNum);
}
catch ( Exception e )
{
try
{
System.err.println( e );
// updateError_DB(getNum);
// update status = Error in queue table if any error
Statement statement1 = con1.createStatement();
statement1.execute( "update filequeue SET STATUS ='Error' where UniqueID=" + getNum );
// add rollback function
rollbackEntries();
}
catch ( Exception e1 )
{
System.out.println( "Could not rollback updates :" + e1.getMessage() );
}
}
}
}
catch ( Exception e )
{
}
}
I have scanned my project using fortify tool, in the generated fortify report I got Unreleased Resource: Database issue in the following method.
public String handleInput( HttpServletRequest request, HtmlGenerator htmlGenObj ) {
HashMap old_child_list = new HashMap();
HashMap old_parent_list = new HashMap();
HashMap new_child_list = new HashMap();
HashMap new_parent_list = new HashMap();
logger.debug( "Start of handle Input" );
String dataSource = request.getParameter( "datasource" ) == null ? "" : request.getParameter( "datasource" );
String sortBy = request.getParameter( "sortby" ) == null ? "" : request.getParameter( "sortby" );
long sqlConsStartTime = System.currentTimeMillis();
//
// Get the sql query based on data source
//
String sqlQuery = this.getSql( dataSource, request );
// If any error then return
if( sqlQuery.startsWith( "ERROR" ) ) {
return sqlQuery;
}
if( sortBy.trim().length() > 0 ) {
logger.debug( "Sort by value = " + sortBy );
int orderByIndex = sqlQuery.indexOf( "order by" );
// If order by already exists then remove that value.
if( orderByIndex > 0 ) {
sqlQuery = sqlQuery.substring( 0, orderByIndex );
}
sqlQuery = sqlQuery + " order by " + sortBy;
}
plog.debug( getUniqueId( request ) + "SQL Construction Time = " + ( ( System.currentTimeMillis()- sqlConsStartTime )/1000.0 ) );
logger.info( "Final SQL = " + sqlQuery );
String results = "NONE";
Connection conn = null;
try {
Context initCtx = new InitialContext();
Context envCtx = ( Context ) initCtx.lookup( "java:comp/env" );
// Look up for the data source
DataSource ds = ( DataSource ) envCtx.lookup( "NavigatorCon" );
conn = ds.getConnection();
htmlGenObj.setSql( sqlQuery );
if( dataSource.equals( "compass" ) ) {
results = doCompassSearch( sqlQuery, conn, request, old_parent_list, old_child_list );
String matchType = request.getParameter( "coname_st" ) == null ? "" : request.getParameter( "coname_st" );
if( "fuzzy".equals( matchType ) ) {
long rollupSqlConsStartTime = System.currentTimeMillis();
String rollupSql = build_rollup_sql( conn, old_parent_list, old_child_list, new_parent_list, new_child_list ); //System.out.println( "Rollup SQL: " + rollupSql );
plog.debug(getUniqueId(request)+"Rollup SQL Construction Time = "+ ((System.currentTimeMillis()- rollupSqlConsStartTime)/1000.0) );
if( rollupSql.length() > 0 ) {
String rollupResult = doCompassSearch( rollupSql, conn, request, old_parent_list, old_child_list );
results = results + rollupResult;
// Build the new sql which returns both parent and child records.This is used in Excel download
sqlQuery = sqlQuery + " UNION " + rollupSql;
} //System.out.println( "Navigator Query is: \n" + sqlQuery + "\n" );
htmlGenObj.setSql( sqlQuery );
}
}
else if( dataSource.equals( "psar" ) ) {
results = getAMSearchResults( sqlQuery, conn, request, htmlGenObj );
}
else if( dataSource.equals( "knac" ) ) {
results = do_knac_search( sqlQuery, conn, request );
}
else if( dataSource.equals( "auth_user" ) ) {
results = do_auth_user_search( sqlQuery, conn, request );
}
else if( "docstore".equalsIgnoreCase( dataSource ) ) {
results = this.doDocStoreSearch( sqlQuery, conn, request );
}
}
catch( Exception sqle ) {
logger.fatal( "Error : " + sqle.toString(), sqle );
}
finally {
try {
conn.close();
}
catch( Exception e ) {
// giveup
}
}
old_child_list.clear();
old_parent_list.clear();
new_child_list.clear();
new_parent_list.clear();
logger.debug( "End of handle Input");
return results;
}
As per my knowledge this issue will come if the connection is not closed properly, but in this connection is closed inside finally block.
Can any one suggest me how to resolve it? xxxxxx
A NullPointerException maybe thrown, hence maybe change the second Exception into Throwable as NullPointerException is derived from the checked Exception class. Maybe the code analysis had a problem here.
And then, since Java 7 you can use try-with-resources to automatically close things:
try (Connection con = getDbConnection()) {
without finally. Also holds for the PreparedStatement and ResultSet.
As you named quality: it is deemed better style to use SQLException e, or something like SQLException | NullPointerException e.
You're not closing the ResultSet rs and the PreparedStatement ps. Maybe that's the issue.
In terms of fortify and security I would pay more attention o your SQL Injection...
String sortBy = request.getParameter...
[...]
sqlQuery = sqlQuery + " order by " + sortBy;
In general Fortify can generate a huge number of false positive results.
Suppose I have a table MYtable as given below:
ID A B C
1 100 APPLE CAKE
2 200 BANANA PIE
I want to be able to save all these table records into a list (of some kind) and iterate through each record.
Query would be :
select * from Mytable where ID in (1,2,3)
So,the list should have 2 records:
record1 should contain 1,100,APPLE,CAKE
and record2 should contain 2,200,BANANA,PIE
I also want to be able to iterate through each record
So for record1 - I want to getColumnA i.e 100, getColumnB i.e APPLE, and so on
List<YourObject> listOfObjects = new ArrayList<YourObject>();
while(rs.next()){
int id = rs.getInt(1);
int A = rs.getInt(2);
String B= rs.getString(3);
String C = rs.getString(4);
YourObject ob = new YourObject (id, A, B, C);
listOfObjects.add(ob); //now you have the list of objects .. iterate trough it
}
First you will need JDBC to connect to the database.
You can use Statement or PreparedStatement to fetch data from database and then you can get that data stored in ResultSet.
Now you can iterate through the results in ResultSet.
For that you need to implement JDBC.
After creating JDBC connection. Execute query and the fetch records from the resultset. From a record you can fetch particular columns as well.
see following example how to work with jdbc basic
http://www.jdbc-tutorial.com/
import java.sql.* ;
class JDBCQuery
{
public static void main( String args[] )
{
try
{
// Load the database driver
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ) ;
// Get a connection to the database
Connection conn = DriverManager.getConnection( "jdbc:odbc:Database" ) ;
// Print all warnings
for( SQLWarning warn = conn.getWarnings(); warn != null; warn = warn.getNextWarning() )
{
System.out.println( "SQL Warning:" ) ;
System.out.println( "State : " + warn.getSQLState() ) ;
System.out.println( "Message: " + warn.getMessage() ) ;
System.out.println( "Error : " + warn.getErrorCode() ) ;
}
// Get a statement from the connection
Statement stmt = conn.createStatement() ;
// Execute the query
ResultSet rs = stmt.executeQuery( "select * from Mytable where ID in (1,2,3)" ) ;
// Loop through the result set
while( rs.next() )
{
System.out.println( rs.getString('ID') ) ;
System.out.println( rs.getString('A') ) ;
System.out.println( rs.getString('B') ) ;
System.out.println( rs.getString('C') ) ;
}
// Close the result set, statement and the connection
rs.close() ;
stmt.close() ;
conn.close() ;
}
catch( SQLException se )
{
System.out.println( "SQL Exception:" ) ;
// Loop through the SQL Exceptions
while( se != null )
{
System.out.println( "State : " + se.getSQLState() ) ;
System.out.println( "Message: " + se.getMessage() ) ;
System.out.println( "Error : " + se.getErrorCode() ) ;
se = se.getNextException() ;
}
}
catch( Exception e )
{
System.out.println( e ) ;
}
}
}