反射和数据库查询

反射

Class对象

  • Class类的对象可以表示任何一个正在运行的java类或者接口入股能拿到一个class对象,就可以拿到反射的源头

  • 一个类在加载到内存中后就存在一个表示该类型的class对象,class对象是唯一 的

  • class对象中存着这个类的所有内容(成员,构造器。。。)

  • 如果能够获取到一个类的class对象,就能操作里面的所有内容,所以class类的读西厢作为反射的源头,

  • 如何获取反射的源头:

    • 类名.class
    • 对象.getClass()
    • Class.forName(“包名+类名”) 推荐
    • 根据反射的的源头获取到class对象
  • Java中取得系统的属性的方法有两种:

    • ① 可以使用System类中的方法:public static Properties getProperties()得到系统的各种属性,该方法返回一个Properties类,这个类继承自Hashtable,在该类中定义了各种属性的键值对。
    • ② 直接使用System.getProperty(String key)获取所需的系统属性。
    • 实际上两者是等价的,System.getProperty(String key)方法内部调用了System类内部声明的Properties对象的getProperty(String key)方法。
  • 反射功能:

    • 通过反射获取构造器,创建对象
    • 通过反射获取方法,调用方法
    • 通过反射获取属性,获取值(设置值)
  • 通过反射获取构造器,创建对象,通过指定的构造器创建对象,如果私有,放开权限,通过一个类的Class对象的newInstance方法创建这个类的实例,默认调用空构造

    • Constructor getConstructor(Class<?>… parameterTypes)
    • Constructor<?>[] getConstructors()
    • 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
    • Constructor getDeclaredConstructor(Class<?>… parameterTypes)
    • Constructor<?>[] getDeclaredConstructors()
    • 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
public static void testConstructor(Class cls) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
		Constructor<Person>[] arr=cls.getConstructors();  //所有公共的
		System.out.println(Arrays.toString(arr));
		//根据构造器的newInstance(实参...)
		Person p=arr[0].newInstance("zhangsan",18,180);
		System.out.println(p);
		
		Constructor<Person> con=cls.getDeclaredConstructor(String.class);
		//放开构造器的权限
		con.setAccessible(true);
		Person p2=con.newInstance("lisi");
		con.setAccessible(false);
		System.out.println(p2);
		//默认调用空构造
		Person p3=(Person) cls.newInstance();
		System.out.println(p3);
	}
  • 通过反射获取方法,调用方法,Object invoke(Object obj, Object… args) (参数1: 调用方法的对象,参数2: 调用方法的实参)返回值: 调用方法的返回值
    • Method getDeclaredMethod(String name, Class<?>… parameterTypes)
    • Method[] getDeclaredMethods()
    • 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
    • Method getMethod(String name, Class<?>… parameterTypes)
    • Method[] getMethods()
    • 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
public static void testMethod(Class<Person> cls) throws Exception{
		Method[] arr=cls.getMethods();
		for(Method me:arr){
			System.out.println(me);
		}
		Person p=cls.newInstance();
		Field field=cls.getDeclaredField("name");
		field.setAccessible(true);
		field.set(p, "lushuangshuang");;
		//System.out.println(arr[8].invoke(p));
		System.out.println(arr[8].invoke(null));  //null没有对象
	}
  • 通过反射获取属性,获取值|设置值,获取属性的值: Object get(Object obj) 设置属性的值: void set(Object obj, Object value)
    • Field getField(String name)
    • Field[] getFields()
    • 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
    • Field getDeclaredField(String name)
    • Field[] getDeclaredFields()
    • 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
public static void testField(Class<Person> cls) throws Exception{
		Field name=cls.getDeclaredField("name");
		//成员要跟随对象使用
		Person p=cls.getConstructor(String.class,int.class,Double.TYPE).newInstance("因为",18,100);
		name.setAccessible(true);
		System.out.println(name.get(p));
		name.set(p, "所以");
		System.out.println(name.get(p));
		name.setAccessible(false);
	}

数据库

select 查询

  • 查询select * from 表名:查询表中所有字段,*代表所有字段

  • 查询select 字段名1,字段名2 from 表名:查询表名字段

  • select查询出来的是个结果集,

  • 去重select distinct 字段名 from 表名:去重,去掉字段名中相同字段,如果有多个字段名,要字段名对应全部相同才能去重

  • **伪列:**虚拟构建的列,select 字段名,表达式,字段名 as 字段值 from 表名

  • 别名:

    • as:字段别名可以使用as;表别名不能使用as

    • “”:原样输出字符串和空格等,“”不是字符串;可以存在空格与区分大小写

    • select ename as "雇员 姓名" from emp;
      select ename "雇员姓名" from emp;
      select ename 雇员姓名 from emp;
      select ename as 雇员姓名 from emp;
      select ename as " Ename" from emp;
      
  • 字符串拼接:||用来拼接,‘ ’表示字符串,数字会自动转成字符串拼接

    • select 'my' from emp;--拼接表名
      select ename||'a'||'-->' info from emp;--拼接字段名
      
  • 表达式:select 表达式 FROM 表名; 查询表达式

  • 虚表:计算表达式,显示单条记录的值

  • null:遇到数字参与运算的结果为null,遇到字符串为空串

    • 处理null值,nvl(参数1,参数2),如果参数1是null,函数最终的结果是参数2,如果参数1不为null,结果还是参数1

select语句

-- 按条件查询
--select 内容 from 表 where 条件;
--执行流程: from where  select

--a) = 、 >、 <、 >=、 <=、 !=、 <>、 between and   
--b) and 、or、 not、

-- 查询20部门的员工信息
select * from emp where deptno = 20;

-- 查询工资大于1000的员工的姓名 工作岗位  工资   所属部门编号
--查询数据: ename, job, sal , deptno
--数据来源: emp
--条件: sal>1000
select ename, job, sal , deptno from emp where sal>1000;

-- 查询不在20部门工作的员工信息
select * from emp where deptno != 20;
select * from emp where deptno <> 20;
select * from emp where not deptno = 20;

-- 查询员工的年薪大于20000的 员工名称、岗位 年薪
select ename,job,(sal+nvl(comm,0))*12 from emp where (sal+nvl(comm,0))*12>20000;
--先查询所有员工的年薪,判断
select ename,job,(sal+nvl(comm,0))*12 money from emp; --数据来源
select * from (select ename,job,(sal+nvl(comm,0))*12 money from emp) where money>20000;

-- 假设现在 900,1000,1100
--all()
-- 查询工资比我们三个人都高的那些员工的信息
select * from emp where sal>all(900,1000,1100);

-- 查询工资比我们三个人都低的那些员工的信息

--some() any()
-- 查询比我们中随便一个工资高的员工信息
select * from emp where sal> some(900,1000,1100);
select * from emp where sal> any(900,1000,1100);

-- 查询 工种为’SALESMAN’的员工信息 (注意 内容区分大小写)
select * from emp where job = 'SALESMAN';

--检索 工资 2000, 3000员工名称 岗位 工资
select * from emp where sal=2000 or sal=3000;
select * from emp where sal in (2000,3000);

-- 工资在2000到3000之间的员工信息
select * from emp where sal>=2000 and sal<=3000;
select * from emp where sal between 2000 and 3000;

---查询 岗位 为 CLERK 且部门编号为 20的员工名称 部门编号,工资
select ename,deptno,sal,job from emp where job='CLERK' and deptno=20;

-- 查询 岗位 为 CLERK 或部门编号为 20的员工名称 部门编号,工资
select ename,deptno,sal,job from emp where job='CLERK' or deptno=20;

--查询 岗位 不是 CLERK 员工名称 部门编号,工资
select ename,deptno,sal,job from emp where job != 'CLERK' ;
select ename,deptno,sal,job from emp where job <> 'CLERK';
select ename,deptno,sal,job from emp where not job = 'CLERK';

-- 查询 岗位 不为 CLERK 并且部门编号不为 20的员工名称 部门编号,工资
select ename,deptno,sal,job from emp where not( job='CLERK' or deptno=20);
select ename,deptno,sal,job from emp where job !='CLERK' and deptno!=20;

--存在佣奖金的员工名称
select ename,comm from emp where not comm is null;
select ename,comm from emp where comm is not null;

--不存在奖金的员工名称
select ename,comm from emp where comm is null;

-- 查询能领到奖金的员工姓名(>0) 
select ename,comm from emp where  comm >0;

--查询工资大于1500 或 含有佣金的人员姓名
select * from emp where sal>1500 or comm is not null;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值