最近重新拾起放下快1年的Java,从Python/Django平台编程经历中得到很多启发,准备在下列几个方面简化Java开发:
1. 对 Hibernate 的简化使用
使用Hibernate的最大困难是表之间一对多和多对多关联的准确理解和使用。现在我决定在数据库表之间不实现物理关联,而是在服务层由程序来维护关联。JPA定义的实体类中,一律不使用集合。
例如,用户和用户组之间的多对多关联,就用一个与数据库表直接对应的JPA实体类来表示:
/**
* 注册用户
*/
@Entity
@Table(name = "t_user")
public class User extends LightEntity implements Serializable {
private Integer id;
private String name; //登录名
private String password;
。。。
/**
* 用户组
*/
@Entity
@Table(name = "t_group")
public class Group extends LightEntity implements Serializable {
private Integer id;
private String name;
。。。
/**
* 用户组和注册用户多对多关联
*/
@Entity
@Table(
name = "t_user_groups",
uniqueConstraints={@UniqueConstraint(columnNames={"user_id","group_id"})}
)
public class UserGroups extends LightEntity implements Serializable {
private Integer id;
private Integer userId;
private Integer groupId;
。。。
2. 对 Spring 的简化使用
除了使用Spring 2.5.x版本的基于注解的配置外,主要的简化在于取消接口(Interface)和DAO层,只有服务层。
例如:
/**
* 与用户组相关的服务
*/
@Component("groupService")
@Transactional
public class GroupService {
protected EntityManager entityManager;
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
// ~ ======= CRUD =========
private String pojoClassName = Group.class.getName();
public Group find(Integer id) {
return entityManager.find(Group.class, id);
}
@SuppressWarnings("unchecked")
public List findAll() {
Query query = entityManager.createQuery("from " + pojoClassName);
return (List) query.getResultList();
}
public int countAll() {
Query query = entityManager.createQuery("select count(*) from " + pojoClassName);
return ((Long) query.getSingleResult()).intValue();
}
public Group save(Group obj) {
return entityManager.merge(obj);
}
3. 使用Sqlite作为开发用数据库
使用Django开发用惯了sqlite,发现Java平台上好像很少有人用它。查找了一些资料,自己写了一个SQLiteDialect类(参见附件)。
4. 在GWT客户端直接使用JPA实体类
使用Gilead
可以轻松地在GWT客户端直接使用JPA实体类,不再需要重复写DTO了。
5. SQL脚本直接用于准备单元测试数据
利用Spring 2.5新的TestContext测试框架对服务层进行测试,测试数据的准备直接写在SQL脚本文件中,例如:
@RunWith(SpringJUnit45ClassRunner.class)
@ContextConfiguration(locations = "classpath:com/divo/test/resources/applicationContext.xml")
public class TestGroupService extends AbstractTransactionalJUnit4SpringContextTests {
@Autowired
private GroupService service;
@Before
public void prepareTestData() {
executeSqlScript("com/divo/test/server/service/core/fixture.sql", false);
}
// ~ ========= CRUD =========
@Test
public void canFind() throws Exception {
List<Group> objs = service.findAll();
assertEquals(2, objs.size());
assertEquals(2, service.countAll());
Group obj = service.find(1);
assertEquals("g1", obj.getName());
}
。。。
fixture.sql文件的内容如下:
delete from t_user
insert into t_user (id,full_name,name,password,salt) values (1,'tom','tom','123','1')
insert into t_user (id,full_name,name,password,salt) values (2,'tom2','tom2','123','1')
delete from t_group
delete from t_user_groups
insert into t_group (id,name) values (1,'g1')
insert into t_group (id,name) values (2,'g2')
insert into t_user_groups (id,user_id,group_id) values (1,1,1)
insert into t_user_groups (id,user_id,group_id) values (2,1,2)
。。。
6. 用Ant直接创建数据库表
建好JPA实体类后,运行Ant目标,可以直接在开发用数据库中创建新表。
<?xml version="1.0" encoding="utf-8" ?>
<project name="Next" default="hbm2ddl" basedir=".">
<property name="build.dir" value="./db" />
<path id="project.class.path">
<pathelement location="war/WEB-INF/classes" />
<fileset dir="war/WEB-INF/lib">
<include name="**/*.jar" />
</fileset>
</path>
<!-- Hibernate Tools import -->
<taskdef name="hibernatetool"
classname="org.hibernate.tool.ant.HibernateToolTask"
classpathref="project.class.path" />
<!-- Export the database schema -->
<target name="hbm2ddl" description="Generate DDL">
<hibernatetool destdir="${build.dir}">
<jpaconfiguration persistenceunit="next" />
<classpath refid="project.class.path" />
<hbm2ddl drop="false"
create="true"
update="false"
export="true" />
</hibernatetool>
</target>
</project>
随着Google最近的一系列新产品(GWT1.6、Java版的AppEngine)的推动下,相信Java会重新成为开发Ajax应用的主要平台。
分享到:
相关推荐
Spring最根本的使命是解决企业级应用开发的复杂性,简化Java开发。 2. Spring两个核心特性 ① IoC(Inverse of Control)–> 控制反转 IoC理念: 对象的创建工作交给IoC容器 对象间的依赖关系交给IoC容器查找,在...
java后台开发框架,简化开发,高效开发,入门简单。亲测好用
稿件编号:06122808 稿件名称:用JSTL简化Java Web开发 稿件作者:徐翔斌 源代码名称:book 调试环境:Win XP;SQL,apache-tomcat-5.5
Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。 Spring可以做很多事情,它为企业级开发提供给了丰富的功能,但是这些功能的底层都依赖于它的 两个核心特性,也就是依赖注入(dependency ...
Spring框架是一个全功能的应用程序开发框架,它提供了许多功能和组件,以简化Java开发。Spring框架主要解决了企业级应用程序开发中的各种问题,如依赖注入(Dependency Injection)、面向切面编程(Aspect-Oriented ...
Java简化开发套路集.zip
介绍了Java开发中常用...通过选择最佳工具和IDE,你可以提高开发效率、简化工作流程,并最大限度地发挥Java开发的潜力。无论是初学者还是有经验的开发者,本文都提供了有用的指导,帮助你在Java开发中做出明智的选择。
JAVA开发[其他类别]MeyboMail Web(Java)开源简化_meybomailweb
Dew Common的理念是简化Java开发中最常用的操作,同时尽可能少地引入第三方包,做到通用、易用、精简。 功能 Json与Java对象互转,支持泛型 Java Bean操作,Bean复制
SpringBoot是一个开源的Java EE应用程序框架,它可以简化Java开发过程,使得开发者可以更快速地开发出高质量的应用程序。在这个系统中,SpringBoot主要负责后端的业务逻辑处理和数据交互。 其次,前端部分是使用Vue...
SpringBoot是一个开源的Java EE应用程序框架,它可以简化Java开发过程,使得开发者可以更快速地构建出高效、健壮的应用程序。在这个系统中,SpringBoot主要负责后端的业务逻辑处理和数据管理。 其次,系统的前端...
系统后端使用SpringBoot框架,SpringBoot是一个开源的Java基础项目,可以简化Java开发过程,使得开发者可以更快速地开发和部署应用。它内置了大量的工具和库,可以帮助开发者处理各种常见的开发任务,如数据访问、...
Guava-18.0是一个功能强大的Java库,主要用于简化Java编程和提高代码质量。通过使用Guava-18.0提供的各种实用工具和功能,开发人员可以更快速地编写可靠、可维护的代码,并减少错误和漏洞的出现。Guava-18.0适用于...
简单的介绍了如何利用Eclipse实现Java窗体可视化开发,简化Java中窗体开发的复杂性,文档中给了一个简单例子,附加代码和界面。
javassist:试图简化Java字节码的编辑
简化 AJAX 和 JAVA 开发-第 1 部分 用 JSP 标记文件动态生成 JAVASCRIPT 代码
jprotobuf是针对Java程序开发一套简易类库,目的是简化java语言对protobuf类库的使用 使用jprotobuf可以无需再去了解.proto文件操作与语法,直接使用java注解定义字段类型即可。 基于Canvas,纯Javascript图表...
他的使命是:简化Java操作数据层.提供少许Annotation,消费者只用关心注解的含义,这就使得框架的核心便于重构,便于持续良性发展.,仅仅只需要设计编写DAO接口即可,在项目初始化阶段采用ASM生成好实现类. 因此,开发代码...
Apache Commons DbUtils 包是一组用于简化 JDBC 开发的 Java 实用程序类。原则上这不能说是一个持久层框架,它提供了一些Jdbc的操作封装来简化数据查询和记录读取操作