Java 反照,注释结合hibernate 查询的应用

Java 反射,注释结合hibernate 查询的应用

准备工作:

   1.导入hibernate的引用和创建实体关系映射(包含数据库的创建)。

   2.为了方便输出自己写了个方便输出的类(如下)

package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Console {

	private Console() {
		
	}
	
	public static void write(Object obj) {
		System.out.print(obj);
	}
	
	public static void writeLine(Object obj) {
		System.out.println(obj);
	}
	
	public static void writeLine() {
		System.out.println();
	}
	
	public static void write(String format, Object ... objs) {
		System.out.print(applyParamters(format, objs));
	}
	
	public static void writeLine(String format, Object ... objs) {
		System.out.println(applyParamters(format, objs));
	}
	
	private static String applyParamters(String format, Object[] objs) {
		for(int i = 0; i < objs.length; i++)
			format = format.replaceAll(
					"\\{" + i + "\\}", 
					objs[i] != null ? objs[i].toString() : "null");
		return format;
	}
	
	public static String readLine() {
		try {
			return new BufferedReader(
					new InputStreamReader(System.in))
					.readLine();
			//键盘流非常特殊,不能close
		} catch (IOException ex) {
			throw new RuntimeException(ex);
		}
	}
	
}















 

 具体实现:

 1.建注释类

package test;

//程序元素类型。此枚举类型的常量提供了 Java 程序中声明的元素的简单分类。
import java.lang.annotation.ElementType;
//指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。 
import java.lang.annotation.Retention;
//注释保留策略。此枚举类型的常量描述保留注释的不同策略。
import java.lang.annotation.RetentionPolicy;
//指示注释类型所适用的程序元素的种类。
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)  
public @interface QueryMethod {
	public String values() default "参数";
}

 2.各种hibernate查询例举

 

package test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import entities.Department;
import entities.Employee;

public class MainModule {

	private static SessionFactory sessionFactory;

	static {
		sessionFactory = new Configuration().configure("/hibernate.cfg.xml")
				.buildSessionFactory();
	}

	public static void main(String[] args) {
		//定义数组保存方法
		List<Method> methods = new ArrayList<Method>();
		// 反射所有方法
		for (Method method : MainModule.class.getMethods()) {
			// 找出哪些方法被注释类所修饰
			QueryMethod qmethod = method.getAnnotation(QueryMethod.class);
			if (qmethod == null)
				continue;
			methods.add(method);
			Console.writeLine("{0}.{1}", methods.size(), qmethod.values());
		}
		//获得输入
		String chk = Console.readLine();
		//集合从0开始
		Method m = methods.get(Integer.parseInt(chk) - 1);
		Session session = sessionFactory.openSession();
		try {
			// 调用目标方法
			m.invoke(null, new Session[] { session });
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} finally {
			session.close();
		}
	}

	@QueryMethod(values = "简单HQL查询")
	public static void klweradfasdf(Session session) {
		Query query = session.createQuery("from Department");
		List<Department> depts = query.list();
		for (Department dept : depts) {
			Console.writeLine("部门名称:{0}", dept.getName());
		}
	}

	@QueryMethod(values = "带参数名的查询")
	public static void iorepwqwer(Session session) {
		List<Department> depts = session.createQuery(
				"from Department d where d.name=:name")
				.setString("name", "产品部").list();
		for (Department dept : depts) {
			Console.writeLine("部门名称:{0}", dept.getName());
		}
	}

	@QueryMethod(values = "带参数位置的查询")
	public static void ewkasdf(Session session) {
		List<Department> depts = session.createQuery(
				"from Department d where d.name=?").setString(0, "产品部").list();
		for (Department dept : depts) {
			Console.writeLine("部门名称:{0}", dept.getName());
		}
	}

	@QueryMethod(values = "单列投影")
	public static void jklrewqwerq(Session session) {
		List<String> names = session.createQuery(
				"select d.name from Department d").list();
		for (String name : names) {
			Console.writeLine("部门名称:{0}", name);
		}

	}

	@QueryMethod(values = "多列投影")
	public static void jklasdfasdf(Session session) {
		List<Object[]> objs = session.createQuery(
				"select d.id,d.name from Department d").list();
		for (Object[] obj : objs) {
			// 断言
			assert obj.length != 2;
			String id = obj[0].toString();
			String name = obj[1].toString();
			Console.writeLine("ID:{0}名称:{1}", id, name);
		}
	}

	@QueryMethod(values = "边查询边创建对象")
	public static void jkllkwwewe(Session session) {
		List<Department> depts = session
				.createQuery(
						"select new entities.Department(d.id,d.name) from Department d")
				.list();
		for (Department dept : depts) {
			Console.writeLine("ID:{0}Name:{1}", dept.getId(), dept.getName());
		}
	}

	@QueryMethod(values = "左外连接")
	public static void rqwerq(Session session) {
		List<Object[]> objs = session.createQuery(
				"from Department d left join d.employees").list();
		for (Object[] obj : objs) {
			Department dept = (Department) obj[0];
			Employee emp = (Employee) obj[1];
			Console.write(Hibernate.isInitialized(dept.getEmployees()));
			Console.writeLine("部门名称:{0}", dept.getName());
			Console.writeLine("员工姓名:{0}", emp.getName());

		}
	}

	@QueryMethod(values = "迫切左外连接")
	public static void jklrewqwer(Session session) {
		List<Department> depts = session.createQuery(
				"from Department d left join fetch d.employees").list();
		for (Department dept : depts) {
			Console.write(Hibernate.isInitialized(dept.getEmployees()));
			Console.writeLine("部门名称:{0}", dept.getName());
			for (Employee emp : dept.getEmployees()) {
				Console.writeLine("员工名称{0}", emp.getName());
			}
		}
	}

	@QueryMethod(values = "内连接")
	public static void rewqrfe(Session session) {
		List<Object[]> objs = session.createQuery(
				"from Department d inner join d.employees").list();
		for (Object[] obj : objs) {
			Department dept = (Department) obj[0];
			Employee emp = (Employee) obj[1];
			Console.writeLine("部门名称:{0}", dept.getName());
			Console.writeLine("用户名:{0}", emp.getName());
		}
	}

	@QueryMethod(values = "迫切内连接")
	public static void jkfldsadsf(Session session) {
		List<Department> depts = session.createQuery(
				"from Department d inner join fetch d.employees").list();
		for (Department dept : depts) {
			Console.writeLine("部门名称:{0}", dept.getName());
			for (Employee emp : dept.getEmployees()) {
				Console.writeLine("员工名称:{0}", emp.getName());
			}

		}
	}

	@QueryMethod(values = "隐式内连接")
	public static void jkfldsasdfa(Session session) {
		List<Employee> emps = session.createQuery(
				"from Employee e where e.department.name like :name")
				.setString("name", "产品部").list();
		for (Employee emp : emps) {
			Console.writeLine("员工名称:{0}", emp.getName());
		}
	}
}

 

 

 

未完待续!