Java笔记

Java基础笔记

常用的函数

配置信息-Properties

可以用在数据的连接中,下面的是一个例子从文件中读取:

//加载一个类的文件从jdbc.properties中
InputStream inputStream = PreparedStatementUpdateTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
//创建一个Properties 读取输入流
Properties properties = new Properties();
properties.load(inputStream);
//加载数据 user password class 等内容到
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String aClass = properties.getProperty("Class");
String url = properties.getProperty("url");
System.out.println(user + password + aClass + url);

还有设置方法

-setProperty(String key, String value)
​ 致电 Hashtable方法 put

properties.setProperty("password","abc123");

输入输出流

总述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GvLgP1yx-1619332769439)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1619076578847.png)]

Reader

图10-2 Reader的类层次结构图

反射

必须先得到代表的字节码的Class,Class类用于表示.class文件

1.获取class对象

1.1 Object ——> getClass();

Class<? extends Student> aClass = new Student().getClass();

1.2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性

ClassLoaderDemo.class

1.3 通过Class类的静态方法:forName(String className)(常用)

Class.forName("ClassLoader.demo02.Student");

2.对反射类的构造方法

通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;
1.获取构造方法:
​ 1).批量的方法:
​public Constructor[] getConstructors():所有"公有的"构造方法

assert c != null;
Constructor<?>[] constructor = c.getConstructors();
for (Constructor con:constructor){
    System.out.println(con);
}

public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

assert c != null;
Constructor<?>[] constructor = c.getDeclaredConstructors();
for (Constructor con:constructor){
    System.out.println(con);
}

​ 2).获取单个的方法,并调用:
​public Constructor getConstructor(Class… parameterTypes):获取单个的"公有的"构造方法:

Constructor<?> constructor1 = c.getConstructor();
System.out.println(constructor1);

public Constructor getDeclaredConstructor(Class… parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;

Constructor<?> con = c.getConstructor(String.class,String.class,int.class);
System.out.println(con);

​ 调用构造方法:
​ Constructor–>newInstance(Object… initargs)

Object obj=con.newInstance("name","address",30);
System.out.println(obj);

3.获取反射类的方法

1.批量的:

public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)

System.out.println("-----获取所有方法-----");
Method[] methods = c.getMethods();
Arrays.stream(methods).forEach(System.out::println);

public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)

Method[] methods1 = c.getMethods();
Arrays.stream(methods1).forEach(System.out::println);

2.获取单个的:

public Method getMethod(String name,Class<?>… parameterTypes):

参数:

​ name : 方法名;

​ Class … : 形参的Class类型对象

 Method m = c.getMethod("show1", String.class);
 System.out.println(m);
 //实例化一个Student对象
 Object obj = c.getConstructor().newInstance();
 m.invoke(obj, "刘德华");

public Method getDeclaredMethod(String name,Class<?>… parameterTypes)

调用方法:

Method --> public Object invoke(Object obj,Object… args):

参数说明:

​ obj : 要调用方法的对象;

​ args:调用方式时所传递的实参;

4.获取反射类的成员变量

1.批量的

​ 1).Field[] getFields():获取所有的"公有字段"

Field[] fieldArray = stuClass.getFields();
for(Field f : fieldArray){
    System.out.println(f);
}

​ 2).Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;

fieldArray = stuClass.getDeclaredFields();
for(Field f : fieldArray){
    System.out.println(f);
}

2.获取单个的:

​ 1).public Field getField(String fieldName):获取某个"公有的"字段;

Field f = stuClass.getField("name");
System.out.println(f);

​ 2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)

f = stuClass.getDeclaredField("phoneNum");
System.out.println(f);
f.setAccessible(true);//暴力反射,解除私有限定
f.set(obj, "18888889999");
System.out.println("验证电话:" + stu);

设置字段的值:

​ Field --> public void set(Object obj,Object value):

//注意要先创建对象
f.set(obj, "刘德华");

参数说明:

​ 1.obj:要设置的字段所在的对象;

​ 2.value:要为字段设置的值;

JDBC

1.连接

使用JDBC进行数据库的连接有四种方法这里直接使用最终的解决方法

1.加载类 类的参数的方法可以参考 Properties

Class.forName(aClass);

2.使用驱动管理者进行管理

connection = DriverManager.getConnection(url, user, password);

3.以上就建立了一个JDBC的连接 注意之后要关闭连接

//创建sql语句 返回prepareStatement的实例
String sql = null;
sql = "INSERT INTO `fff`.`customers` ( name, email, birth ) VALUES ( ?, ?, ? )";
ps = connection.prepareStatement(sql);

//填充占位符 index 从1开始计数
ps.setString(1, "xue");
ps.setString(2, "123@qq.com");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd");
java.util.Date date = simpleDateFormat.parse("1000-10-01");
ps.setDate(3,new java.sql.Date(date.getTime()));
//ps.setString(3, String.valueOf(new Date(date.getTime())));
//执行操作
ps.execute();

2.封装

关于JDBC的封装

JDBC的无需返回值 可以通过Object来进行封装

		preparedStatement = connection.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                preparedStatement.setObject(i + 1, args[i]);
            }
            //执行
            preparedStatement.execute();

而需要返回值的

		//查询的结果集
		resultSet = preparedStatement.executeQuery();
        if (resultSet == null) {
            System.out.println("查询结果为空");
        }
        Customers customers = new Customers();
        //获取结果集的元数据
        ResultSetMetaData metaData = resultSet.getMetaData();
        if (resultSet.next()) {
            int count = metaData.getColumnCount();
			//System.out.println("一共有:" + count + "列");
            for (int i = 0; i < count; i++) {
                //获取每个列的值
                Object columnValue = resultSet.getObject(i + 1);
				//System.out.println(columnValue.toString());
                //获取反射的列名
                String columnName = metaData.getColumnName(i + 1);
                //开始进行反射
                Field field = Customers.class.getDeclaredField(columnName);
                field.setAccessible(true);
                field.set(customers, columnValue);
            }

这个这里注意 反射时 是先查找到类的变量的名字,随后进行的反射。

        //获取返回值的信息
        ResultSetMetaData metaData = resultSet.getMetaData();
        //获取反射的列名
        String columnName = metaData.getColumnName(i + 1);
        //获取反射的别名
        String columnName = metaData.getColumnLabel(i + 1);
        //获取class里的变量
        Field field = Customers.class.getDeclaredField(columnName);

若是要返回表的多个数据的话 可以使用这个语句

public <T> List<T> getForList(Class<T> Clazz, String sql, Object... args)

3.文件

关于文件上传,上传到数据库,所使用的是以下的一个方法给了文件一个输入流

FileInputStream fileInputStream = new FileInputStream(new File("girl.jpg"));
preparedStatement.setObject(4, fileInputStream);

关于文件的下载

Blob photo = resultSet.getBlob("photo");

InputStream inputStream = photo.getBinaryStream();
FileOutputStream fos = new FileOutputStream("ce.jpg");

int len;
byte[] buffer = new byte[1204];
while ((len = inputStream.read(buffer) )!= -1) {
    fos.write(buffer, 0, len);
}

4.数据库的批处理

            preparedStatement.execute();

替换为

            preparedStatement.executeBatch();
            //清空
            preparedStatement.clearBatch();

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes

4.数据库的批处理

            preparedStatement.execute();

替换为

            preparedStatement.executeBatch();
            //清空
            preparedStatement.clearBatch();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值