Create a JAVA program that performs file IO and database interaction via SQL. The program
needs to read data from the provided file: \"Project.csv\" and insert the data into a database. Then
the program needs to create a report from the database sorted by price descending. The report
should be in the format demonstrated below.
id (primary key - generated by the database)
cpuname
performance
price
Project.csv contents:CPU NamePerformancePrice (USD)Intel Core i7-3770K @
3.50GHz9,556$560.50Intel Core i7-3770 @ 3.40GHz9,327$335.55Intel Core i7-3820 @
3.60GHz8,990$404.38AMD FX-8350 Eight-Core8,940$149.99Intel Core i7-2600K @
3.40GHz8,501$379.97Intel Core i7-2600 @ 3.40GHz8,242$214.99Intel Core i7-4720HQ @
2.60GHz8,046NAAMD FX-8320 Eight-Core8,008$145.99Intel Core i7-6700HQ @
2.60GHz7,997$1509Intel Core i7-4710HQ @ 2.50GHz7,826NAIntel Core i5-6600K @
3.50GHz7,762$239.99Intel Core i7-4700HQ @ 2.40GHz7,754$383.00Intel Core i7-4700MQ
@ 2.40GHz7,736$467.40Intel Core i5-4690K @ 3.50GHz7,690$239.99AMD FX-8150 Eight-
Core7,619$165.99Intel Core i7-3630QM @ 2.40GHz7,604$304.49Intel Core i5-4670K @
3.40GHz7,598$249.99Intel Core i5-4690 @ 3.50GHz7,542$224.99Intel Core i7-3610QM @
2.30GHz7,460$399.99Intel Core i5-4670 @ 3.40GHz7,342$226.99Intel Core i5-4590 @
3.30GHz7,174$199.99Intel Core i7-4702MQ @ 2.20GHz7,146NAIntel Core i5-3570K @
3.40GHz7,130$477.23
Solution
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
public class Main
{
/**
* This the main function that runs at the start
* param args - input arguments from the command line
*/
static public void main(String[] args)
{
CPUList cpuList = new CPUList(); //The CPUList used to retrieve data from the
fiile and store in the db
CPUList cpuListRetrieved = new CPUList(); //The CPUList used to retrieve data from the
database
CpuDb cpuDb = new CpuDb(); //The database object used to move data to and
from the CPU Lists
try
{
//Read in the file and store each line into the CPU objects in a list
Files.lines(Paths.get(\"Project04Data.csv\"))
.map(line -> line.split(\"\ \ \")) // Stream
.flatMap(Arrays::stream) // Stream
.forEach(line -> cpuList.AddCpu(line));
//Clear the list table for the new listing
cpuDb.Clear();
//Insert the Cpu List into the database
cpuDb.SetCpuList(cpuList);
//Retrieve the Cpu List into a different CPU List object from the database
cpuDb.GetCpuList(cpuListRetrieved);
//Show the report from the new list that was retrieved from the database
cpuListRetrieved.ShowReport();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
CPUList.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
public class CPUList
{
ArrayList theList = new ArrayList<>();
/**
* Default constructor for the CPU
*/
public void CPUList()
{
}
/**
* param strInputLine Input line to be used in creating the CPU object
*/
public void AddCpu(String strInputLine)
{
theList.add(new CPU(strInputLine));
}
/**
* param tempCPU - A CPU object to.
Create a JAVA program that performs file IO and database interaction.pdf
1. Create a JAVA program that performs file IO and database interaction via SQL. The program
needs to read data from the provided file: "Project.csv" and insert the data into a database. Then
the program needs to create a report from the database sorted by price descending. The report
should be in the format demonstrated below.
id (primary key - generated by the database)
cpuname
performance
price
Project.csv contents:CPU NamePerformancePrice (USD)Intel Core i7-3770K @
3.50GHz9,556$560.50Intel Core i7-3770 @ 3.40GHz9,327$335.55Intel Core i7-3820 @
3.60GHz8,990$404.38AMD FX-8350 Eight-Core8,940$149.99Intel Core i7-2600K @
3.40GHz8,501$379.97Intel Core i7-2600 @ 3.40GHz8,242$214.99Intel Core i7-4720HQ @
2.60GHz8,046NAAMD FX-8320 Eight-Core8,008$145.99Intel Core i7-6700HQ @
2.60GHz7,997$1509Intel Core i7-4710HQ @ 2.50GHz7,826NAIntel Core i5-6600K @
3.50GHz7,762$239.99Intel Core i7-4700HQ @ 2.40GHz7,754$383.00Intel Core i7-4700MQ
@ 2.40GHz7,736$467.40Intel Core i5-4690K @ 3.50GHz7,690$239.99AMD FX-8150 Eight-
Core7,619$165.99Intel Core i7-3630QM @ 2.40GHz7,604$304.49Intel Core i5-4670K @
3.40GHz7,598$249.99Intel Core i5-4690 @ 3.50GHz7,542$224.99Intel Core i7-3610QM @
2.30GHz7,460$399.99Intel Core i5-4670 @ 3.40GHz7,342$226.99Intel Core i5-4590 @
3.30GHz7,174$199.99Intel Core i7-4702MQ @ 2.20GHz7,146NAIntel Core i5-3570K @
3.40GHz7,130$477.23
Solution
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
public class Main
{
/**
* This the main function that runs at the start
* param args - input arguments from the command line
*/
static public void main(String[] args)
2. {
CPUList cpuList = new CPUList(); //The CPUList used to retrieve data from the
fiile and store in the db
CPUList cpuListRetrieved = new CPUList(); //The CPUList used to retrieve data from the
database
CpuDb cpuDb = new CpuDb(); //The database object used to move data to and
from the CPU Lists
try
{
//Read in the file and store each line into the CPU objects in a list
Files.lines(Paths.get("Project04Data.csv"))
.map(line -> line.split(" ")) // Stream
.flatMap(Arrays::stream) // Stream
.forEach(line -> cpuList.AddCpu(line));
//Clear the list table for the new listing
cpuDb.Clear();
//Insert the Cpu List into the database
cpuDb.SetCpuList(cpuList);
//Retrieve the Cpu List into a different CPU List object from the database
cpuDb.GetCpuList(cpuListRetrieved);
//Show the report from the new list that was retrieved from the database
cpuListRetrieved.ShowReport();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
CPUList.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
public class CPUList
{
3. ArrayList theList = new ArrayList<>();
/**
* Default constructor for the CPU
*/
public void CPUList()
{
}
/**
* param strInputLine Input line to be used in creating the CPU object
*/
public void AddCpu(String strInputLine)
{
theList.add(new CPU(strInputLine));
}
/**
* param tempCPU - A CPU object to add to the list
*/
public void AddCpu(CPU tempCPU)
{
theList.add(tempCPU);
}
/**
* return the combined string showing the CPU list
*/
public String toString()
{
String strString = "";
for (CPU cpu : theList)
{
strString += cpu;
}
return(strString);
}
/**
* Print the CPU List Statistics
* average price of CPU's
4. * highest priced CPU
* lowest priced CPU
* best value CPU (performance / price )*
*/
public void PrintStatistics()
{
System.out.printf("average price CPU: %5.2f ",
theList.stream().mapToDouble(CPU::getPrice).average().getAsDouble());
System.out.printf("highest price CPU: %5.2f ",
theList.stream().mapToDouble(CPU::getPrice).max().getAsDouble());
System.out.printf("lowest price CPU: %5.2f ",
theList.stream().mapToDouble(CPU::getPrice).min().getAsDouble());
System.out.println("Best Value CPU: " + Collections.max( theList, new
CpuComparator() ).getCpuName());
}
/**
*Create the report from the database table with the following format
*
* Intel Core i7-6700HQ 2.60GHz: $1,509.00
* Intel Core i7-3770K 3.50GHz: $560.50
* Intel Core i5-3570K 3.40GHz: $477.23
* Intel Core i7-4700MQ 2.40GHz: $467.40
*/
public void ShowReport()
{
for(CPU objCpu : theList)
{
System.out.printf("%s: %5.2f ", objCpu.getCpuName(), objCpu.getPrice());
}
}
/**
* Remove the CPU objects that do not have all of the required values parsed out of the line
*/
public void CleanCpuList()
{
5. Iterator it = theList.iterator();
while( it.hasNext() )
{
CPU objCpu = it.next();
if(objCpu.getValid() == false)
{
it.remove();
}
}
}
}
CPU.java
public class CPU
{
private boolean m_bValid;
private String m_strCPULine;
private String m_strCPUName;
private double m_dPerformance;
private double m_dPrice;
private double m_dValue; //Performance / Price
private static final double NA_VALUE = 9999.99;
/**
* param strCPULine is the CPU line from the file
*/
public CPU(String strCPULine)
{
m_strCPULine = strCPULine;
m_bValid = ParseCPULine(strCPULine);
}
/**
* Constructor to be used when the fields are already known
* param strCPUName - name of the CPU
* param iPerformance - performance factor of the CPU
6. * param dPrice - price of the CPU
*/
public CPU(String strCPUName, int iPerformance, double dPrice)
{
m_strCPUName = strCPUName;
m_dPerformance = (double)iPerformance;
m_dPrice = dPrice;
m_dValue = m_dPerformance / m_dPrice; //Performance / Price
m_bValid = true;
}
/**
* param m_strCPULine - the input file line to be parsed
* return Indicate if the ParseCPULin succeeded or not
*/
private boolean ParseCPULine(String m_strCPULine)
{
boolean bRetValue = true;
String strTemp;
String strNumeric;
//Use a regular expression to parse the line into the individual members
//TODO - Figure out why regex not working for 1,509.00
//messes up on the comma in the value
String[] tokens = m_strCPULine.split(",(?=([^"]*"[^"]*")*[^"]*$)");
//http://rubular.com/ is helpful for regex
//Do we have the correct number of tokens from the split. If not then mark as invalid
if(tokens.length != 3)
{
bRetValue = false;
}
m_strCPUName = tokens[0];
//Get the performance
try
{
strTemp = tokens[1];
strNumeric = strTemp.replaceAll("[^0-9.]+", ""); //Get rid of non digit characters
m_dPerformance = Double.parseDouble(strNumeric);
7. }
catch(NumberFormatException ex)
{
m_dPerformance = NA_VALUE;
bRetValue = false;
}
//Get the price
try
{
strTemp = tokens[2];
strNumeric = strTemp.replaceAll("[^0-9.]+", ""); //Get rid of non digit characters
m_dPrice = Double.parseDouble(strNumeric);
}
catch(NumberFormatException ex)
{
m_dPrice = NA_VALUE; //Bogus Value
bRetValue = false;
}
//If we have valid Performance and Price values then return the calculated value otherwise
set to zero
if(bRetValue)
{
m_dValue = m_dPerformance / m_dPrice;
}
else
{
m_dValue = 0.0;
}
// for(String strTemp1 : tokens)
// {
// System.out.printf("%st", strTemp1);
// }
//
// System.out.printf(" ");
return bRetValue;
}
8. /**
* return A string representing the CPU
*/
public String toString()
{
return String.format("[%b]t%stt[%5.2f]t[%5.2f] ", m_bValid, m_strCPUName,
m_dPerformance, m_dPrice);
//return String.format("%s ", m_strCPULine); //Just return the original line
}
/**
* Getter
* return the performance as an double
*/
public double getPerformance(){return(m_dPerformance);};
/**
* Getter
* return the price as a double
*/
public double getPrice(){return(m_dPrice);};
/**
* Getter
* return the value as a double
*/
public double getValue(){return(m_dValue);};
/**
* Getter
* return the CPU Name
*/
public String getCpuName(){return(m_strCPUName);};
/**
* return if the cpu's line was parsed with all valid values for the fields or not
*/
public boolean getValid(){return(m_bValid);};
}
9. CPUDb.java
import java.sql.*;
public class CpuDb
{
//SQL objects
Connection c = null;
boolean bConnected = false;
/**
* Default constructor
*/
public CpuDb()
{
bConnected = Connect("cpudb", "tcc2016", "tcc2016");
}
/**
* param strTable - table for which the column names will be shown
*/
public void ShowColumns(String strTable)
{
Statement s = null;
ResultSet r = null;
try
{
s = c.createStatement();
r = s.executeQuery("SELECT * from " + strTable);
ResultSetMetaData m = r.getMetaData();
int col = m.getColumnCount();
for (int i = 1; i <= col; i++)
{
System.out.printf("%stt", m.getColumnName(i));
}
System.out.println();
}
catch ( SQLException e)
{
e.printStackTrace();
10. }
}
/**
* Connect to the database
* param strDatabase - database name
* param strUser - database user
* param strPassword - user password
* return true if the connection is made
*/
private boolean Connect(String strDatabase, String strUser, String strPassword)
{
boolean bConnectStatus = false;
try
{
//Had to suppress a SSL warning message that kept popping up
c = DriverManager.getConnection("jdbc:mysql://localhost/" + strDatabase +
"?autoReconnect=true&useSSL=false", strUser, strPassword);
System.out.println("Database connection made ");
bConnectStatus = true;
}
catch ( SQLException e)
{
e.printStackTrace();
}
return(bConnectStatus);
}
/**
* Provide the insert into the database of the CPU list
* param lstCpu - list of CPUs to insert
* return true if the setting of the db via inserts succeeded
*/
public boolean SetCpuList(CPUList lstCpu)
{
boolean retValue = false;
Statement s = null;
11. String strSql;
ResultSet r = null;
try
{
s = c.createStatement();
//"insert into cputable( cpuname, performance, price) values( 'CPU1', 123, 55.66)"
for(CPU objCPU : lstCpu.theList)
{
//Only insert if valid
if(objCPU.getValid() == true)
{
//Create the CPU
strSql = "insert into cputable( cpuname, performance, price) values('"
+ objCPU.getCpuName() + "',"
+ objCPU.getPerformance() + ","
+ objCPU.getPrice() + ")";
//System.out.println(strSql);
s.execute(strSql);
}
}
}
catch ( SQLException e)
{
e.printStackTrace();
}
return (retValue);
}
/**
* Get the CPU list from the the database and return the list
* param lstCpu - list of CPUs in the database
* return indicates if the loading of the cpu list from the database succeeded or not
*/
public boolean GetCpuList(CPUList lstCpu)
{
boolean retValue = false;
12. Statement s = null;
ResultSet r = null;
try
{
//Get the statement object connected to the database
s = c.createStatement();
//Get all of the fields from the cpu table
r = s.executeQuery("SELECT * from cputable order by price DESC");
//Get the results set for the query
ResultSetMetaData m = r.getMetaData();
//Iterate through the record set and add to the CPU list
while( r.next() ){
lstCpu.AddCpu(new CPU(r.getString( "cpuname" ),r.getInt( "performance"
),r.getFloat( "price" )));
}
// //How many columns do we have
// int col = m.getColumnCount();
//
// //Show all of the data in the results set
// while( r.next() ){
// for( int i = 1; i <= col; i++ ){
// int t = m.getColumnType( i );
// switch( t ){
// case Types.INTEGER:
// System.out.print( r.getInt( i ) );
// break;
// case Types.VARCHAR:
// System.out.print( r.getString( i ) );
// break;
// case Types.DATE:
// System.out.print( r.getDate( i ) );
// break;
// case Types.FLOAT:
// System.out.print( r.getFloat( i ) );
// break;
13. // default:
// System.out.print("Unk("+ r.getType() + ")");
// break;
// }
// System.out.print( ";" );
// }
// System.out.println();
// }
retValue = true;
}
catch ( SQLException e)
{
e.printStackTrace();
}
return (retValue);
}
/**
* Clear the data out of the database
* return if the table was cleared or not
*/
public boolean Clear()
{
boolean retValue = false;
Statement s = null;
ResultSet r = null;
try
{
//Get the statement object connected to the database
s = c.createStatement();
//Get all of the fields from the cpu table
s.execute("delete from cputable");
}
catch ( SQLException e)
{
e.printStackTrace();
}