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
反射
必须先得到代表的字节码的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();
4.数据库的批处理
将
preparedStatement.execute();
替换为
preparedStatement.executeBatch();
//清空
preparedStatement.clearBatch();