MyBatis 适合需求多变的互联网项目,例如电商项目、金融类型、旅游类、售票类项目等。 Hibernate 适合需求明确、业务固定的项目,例如 OA 项目、ERP 项目和 CRM 项目等。
public static void viewTable(Connection con) throws SQLException { String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES"; try (Statement stmt = con.createStatement()) { ResultSet rs = stmt.executeQuery(query); while (rs.next()) { // 堆代码 duidaima.com String coffeeName = rs.getString("COF_NAME"); int supplierID = rs.getInt("SUP_ID"); float price = rs.getFloat("PRICE"); int sales = rs.getInt("SALES"); int total = rs.getInt("TOTAL"); } } catch (SQLException e) { JDBCTutorialUtilities.printSQLException(e); } }这样的代码存在什么问题呢?
public interface PersonMapper { @Insert("Insert into person(name) values (#{name})") public Integer save(Person person); @Select( "Select personId, name from Person where personId=#{personId}") @Results(value = { @Result(property = "personId", column = "personId"), @Result(property="name", column = "name"), @Result(property = "addresses", javaType = List.class, column = "personId", many=@Many(select = "getAddresses")) }) public Person getPersonById(Integer personId); // ... }我个人很好奇,为什么MyBatise没有使用JPA规范,而是自己又创造一种注解。MyBaties另一种通过XML的配置方式配置的,本文就不介绍了。想想当年,Spring也是使用XML进行配置Bean的,现在好像已经没有人这么干了。说到底,MyBaties也是一个ORM框架。MyBatis-Plus插件的流行程度正好证明了这一点。所以,大家没有必要对ORM框架抱有偏见。
@Entity @Table(name="people") public class Person { @Id @GeneratedValue private int id; @Column(name="first_name", length=10) private String firstName; @Column(name="last_name", length=10) private String lastName;在实体类上中定义Java类与数据库之间的映射关系,最大的好处就是DDL语句和数据库迁移SQL可以被工具自动生成。假如你在Person类中增加一个email的字段,Ebean的的DDL特性就可以为你生成相应的建表语句。而Ebean的Migration工具就为你生成相应的alert语句。当然,这些语句的执行时机,还是由用户控制。
@SoftDelete boolean deleted;更多相关信息:https://ebean.io/docs/mapping/
// Database是Ebean与数据库进行交互的主要接口 @Autowired Database database; @Test public void crud() { Person customer = new Person(); customer.setFirstName("Jack"); customer.setLastName("J"); // 这是为了让大家对Ebean的database类有一个感性认知 database.save(customer); // 实际应用中,我通常是在Person类中定义一个save方法,并在内容调用database.save(this)。 // 最终就是实现这样的调用效果:customer.save() // 批量执行存储。你猜这里应该是生成一条语句,还是多条语句? database.saveAll(customerList); // 根据ID查询对象。Ebean生成相应的select-where语句并执行 Customer customerA = database.find(Customer.class, 1); // 当然你也可以只查询其中一个字段的值,Ebean将生成并执行: // select first_name from people where id=1; database.find(Customer.class).select("first_name").where().idEq(1).findSingleAttribute(); customerA.setFirstName("Jane"); // Ebean会识别出customerA要做的是修改,而不是创建新的记录。所以,生成alert语句并执行。 database.save(customerA); // 当然,少不了大家关心的能否执行原生SQL String sql = "select id, first_name from customer where first_name like ?"; Customer customer = database.findNative(Customer.class, sql) .setParameter("Jo%") .findOne(); // 另,有时,我们会想念DTO,则可以这么写: List<CustomerDto> beans = database.findDto(CustomerDto.class, "select id, first_name from customer where first_name = :name") .setParameter("name", "Rob") .findList(); // CustomerDto是需要提前定义好的。 // 删除记录 database.delete(customer); }至此,已经把Ebean的解决方案介绍完成,由于篇幅有限,还请感兴趣的同学到官网学习。
Person contact = new QContact() .firstName.equalTo("rob") .findOne();QContact类是由Ebean生成的(在实体类前加一个Q字母代表查询类),方便用户使用链式调用来查询自己想要数据。而不是需要像database.find(Customer.class).select("first_name")这样手工写字段名。发生以上的魔法是因为Ebean使用了增强(Enhancement)技术。这项技术必须嵌入到我们的IDE和构建工具中,否则相关代码的编译都不可能通过。