用Java从数据库“选择或创建”

时间:2012-07-16 08:52:14

标签: java mysql orm

我在Ruby中完成了过去几年的所有数据库开发,主要使用ActiveRecord。现在我不得不在项目中使用Java,感觉如此冗长和混乱,我想知道我做错了。

在ORM范例中,如果我想插入相关表格,我会像

那样
# Joe Bob got a new car
p = Person.find_or_create_by_name("Joe Bob");
Car.new({:make=>"Toyota", :plate=>"ABC 123", :owner=>p});

在Java中,至少直接使用JDBC,我将不得不手动执行Person查找,如果不存在则插入,然后创建Car条目。

当然,在现实生活中,它不仅仅是2个表,疼痛呈指数级增长。当然有更好的方法吗?

5 个答案:

答案 0 :(得分:3)

您可以使用Java的ORM解决方案 - 有各种解决方案可供使用。

值得关注的链接:

话虽如此,我经常发现,对于复杂的应用程序,ORM经常会造成比它值得更多的麻烦(是的,这确实包括带有Activerecord的Ruby项目)。有时候直接通过SQL获取数据而不是试图强制使用面向对象的外观确实有意义。

答案 1 :(得分:2)

更好的方法是学习SQL!您非常喜欢的ORM会在幕后为您编写SQL。

所以你可以创建一个试图选择记录的快速帮助函数,如果它不存在则为你创建它。

在MySQL中,您可以使用INSERT IGNORE .....,只有当行不存在时才会插入行。

以下是您可能喜欢的一些特殊SQL(仅限MySQL):

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;

这会尝试插入记录,如果它不存在,则会返回你在程序中检索的auto_increment。

但是:如果它确实存在则更新它 - (在这种情况下只设置c更新),但很酷的部分是它设置LAST_INSERT_ID()就像在插入上一样。

无论哪种方式,您都可以获得ID字段。而且只需一点​​SQL。

SQL是一种非常好的语言 - 你应该学习它而不是依赖于orm的psudo语言。

答案 2 :(得分:1)

如果您正在使用JDBC,则需要查找自己并创建人员(如果不存在)。如果使用JDBC,没有更好的方法。

但是你可以使用Hibernate,它可以帮助你减少自己编写O-R映射并减少样板。

当你来自Ruby时如果你发现编写所有SQL查询很痛苦,那么更好的方法就是使用ORM。我推荐以下之一,

  1. 休眠
  2. JPA(如果要更改ORM实现,请使用JPA)

答案 3 :(得分:0)

Sormula包含active record package。如果没有记录,save method将更新现有记录或插入。

请参阅网站上的active record example

另见项目中的org.sormula.tests.active.SaveTest.java:

SormulaTestAR record = new SormulaTestAR();  
record.attach(getActiveDatabase()); // record needs to know data source
record.setId(8002);
record.setType(8);
record.setDescription("Save one AR 2");
record.save();

答案 4 :(得分:0)

看起来像我来晚了,但是,ActiveJDBC将按照Java的要求进行操作:

Person p = Person.findOrCreateIt("name", "Joe Bob");
Car car = Car.createIt("make", "Toyota", "plate", "ABC 123", "owner", p);

它还可以做很多事情,请访问http://javalite.io/