Java185Mysql

反射

在这里插入图片描述

获取class对象的三种方式

在这里插入图片描述

//1.第一种方式/全类名:包名+类名
Class clazz1 = Class.forName("com.itheima.myreflect1.Student");
//2.第二种方式
Class clazz2 = Student.class;
//3.第三种方式
Student s = new Student();
Class clazz3 = s.getClass();

反射获取成员变量

在这里插入图片描述

//1.获取class字节码文件的对象
Class clazz = Class.forName("com.itheima.myreflect3.Student");
//2.获取所有的成员变量
/* Field[] fields = clazz.getDeclaredFields();
for (Field field: fields){
System.out.println(field);
}*/
/获取单个的成员变量
Field name = clazz.getDeclaredField( "name");
System.out.println(name);
∥获取权限修饰符
int modifiers = name.getModifiers();
System.out.println(modifiers);
//获取成员变量的名字L
String n = name.getName();
System.out.println(n);
/获取成员变量的数据类型
Class<?> type = name.getType();
System.out.println(type);
//获取成员变量记录的值
Student s = new Student(name: "zhangsan",age: 23, gender: "男");
name.setAccessible(true);
String value = (String) name.get(s);
System.out.println(value);
//修改对象里面记录的值
name.set(s,"lisi");
System.out.println(s);


利用反射获取成员方法

在这里插入图片描述

保存任意对象数据

package com.itheima.Myreflect5;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;

public class MyReflectDemo {
    public static void main(String[] args) {
        /*
对于任意一个对象,都可以把对象所有的字段名和值,保存到文件中去
*/
        Student s = new Student("小A", 23,"女",167.5,"睡觉");
        Teacher t = new Teacher("播姐",10000);
        saveObject(s);


    }

    private static void saveObject(Object obj) throws IOException {
        //1、获取字节码文件的对象
        Class clazz=obj.getClass();
        //2.获取所有成员变量
        Field[] fields=clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);//访问权限
            //获取成员变量名字
            String name = field.getName();
            //创建IO流
            BufferedWriter bw=new BufferedWriter(new FileWriter("\\c.jpg"));

            //获取成员变量的值
            Object value = field.get(obj);
            //写出数据
            bw.write(name+"="+value);
            bw.newLine();

            bw.close();

        }
        

    }
}

利用反射动态的创建对象和运行方法

package com.itheima.Myreflect5;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

public class MyReflectDemo2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {

        //  反射可以跟配置文件结合的方式,动态的创建对象,并调用方法

//1.读取配置文件中的信息
        Properties prop = new Properties();
        FileInputStream fis = new FileInputStream(  "myreflect\\prop.properties");
        prop.load(fis);
        fis.close();
        System.out.println(prop);
//2.获取全类名和方法名
        String className = (String) prop.get("classname");
        String methodName = (String) prop.get("method");
        System.out.println(className);
        System.out.println(methodName);
        //3.利用反射创建对象并运行方法
        Class clazz = Class.forName(className);
        //获取构造方法
        Constructor con = clazz.getDeclaredConstructor();
        Object o = con.newInstance();
        System.out.println(o);
        //获取成员方法并运行
        Method method = clazz.getDeclaredMethod(methodName);
        method.setAccessible(true);
        method.invoke(o);



    }
}

反射总结

在这里插入图片描述

动态代理:无侵入式的给代码添加额外的功能

在这里插入图片描述

/*java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
参数一:用于指定用哪个类加载器,去加载生成的代理类
参数二: 指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法
参数三:用来指定生成的代理对象要干什么事情*/
Star star = (Star) Proxy.newProxyInstance(
ProxyUtil.class.getclassLoader()//参数一:用于指定用哪个类加载器,去加载生成的代理类
new Class[]{Star.class},/∥参数二:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法
//参数三:用来指定生成的代理对象要干什么事情
new InvocationHandler() {
@override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/*
*参数一:代理的对象
*参数二:要运行的方法sing
*参数三:调用sing方法时,传递的实参
* */
if("sing".equals(method.getName())){
System.out.println("准备话筒,收钱");
}else if("dance".equals(method.getName())){
System.out.println("准备场地,收钱");
}/去找大明星开始唱歌或者跳舞
/代码的表现形式:调用大明星里面唱歌或者跳舞的方法
return method.invoke(bigStar,args);
}

Mysql通用语法以及分类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

create table emp(
id int,
workno varchar(10),
name varchar(10),
gender char(1) ,
age tinyint unsigned,
idcard char(18),
entrydate date 
);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

insert into users(id, name) values (1,'1');
select *
from users;
insert into users values (2,'2');

在这里插入图片描述
在这里插入图片描述

DQL:查询

在这里插入图片描述

--1.查询指定字段 name,workno,age 返回
select name,workno,age from emp;
--2.查询所有字段返回
select id, workno, name, gender, age, idcard,workaddress, entrydate from emp;
select * from emp;
--3.查询所有员工的工作地址,起别名
select workaddress as'工作地址'from emp;

select workaddress'工作地址'from emp;
--4.查询公司员工的上班地址(不要重复)


select distinct workaddress ‘工作地址’ from emp;

在这里插入图片描述

select  * from emp where  age=88;
select  * from emp where  age!=88;
select  * from emp where  age<>88;
select  * from emp  where age<20;
select  * from emp where  idcard is null;
select  * from emp where  idcard is not null;
select  * from emp where  age=18 or age=20 or age =40;
select  * from emp where  age in(18,20,40);
-- 查询姓名为两个字的name员工
select  * from emp where  name like '__';
select  * from emp where  idcard like '%X';

聚合函数

在这里插入图片描述

-- 1.统计该企业员工数量
select count(*) from emp;
select  count(idcard) from emp;

-- 2.统计该企业员工的平均年龄
select avg(age) from emp;

-- 3.统计该企业员工的最大年龄
select max(age) from emp;

-- 4.统计该企业员工的最小年龄
select min(age) from emp;
-- 5.统计西安地区员工的年龄之和
select sum(age)from emp where workaddress='西安';

分组查询

-- 1.根据性别分组,统计男性员工和女性员工的数量
select gender, count(*) from emp group by gender ;
-- 2.根据性别分组,统计男性员工和女性员工的平均年龄
select gender, avg(age) from emp group by gender ;
-- 3.查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
select workaddress, count(*) from emp where age < 45 group by workaddress  having count(*)>=3;

排序查询

在这里插入图片描述

-- 排序查询
-- 1。根据年龄对员工的公司进行生序排序
select  *from emp order by age asc;
-- 2.根据入职时间进行降序排序
-- 1。根据年龄对员工的公司进行生序排序
select  *from emp order by entrydate desc;
-- 3.根据年龄 对公司员工进行生序排序,年龄相同,再按照入职时间进行降序排列
select  * from emp order by  age asc,entrydate desc;

分页查询

在这里插入图片描述

练习


-- 1.查询年龄为20,2122,23岁的女性员工信息。
select * from emp where gender ='女'and age in(20,21,22,23);
-- 2.查询性别为男,并且年龄在20-40岁(含)以内的姓名为三个字的员工。
select * from emp where gender ='男'and age between 20 and 40 and name like'___';
-- 3.统计员工表中,年龄小于60岁的,男性员工和女性员工的人数。
select gender, count(*) from emp where age < 60 group by gender;
-- 4.查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序。
select name , age from emp where age <= 35 order by age asc , entrydate desc;
-- 5.查询性别为男,且年龄在20-40(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。
select * from emp where gender ='男'and age between 20 and 40 order by age asc,entrydate asc limit 5;

执行顺序

在这里插入图片描述

DCL用户管理

在这里插入图片描述
在这里插入图片描述

字符串函数

在这里插入图片描述

-- 1.由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如:1号员工的工号应该为00001
update  emp set  workno=lpad(workno,5,'0');

在这里插入图片描述
通过数据库的函数,生成一个六位的随机数

-- 案例:通过数据库的函数,生成一个六位数的随机验证码。
select  lpad(round(rand()*1000000,0),6,'0');

日期函数

在这里插入图片描述

-- 案例:查询所有员工的入职天数,并根据入职天数倒序排序。
select name,datediff(curdate(),entrydate) as'entrydays' from emp order by entrydays desc;

流程函数

在这里插入图片描述

select
    name,
    (case workaddress when'北京'then'一线城市'when'上海'then'一线城市'else'二线城市' end ) as'工作地址'
from emp;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值