闽公网安备 35020302035485号
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和构建工具中,否则相关代码的编译都不可能通过。