다음 편집기는 Java에서 사용자 정의 주석과 리플렉션을 사용하는 간단한 BaseDao 예제를 제공합니다. 편집자님이 꽤 좋다고 생각하셔서 지금 공유하고 모두에게 참고용으로 드리고자 합니다.
일반적인 ORM 프레임워크에서는 대부분 엔터티와 데이터베이스 간의 매핑을 달성하기 위한 주석 방법을 제공합니다. 여기서는 간단히 사용자 정의 주석과 리플렉션을 사용하여 실행 가능한 SQL 문을 생성합니다.
원래 주석 검토를 위해 만든 프로젝트였기 때문에 전체적인 디렉토리 구조입니다^.^
자, 먼저 아이디어를 정합시다.
1. @Table @Column 주석을 사용자 정의합니다.
최대 절전 모드를 약간 모방하고 @Table이 클래스에서 작동하여 엔터티 클래스와 데이터 테이블 간의 매핑 관계를 나타내고 속성 값을 @Table 데이터 테이블 tableName의 이름에 매핑합니다. @Column이 속성에 대해 작동하도록 하고(여기서는 set 메서드가 구현되지 않음), 속성과 데이터 테이블 필드 간의 매핑 관계를 나타내고 @Column의 속성 값을 허용합니다. 데이터 테이블 필드 컬럼 이름의 특정 필드에 매핑됩니다.
2. Dao 레이어를 모방해야 합니다.
이때 먼저 이름과 비밀번호 속성을 가진 UserDao를 정의합니다. UserDao. UserDao와 User를 인스턴스화할 때 UserDao의 저장 메소드를 호출하고 User 객체를 전달한 다음 SQL 조각을 반환합니다. 간단히 이 SQL을 "사용자(이름, 비밀번호)에 삽입하도록 설정합니다. VALUES('cai" ' ,'123456')", 여기서 사용자는 데이터 테이블의 이름이고, 이름, 비밀번호는 데이터 테이블 필드이고, 'cai','123456'은 사용자 개체의 속성입니다.
------0.0 코드 구분선------------ --------- ---------------------
//칼럼. java
package com.shu.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Column { String value(); }
//Table.java
package com.shu.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Table { String value(); }
//User.java
package com.shu.entity; import com.shu.annotation.Column; import com.shu.annotation.Table; @Table("t_user") public class User { @Column("name") private String name; @Column("password") private String password; public String getName() { return name; } public String getPassword() { return password; } public void setName(String name) { this.name = name; } public void setPassword(String password) { this.password = password; } }
//IBaseDao.java
package com.shu.dao; import java.lang.reflect.Field; import com.shu.annotation.Column; import com.shu.annotation.Table; public interface IBaseDao<T> { //最终目标:insert into user (NAME,password) VALUES('cai','123456'); default String save(T entity) throws IllegalArgumentException, IllegalAccessException{ //sql用于存放最终返回的sql语句 StringBuilder sql = new StringBuilder("insert into "); //tableName用于存放sql语句中表名部分 StringBuilder tableName; //columnName用于存放sql语句的字段部分 StringBuilder columnName = new StringBuilder("("); //values用于存放sql语句中的赋值部分 StringBuilder values = new StringBuilder("("); //获取对象user的class对象 Class clazz = entity.getClass(); //判断该User类是否有@Table注解 boolean isTable = clazz.isAnnotationPresent(Table.class); if(isTable) { //获取User类@Table注解的值value,该值我们定义为User表的表名称 Table t = (Table) clazz.getAnnotation(Table.class); tableName = new StringBuilder(t.value()); //拼接表名 sql.append(tableName+" "); //获取user对象的属性列表 Field[] fieldList = clazz.getDeclaredFields(); //遍历属性列表,分别拿出属性列表中被@Column注解的属性,并获取属性的值 for(int i=0;i<fieldList.length;i++){ Field f = fieldList[i]; boolean isColumn = f.isAnnotationPresent(Column.class); if(!isColumn){ continue; } Column column = f.getAnnotation(Column.class); f.setAccessible(true); Object columnValue = f.get(entity); if(i==fieldList.length-1){ columnName.append(column.value()+") VALUES "); values.append("'"+columnValue+"')"); sql.append(columnName); sql.append(values); continue; } columnName.append(column.value()+", "); values.append("'"+columnValue+"',"); } // boolean isColumn = clazz.isAnnotationPresent(annotationClass); } return sql.toString(); } }
// UserDao.java
package com.shu.dao; import com.shu.entity.User; public class UserDao implements IBaseDao<User> { }
//UserService.java
package com.shu.service; import com.shu.dao.UserDao; import com.shu.entity.User; public class UserService { public static void main(String[] args) { // TODO Auto-generated constructor stub UserDao userDao = new UserDao(); User user = new User(); user.setName("cai"); user.setPassword("123456"); try { System.out.println(userDao.save(user)); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
--------------- -----0.0 코드 분할선 ---------------------------- ---------
여기서 마지막으로 서비스 레이어를 정의하고 dao 레이어를 호출하고 해당 SQL 문을 생성하도록 합니다. 내 디렉터리의 Order와 같은 다른 엔터티를 사용자 정의한 다음 OrderDao는 IBaseDao 인터페이스를 구현하고 OrderService를 정의하여 OrderDao를 호출합니다. save 메소드는 주문 테이블에 해당하는 SQL 문을 생성할 수도 있습니다.
단점을 요약하면 다음과 같습니다.
1. Hibernate Annotation은 할당 없이 얻을 수 있기 때문에 할당 없이 직접 테이블이나 필드 이름을 얻으려면 리플렉션을 사용하여 얻을 수 있다고 생각합니다. .
2. 여기서는 save 메소드만 사용하며, sql 문은 데이터베이스와 상호 작용하지 않고 동적으로 생성되며 sql 문을 실행하기 위한 지속성 메서드를 제공할 수 있습니다.
3. 여기서 SQL의 접합은 상대적으로 거친 편입니다. 더 효율적인 다른 방법이 있는지 생각해 볼 수 있습니다.
위 내용은 Java에서 BaseDao를 구현하는 방법에 대한 예제 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!