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.建注释类
2.各种hibernate查询例举 未完待续!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 "参数";
}
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());
}
}
}