JDBC java连接数据库

◇◆丶佛笑我妖孽 提交于 2020-02-07 22:00:12

Day04笔记

一、JDBC

1.理解

**jdbc:**java database connectivity java与数据库的连接

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

2.角色分类

服务器(db): a)、接收 sql b)、执行 sql c)、返回结果
**客户端(java):**a)、接收数据 b)、组装sql c)、发送SQL(与数据库建立联系)

d)、分析结果

3.面向接口编程

接口名称 作用
java.sql.Connection 连接
java.sql.Statement 静态处理块
java.sql.PreparedStatement 预处理块
java.sql.ResultSet 结果集
java.sql.ResultSetMetaData 结果集元信息

二、JDBC使用

1.连接

1)准备工作

1.1先去Oracle数据库安装路径下,获取到ojdbc6.jar 拿到项目中,新建一个资源文件夹,objc6.java放进去

2.2点击右键build path->add to build path

2.步骤

java基本流程:

  • 1.加载驱动
  • 2.获取连接
  • 3.准备sql语句
  • 4.获取处理块
  • 5.执行完毕的结果,接收结果集
  • 6.处理数据
  • 7.关闭
public class JDBCDemo01 {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		//1.加载驱动
		Class.forName("oracle.jdbc.OracleDriver");
		//2.获取连接
		Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","SCOTT","TIGER");
		//3.准备sql语句(select 语句不能添加分号;)
		String sql="select deptno,dname from dept";
		//4.获取处理块
		Statement state=conn.createStatement();
		//5.执行完毕的结果,接收结果集
		ResultSet result=state.executeQuery(sql);
		//6.处理数据
		while(result.next()){
			//得到索引
			int i=result.getInt(1);
			String name=result.getString("dname");
			System.out.println(i+"-->"+name);
		}
	}
}

3.优化步骤

优化:

​ 1.异常

​ 2.数据库配置信息使用配置动态读取

public class JDBCDemo02 {
	public static void main(String[] args){
		//创建文件对象
		Properties pro=new Properties();
		//加载流,读取文件信息
		try {
			pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//1.加载驱动
		try {
			Class.forName(pro.getProperty("driver"));
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//2.获取连接
		Connection conn=null;
		Statement state=null;
		ResultSet result=null;
		try {
			conn = DriverManager.getConnection(
					pro.getProperty("url"),
					pro.getProperty("name"),
					pro.getProperty("pwd"));
			//3.准备sql语句(select 语句不能添加分号;)
			String sql="select deptno,dname from dept";
			//4.获取处理块
		    state=conn.createStatement();
			//5.执行完毕的结果,接收结果集
			result=state.executeQuery(sql);
			//6.处理数据
			while(result.next()){
				//得到索引
				int i=result.getInt(1);
				String name=result.getString("dname");
				System.out.println(i+"-->"+name);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//7.关闭
		try {
			if(result!=null){
				result.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if(state!=null){
				state.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if(conn!=null){
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

三、用户登录 、转账(事务 默认提交)

1.案例

public class JDBCDemo02 {
	public static void main(String[] args){
		//创建文件对象
		Properties pro=new Properties();
		//加载流,读取文件信息
		try {
			pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//1.加载驱动
		try {
			Class.forName(pro.getProperty("driver"));
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
//2.获取连接
	Connection conn=null;
	Statement state=null;
	ResultSet result=null;
	try {
		conn = DriverManager.getConnection(
				pro.getProperty("url"),
				pro.getProperty("name"),
				pro.getProperty("pwd"));
		//3.准备sql语句(select 语句不能添加分号;)
		String sql="select deptno,dname from dept";
		//4.获取处理块
	    state=conn.createStatement();
		//5.执行完毕的结果,接收结果集
		result=state.executeQuery(sql);
		//6.处理数据
		while(result.next()){
			//得到索引
			int i=result.getInt(1);
			String name=result.getString("dname");
			System.out.println(i+"-->"+name);
		}
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	//7.关闭
	try {
		if(result!=null){
			result.close();
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
	try {
		if(state!=null){
			state.close();
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
	try {
		if(conn!=null){
			conn.close();
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

2.数据库通用访问对象

1.增删改的功能
2.查询的功能
 /*

  - 可变参数 相同的数据类型的0~多个参数
  - 1.数据类型 ... 参数名,0~n个
  - 2.必须定义在参数列表的最后
  - 3.通过数据的操作方式去使用,会隐式的为可变参数定义一个数组
     */
public class BaseDao<T> {
//查询 
//返回值List			参数:sql  值     
public List<T> testQuery(String sql,Class<T> cls,Object...args){
	List<T> ls=new ArrayList();
	boolean flag=false;
	Connection conn=null;
	PreparedStatement state=null;
	ResultSet result=null;
	ResultSetMetaData meta=null;
	try {
		conn=DBUtils.getConnection();
		state=conn.prepareStatement(sql); 
		//为?赋值
		if(args!=null&&args.length!=0){
			for(int i=0;i<=args.length-1;i++){
				state.setObject(i+1, args[i]);
			}
		}
		//结果集
		result=state.executeQuery();
		//结果集原信息对象
		meta=result.getMetaData();
		int columnNum=meta.getColumnCount();
		
while(result.next()){
		//能够进入循环就有一个对象
		T t=cls.newInstance();  //默认调用空构造
		for(int i=1;i<=columnNum;i++){
			//2.从结果集中获取这条每一个字段的值
			Object value=result.getObject(i);  //从1开始
			//3.获取对应java类中的对应属性
			String name=meta.getColumnLabel(i);
	//1.创建一个对应类型的成员属性  getDeclaredField(String name) 
			Field field=cls.getDeclaredField(name);
			field.setAccessible(true); //设置值
			//4.给这个属性赋值
			field.set(t,value);
			field.setAccessible(false);
		}
		//5.把对象放入list容器
		ls.add(t);
	}
} catch (SQLException e) {
	e.printStackTrace();
} catch (InstantiationException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (IllegalAccessException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (NoSuchFieldException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (SecurityException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} finally{
	DBUtils.close(result,state, conn);
}

return ls;
 }

  //增删改
  public boolean testUpdate(String sql,Object ... args){
  	boolean flag=false;
  	Connection conn=null;
  	PreparedStatement state=null;
  	try {
  		conn=DBUtils.getConnection();
  		state=conn.prepareStatement(sql);  //防止sql注入,预编译提高效率
  		//为?赋值
   	for(int i=0;i<=args.length-1;i++){
  			state.setObject(i+1, args[i]);
  		}
  		int row=state.executeUpdate();
  		if(row>0){
  			flag=true;
  		}
  	} catch (SQLException e) {
  		// TODO Auto-generated catch block
  		e.printStackTrace();
  	} finally{
  		DBUtils.close(state, conn);
 	}
  	return flag;
  }
}
public class Test {
	public static void main(String[] args) {
		BaseDao<User> base=new BaseDao<User>();
		//String sql="insert into sxt_user values(haha.nextval,?,?)";
//		boolean flag=base.testUpdate(sql, "laopei",123);
		/*String sql="delete from sxt_user where id=?";
		boolean flag=base.testUpdate(sql,103);
		if(flag){
			System.out.println("操作成功");
		}else{
			System.out.println("操作失败");
		}*/
	
		String sql2="select uname \"uname\" from sxt_user";
		List<User> ls=base.testQuery(sql2, User.class);
		System.out.println(ls);
	}
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!