我正在使用netbeans和mySQL创建产品。当按钮处于单击状态时,我使用文件选择器从用户获取图像,例如:
public void handle(ActionEvent event){
FileChooser fileChooser = new FileChooser();
//Set extension filter
FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("JPG files (*.jpg)", "*.JPG");
FileChooser.ExtensionFilter extFilterPNG = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.PNG");
fileChooser.getExtensionFilters().addAll(extFilterJPG, extFilterPNG);
//Show open file dialog
File file = fileChooser.showOpenDialog(null);
try {
BufferedImage bufferedImage = ImageIO.read(file);
WritableImage image = SwingFXUtils.toFXImage(bufferedImage, null);
myImageView.setImage(image);
} catch (IOException ex) {
Logger.getLogger(CreateProductUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
我使用以下代码显示图像:
Image image = panel.getMyImageView().getImage();
在我尝试将图像插入数据库之前,它工作正常。这是我的构造函数和创建方法:
public Product(String name,String desc,double price, int quantity,String datestr,Image image){
this.name = name;
this.desc = desc;
this.price = price;
this.quantity = quantity;
this.datestr = datestr;
this.image = image;
}
public boolean create(){
boolean success = false;
DBController db = new DBController();
String dbQuery;
db.getConnection();
dbQuery = "INSERT INTO sm_product(productName,productDescription,productPrice,productQuantity,dateOfCreation,productStatus,productImage) VALUES ('" + name + "', '" + desc + "', " + price + ", " + quantity + ",'" + datestr + "', 'Available', '" + image + "')";
if (db.updateRequest(dbQuery) == 1){
success = true;
}
db.terminate();
return success;
}
但是,图像存储为“javafx.scene.image.WritableImage@3a6e48b3”。我尝试了两次相同的图像,但地址不同。我想知道我是否以错误的方式存储图像?我不确定是否可以使用select SQL语句检索图像,因为我还没有尝试,但我认为它不起作用。
任何人都有更好的方法来解决它,因为存储在数据库中的图像非常奇怪,我认为这可能是错误的。
提前致谢。
更新部分
public void getConnection(){
String url = "";
try {
//url = "jdbc:mysql://172.20.133.227/test";
url = "jdbc:mysql://localhost/amkcc";
con = DriverManager.getConnection(url, "root", "root");
System.out.println("Successfully connected to " + url+ ".");
}
catch (java.sql.SQLException e) {
System.out.println("Connection failed ->"+ url);
System.out.println(e);
}
}
答案 0 :(得分:-1)
如何使用JDBC在MySQL中保存图像的示例:
File image = new File("C:/image.jpg");
psmnt = connection.prepareStatement
("insert into save_image(name, city, image, Phone) "+ "values(?,?,?,?)");
psmnt.setString(1,"MyName");
psmnt.setString(2,"MyCity");
psmnt.setString(4,"123456");
FileInputStream fis = new FileInputStream(image);
psmnt.setBinaryStream(3, (InputStream)fis, (int)(image.length()));
int s = psmnt.executeUpdate();
这就是你的方法应该是这样的:
public boolean create(){
boolean success = false;
try{
DBController db = new DBController();
String dbQuery;
db.getConnection();
dbQuery = "INSERT INTO sm_product(productName,productDescription,productPrice,productQuantity,dateOfCreation,productStatus,productImage) VALUES (?,?,?,?, ?, 'Available', ?)";
PreparedStatement psmnt = db.getConnection().prepareStatement(dbQuery);
psmnt.setString(1,name);
psmnt.setString(2, desc);
psmnt.setDouble(3, price);
psmnt.setInt(4, quantity);
psmnt.setString(5, dateStr);
File imageFile = new File("test.png");
RenderedImage renderedImage = SwingFXUtils.fromFXImage(image, null);
ImageIO.write(renderedImage, "png", imageFile); //Change extension appropriately
FileInputStream fis = new FileInputStream(imageFile);
psmnt.setBinaryStream(3, (InputStream)fis, (int)(imageFile.length()));
int s = psmnt.executeUpdate();
//check the value of s and initialize success appropriately
return success;
}catch(Exception e) { e.printStackTrace(); }
return false;
}
'DBController`中的getConnection()
方法应该是这样的:
public Connection getConnection(){
if(con != null) return con;
String url = "";
try {
//url = "jdbc:mysql://172.20.133.227/test";
url = "jdbc:mysql://localhost/amkcc";
con = DriverManager.getConnection(url, "root", "root");
System.out.println("Successfully connected to " + url+ ".");
return con;
}
catch (java.sql.SQLException e) {
System.out.println("Connection failed ->"+ url);
System.out.println(e);
}
return null;
}