2017-03-01 146 views
0

这里有很多类似的问题,但没有一个专门回答这个问题。我如何从Java布尔转换为mySQL数据库可接受的格式?我尝试了几个不同的东西,并在这里阅读了一些类似的问题,但没有任何工作。这里的细节:JDBC将Boolean转换为mySQL兼容布尔类型

我有一个mySQL数据库。我在mySQL工作台中构建它。它允许我为true/false值指定数据类型'布尔'。它用1/0表示这些。我知道有大小为1字节的tinyInts。

我正在使用JDBC为Java中的数据库构建一个接口。数据库中的每个表都有一个用于创建表数据实例的相应Java bean类和一个包含用于在程序和数据库之间来回切换的代码的tableManager类。

该程序还有一个GUI。在GUI中,我有三个复选框。我使用checkBox.isSelected()来检测复选框的状态。在按下按钮时。这返回值为'true'或'false'。然后用它在相应的Java Bean类中设置一个布尔值。例如:

在GUI:

private void updateContactActionPerformed (java.awt.event.ActionEvent evt) { 
    Person bean = new Person(); 
    bean.setPersonID(Integer.parseInt(labelPid.getText()); 
    bean.setPersonName(textfield.getText()); 
    bean.setIsPersonNewContact(checkBoxContact.isSelected()); 
    Boolean update = PeopleManager.update(bean); //pass the bean to the manager class 
} 

在管理器类...

public static boolean update(Person bean) throws Exception { 
    String sql = "Update peopleTable SET name = ? new_contact = ? WHERE person_id = ?"; 
    try(
    PreparedStatement stmt = conn.prepareStatement(sql);) { 
    stmt.setString(1, bean.getPersonName()); 
    stmt.setBoolean(2, bean.getIsPersonNewContact()); 
    stmt.setInt(3, bean.getPersonID()); 

...The rest of the try/catch statement and exception handling stuff 
} 

在Bean类中的值被设置为一个布尔虽然我”也尝试将其更改为布尔值,并没有帮助。

从其他堆栈的帖子我导致相信的是,应该发生的是PreparedStatement.setBoolean()方法应该处理将'真'/'假'值转换为1或0.这不适合我。所以我写了两种不同的方法。首先是将真实的假值转换为值为1或0的整数,然后将其传入。这不起作用。我想这可能是因为int大于一个字节。所以我试图将它转换为这样的字节:

stmt.setByte(2, (byte) booleanToByte(bean.getIsPersonNewContact())); 

这也没有工作。我列出了错误信息,但他们没有透露太多。我可以将字符串和日期值存入数据库,所以它不是连接本身。我确信必须有一个简单的方法来实现我想要做的事情。请有人赐教我吗?

**UPDATE** 

基于下面的建议,我在数据库中的字符串改变类型,然后写信给的方法来处理来回转换在我的代码串和布尔之间:

//Convert Boolean to string 
    private String booleanToString(Boolean b){ 
    if(b){ 
     String t = "true"; 
     return t; 
    } 
    else { 
     String f = "false"; 
     return f; 
    } 
} 

//convert String to Boolean 
private Boolean stringToBoolean(String s) { 
    if (s == "true") { 
     Boolean t = true; 
     return t; 
    } 
    else { 
     Boolean f = false; 
     return f; 
    } 
} 

然后我用这些作为我现有的包装。例如,代码如下:

bean.setIsPersonNewContact(booleanToString(checkBoxContact.isSelected())); 

感谢您的帮助解决这个问题!

+0

如果我看[连接器/ J的代码](https://github.com/mysql/mysql-connector-j/blob/release/5.1/src/com/mysql/jdbc/ PreparedStatement.java#L2884)它应该已经这样做了(除非你使用的是MySQL的古老版本,或者可能是驱动程序)。列的数据类型是什么,驱动程序的版本是什么? –

+0

谢谢马克。我看了一下。虽然我按照下面的建议去了,但我很感谢你的建议:) –

回答

0

一个变通

  1. 在你的餐桌new_contact设置为字符串,而不是布尔值。
  2. stmt。setString(2,Boolean.toString(bean.getIsPersonNewContact()));

当你从数据库中获取的字符串返回

  1. 布尔yourBoolean =通过Boolean.valueOf(resultset.getString( “new_contact”));
+1

谢谢。伟大的建议!我按照你的建议改变了数据库中的类型。然后我写了一个'stringToBoolean'方法和另一个'booleanToString'方法,然后用它们作为包装来调用以获取和设置person类中的字段。 。 –

相关问题