jdbc 参数 utf8_Java从入门到入土day27 反射和jdbc

2326b3abf404dd0464f3d8175e8fbed5.png

新的一周,新的催更,新的学习,学习使我昏厥。

756128b1dd8af65271e579874d4bb386.png

正文分割线


一、反射

1、反射的定义:在程序编译的过程中动态加载类的方式。

2、反射的使用顺序:

1)获得一个类的定义:

Class.forname(类的限定名);当你不知道类的名字时候。

类名.class;当你知道类名字时,你可以用类名.class。

类对象.getclass();当这个类已经实例化了以后,你可以用类对象.getclass()方法。

2)创建类对象:

调用无参构造器产生实例:直接用该class对象.newInstance();

调用有参构造器产生实例:该class对象.getConstructor(参数的数据类型.class);这个方法会返回一个Constructor对象,用这个对象调用newInstance(具体的参数)来实例化对象

3)调用属性

使用Field来得到类的属性:直接用该class对象.getField(某某属性)

如果该类是私有类,那么我们需要给其他类授权访问私有属性:该类class对象.setAccessible(true);然后再通过该类class对象.getDeclaredField(某某属性)

给属性赋值的话就使用set方法。

4)调用私有方法

使用Method来得到某方式:直接用该类class对象.getMethod(方法名,null)

假如这个方法私有方法,那么处理方法和上面的一样。最后使用getDeclaredMethod。

调用该方法的话就是使用invoke方法。

5)获得注解

使用MyLog来获得方法上面的注解。

首先要获得该方法Method类对象,然后用这个类对象.getAnnotation(MyLog.class);

二、JDBC

1、JDBC的定义:

JDBC(Java Database Connectivity)是Java中提供的一套数据库编程API,它定义了一套用来访问数据库的标准Java类库(位于java.sql和javax.sql包中)

2、JDBC的作用:

通过发送SQL语句,来完成对数据库的操作(CRUD)

JDBC:只是一套JAVA用来连接数据库的标准API(接口)而已,具体的实现还需要不同的厂商自己实现。由于它的标准是统一,所以JDBC可以通过同一套代码连接不同的数据库

mybatis,hibernate,spring-data-jpa 他们的底层,连接数据库都是使用的JDBC

3、JDBC的执行过程

0d0ef73d9977936fa068cce1c57c12fb.png
(JDBC的驱动程序由不同的数据库厂家自己提供)

三、JDBC连接数据库的6个步骤

1、根据相应程序所用的数据库,选择JDBC驱动程序类型。

从从https://mvnrepository.com/ 网上下载 mysql-connector-java.jar 驱动包

eda80353c21b5a2ccebd351595a71c79.png

在项目中,创建一个目录lib (库) 跟src 平级

运行select version();检查数据库的版本

5.6 — mysql-connector-java-5.1.47.jar
8.+ — mysql-connector-java-8.0.19.jar

选择mysql-connector-java-5.1.47.jar 右键—Build Path — Add Buid Path把数据库文件加载到项目之中。

2、连接到数据库,得到Connection对象

package com.woniuxy.java33.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class MainEnter {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Connection conn = null;
        try {
            //使用反射加载数据库的驱动程序
            Class.forName("com.mysql.jdbc.Driver");
            //使用url name password 连接MySQL数据库
            conn =  DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/woniuxy?characterEncoding=utf8", "root", "123456");
            //取消自动提交
            conn.setAutoCommit(false);

3、通过Connection创建Statement对象

//创建Statement编译对象
Statement state = conn.createStatement();

4、使用Statement对象提交SQL语句

//编写需要发送给MySQL的SQL语句
String sql = "insert into  user_info(user_name,age,gender) values ('坡上',18,'男')";

5、操作结果集

//调用executeUpdate() 执行SQL语句,并查看数据库受影响的行数
            int result = state.executeUpdate(sql);//通常用来CUD
            System.out.println("rows==" + result);            
//事务提交
            conn.commit()

6、回收数据库资源

} catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            try {
                //数据库回滚
 conn.rollback();
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }finally {
            try {
                //连接关闭
 conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

代码详解

package com.woniuxy.test;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 反射中所涉及的方法
 * @author 84980
 *
 */
public class Improtant{
	//主启动类
	public static void main(String[] args) {
		
		try {
			//通过Class.forName获得Class类,其中的参数是类的全限定名
			Class cls = Class.forName("com.woniuxy.test.Clazz");
			//如果已知类的情况,使用类名.class也可以获得
			Class cls2 = Clazz.class;
			//如果已知类的对象,使用对象.getClass()同样可以获取到
			Clazz clazz = new Clazz();
			Class cls3=clazz.getClass();
			//可以看到三个对象都是一样的
			System.out.println(cls);
			System.out.println(cls2);
			System.out.println(cls3);
			
			//通过Class类对象创建对象,通过无参构造器创建
			Object obj = cls.newInstance();
			//通过有参构造器创建对象,有参构造器中参数是什么类型就传入该类型的类
			Constructor cons =cls.getConstructor(int.class,int.class);
			Object obj1=cons.newInstance(11,12);
			//打印两个实例化类
			System.out.println(obj);
			System.out.println(obj1);
			
			//调用属性
			Field field=cls.getField("num_pub");
			//给属性赋值,第1个参数为实例化的对象
			field.set(obj,100);
			//获得私有属性
			Field field2=cls.getDeclaredField("num_pri");
			//假如遇到是私有属性的话要授权访问私有属性
			field2.setAccessible(true);
			field2.set(obj, 101);
			//现在obj这个对象中属性就有值了
			System.out.println(obj);
			
			//调用方法
			Method meth = cls.getMethod("method_pub", int.class);
			//调用方法
			Object result = meth.invoke(obj, 11);
			System.out.println(result);
			//调用私有方法
			Method meth1 = cls.getDeclaredMethod("method_pri", int.class);
			//授权访问私有方法
			meth1.setAccessible(true);
			Object result1 = meth1.invoke(obj, 12);
			System.out.println(result1);
			
			//获得注解,此处的MyLog是你自定义的注解名字
			MyLog mylog = meth.getAnnotation(MyLog.class);
			System.out.println(mylog.desc());
			System.out.println(mylog.uri());
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}

	}
}

/**
 * 反射所引用的类
 * @author 84980
 *
 */
class Clazz{
	//公共的属性
	public int num_pub;
	//私有的属性
	private int num_pri;
	//公共的方法
	@MyLog(desc="我爱你",uri="我不爱你")
	public int method_pub(int a) {
		System.out.println("方法调用1"+a);
		return a;
	}
	//私有的方法
	private int method_pri(int a) {
		System.out.println("方法调用2"+a);
		return a;		
	}
	//无参构造器
	public Clazz() {
		super();
	}
	//有参构造器
	public Clazz(int num_pub, int num_pri) {
		super();
		this.num_pub = num_pub;
		this.num_pri = num_pri;
	}
	@Override
	public String toString() {
		return "Clazz [num_pub=" + num_pub + ", num_pri=" + num_pri + "]";
	}
	
	
}

自定义的注解

package com.woniuxy.test;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义一个注解
 * @author 84980
 *
 */
@Documented	//该注解可以文档化
@Target(value= {ElementType.TYPE,ElementType.METHOD})	//注解使用范围
//括号中的参数代表着这个注解可以放在接口、类、枚举和方法上
@Retention(RetentionPolicy.RUNTIME)
public @interface MyLog {
	//随便创建两个注解的变量
	String uri();
	
	String desc();
}

JDBC简单地操作数据库(注意导包哦,你的数据库是哪个版本就用哪个版本的JDBC)

package com.woniuxy.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 
 * @author 84980
 *
 */
public class ThreadStudy {
	public static void main(String[] args) {
		//定义一个数据库连接
		Connection conn = null;
		
		try {
			//使用反射加载数据库的驱动程序
			Class.forName("com.mysql.jdbc.Driver");
			/*连接你的数据库
			 * jdbc:mysql:是固定写法
			 * 后面那个是你数据库所在的ip地址,假如安装到本机的话就是本机的IP地址
			 * 后面的3306是数据库默认使用的端口,假如你在安装数据的时候没有改过,那么默认就是3306
			 * 后面woniuxy这个是你数据库的名字
			 * ?后面那个是编码格式
			 * 后两个参数是你的账号和密码
			 */
			conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/woniuxy?characterEncoding=utf8", "root", "admin123456");
			//取消自动提交
			conn.setAutoCommit(false);
			
			//通过Connection创建Statement对象
			Statement state = conn.createStatement();
			//使用Statement对象提交SQL语句,此处写SQL语句就像之前前两天写SQL语句那样
			String sql = "insert into  user_info(user_name,age,gender) values ('坡上',18,'男')";
			//调用executeUpdate() 执行SQL语句,并查看数据库受影响的行数。这个方法通常用来增,删,改
			int result = state.executeUpdate(sql);
			System.out.println("影响行数=="+result);
			//提交事务
			conn.commit();
		} catch (Exception e) {
			//假如执行有问题就回滚数据库,就是让插入数据这个操作撤回
			e.printStackTrace();
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO 自动生成的 catch 块
				e1.printStackTrace();
			}
		}finally {
			//回收数据库资源
			//关闭连接
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
		

	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值