jdbc的复习与学习

1.JDBC程序编写步骤

在这里插入图片描述

2.获得数据库的连接

加载源码:
点击Drive 然后 Attach Source ,文件在jar包里面的src文件之下

2.1 Driver接口简述

java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库 厂商提供不同的实现。 在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用 这些Driver实现。
Oracle的驱动:oracle.jdbc.driver.OracleDriver
mySql的驱动: com.mysql.jdbc.Driver

2.2 URL

JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到 数据库的连接。
JDBC URL的标准由三部分组成,各部分间用冒号分隔。
jdbc:子协议:子名称
协议:JDBC URL中的协议总是jdbc
子协议:子协议用于标识一个数据库驱动程序
子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库 提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名
在这里插入图片描述

2.3 要素三:用户名和密码

1.user,password可以用“属性名=属性值”方式告诉数据库
2. 调用 DriverManager 类的 getConnection() 方法建立到数据库的连接

2.4 数据库连接方式

package TEST_1;
import java.sql.SQLException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.util.Collection;
import java.util.Properties;
public class test
{
    
    
	public void Connection1() throws Exception
	{
    
    
	//数据连接的四个基本要素
	String url="jdbc:mysql://localhost:3306/book?useSSL=false&serverTimezone=UTC";
	String user="root";
	String password="Ys04050016";
	Class.forName("com.mysql.cj.jdbc.Driver");//提供java.sql.Driver接口实现类的对象
	//获得连接
	Connection con=DriverManager.getConnection(url,user,password);
	}
	public void Connection2() throws Exception
	{
    
    
		//读取配置文件的4个基本信息,这里的test位置是与类有关的要改变 
		//加载配置文件
		InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
		Properties pros=new Properties();
		pros.load(is);
		String user=pros.getProperty("user");
		String password=pros.getProperty("password");
		String url=pros.getProperty("url");
		String driverClass=pros.getProperty("driverClass");
		//2.加载驱动
		Class.forName(driverClass);
		//3.获取链接
		Connection conn=DriverManager.getConnection(url, user,password);
	}
}

所以为了减少代码的冗余 可以写个函数来返回conn

public static Connection FinalConnection() throws Exception
	{
    
    
		InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
		Properties pros=new Properties();
		pros.load(is);
		String user=pros.getProperty("user");
		String password=pros.getProperty("password");
		String url=pros.getProperty("url");
		String driverClass=pros.getProperty("driverClass");
		Class.forName(driverClass);
		Connection conn=DriverManager.getConnection(url, user,password);
		return conn;
		
	}

3 基本功能

顺序

1.获取数据库的连接
2.预编译sql语句,返回PreparedStatement的实例
3.填充占位符
4.执行
5.资源的关闭

初始代码

package TEST_1;
import java.sql.SQLException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Collection;
import java.util.Properties;
public class test
{
    
    
	//冗余代码
	public void Connection1() throws Exception
	{
    
    
	//数据连接的四个基本要素
	String url="jdbc:mysql://localhost:3306/book?useSSL=false&serverTimezone=UTC";
	String user="root";
	String password="Ys04050016";
	Class.forName("com.mysql.cj.jdbc.Driver");//提供java.sql.Driver接口实现类的对象
	//获得连接
	Connection con=DriverManager.getConnection(url,user,password);
	}
	//不好用
	public static void Connection2() throws Exception
	{
    
    
		//读取配置文件的4个基本信息 
		//加载配置文件
		InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
		Properties pros=new Properties();
		pros.load(is);
		String user=pros.getProperty("user");
		String password=pros.getProperty("password");
		String url=pros.getProperty("url");
		String driverClass=pros.getProperty("driverClass");
		//2.加载驱动
		Class.forName(driverClass);
		//3.获取链接
		Connection conn=DriverManager.getConnection(url, user,password);
	}
	//最终的连接方法 好用
	public static Connection FinalConnection() throws Exception
	{
    
    
		InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
		Properties pros=new Properties();
		pros.load(is);
		String user=pros.getProperty("user");
		String password=pros.getProperty("password");
		String url=pros.getProperty("url");
		String driverClass=pros.getProperty("driverClass");
		Class.forName(driverClass);
		Connection conn=DriverManager.getConnection(url, user,password);
		return conn;
	}
	public static void CloseResource(Connection conn,PreparedStatement ps)
	{
    
    
		try {
    
    
			ps.close();
			conn.close();
		} catch (Exception e)
		{
    
    
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
	//添加数据
	public  static void Insert() throws Exception
	{
    
    
			String sql="insert into book(name,number,price)values(?,?,?)";
			Connection conn=FinalConnection();
			PreparedStatement ps=conn.prepareStatement(sql);
			//然后依次写下你添加的数据
			ps.setString(1,"鬼谷子");
			ps.setString(2,"1");
			ps.setString(3, "1");
			ps.execute();
			//每次都得关闭 直接写一个方法
//			ps.close();
//			conn.close();
			CloseResource(conn,ps);
	}
	
	public static void main(String args[])
	{
    
    
		try 
		{
    
    
			Insert();
		} catch (Exception e)
		{
    
    
			e.printStackTrace();
		}
	}
}

Java与SQL对应数据类型转换表
在这里插入图片描述

ResultSet与ResultSetMetaData

查询需要调用PreparedStatement 的 executeQuery() 方法,查询结果是一个ResultSet 对象
ResultSetMetaData meta = rs.getMetaData();
getColumnName(int column):获取指定列的名称
getColumnLabel(int column):获取指定列的别名
getColumnCount():返回当前 ResultSet 对象中的列数。
getColumnTypeName(int column):检索指定列的数据库特定的类型名称。
getColumnDisplaySize(int column):指示指定列的大标准宽度,以字符为单位。
isNullable(int column):指示指定列中的值是否可以为 null。
isAutoIncrement(int column):指示是否自动为指定列进行编号,这样这些列仍然是只读的

连接

public static Connection FinalConnection() throws Exception
{
    
    
		InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
		Properties pros=new Properties();
		pros.load(is);
		String user=pros.getProperty("user");
		String password=pros.getProperty("password");
		String url=pros.getProperty("url");
		String driverClass=pros.getProperty("driverClass");
		Class.forName(driverClass);
		Connection conn=DriverManager.getConnection(url, user,password);
		return conn;
	}

资源的关闭

 资源的关闭
	public static void CloseResource(Connection conn,PreparedStatement ps)
	{
    
    
		try 
		{
    
    
			ps.close();
			conn.close();
		} catch (Exception e)
		{
    
    
			e.printStackTrace();
		}
	}
	这个是把那个res也给close
	public static void CloseResource(Connection conn,PreparedStatement ps,ResultSet result)
	{
    
    
		try {
    
    
				ps.close();
				conn.close();
				result.close();
			} catch ( Exception e) {
    
    
				e.printStackTrace();
			}
	}

增删改

不通用的,不建议

添加数据
	public  static void Insert() 
	{
    
    
		String sql="insert into book(name,number,price)values(?,?,?)";
		Operation(sql,"毛概","2","20");
	}
修改操作
	public static void Update()
	{
    
    
	String sql="update book set name = ? where id = ?";
 //第一个是修改后的,第二个是修改前
	Operation(sql,"概率统计","高等数学");
	}
删除操作
	public static void Delete()
	{
    
    
		String sql="delete from book where name = ?";
		Operation(sql,"高等数学");
	}

三个操作 通用代码

	通用的增删改操作!!!!
	1 .获得数据库的链接
	2.获取PreparedStatement的实例(预编译sql语句)
	3 填充占位符
	4执行sql语句
	5关闭资源
	public static void Operation(String sql,Object...args)
	{
    
    
		Connection conn=null;
		PreparedStatement ps=null;
		try
		{
    
    
			conn = FinalConnection();
			ps = conn.prepareStatement(sql);
			for(int i=0;i<args.length;i++)
			{
    
    
				//小心这里不要出错
				ps.setObject(i+1,args[i]);
			}
			ps.execute();
		}catch (Exception e) 
		{
    
    
			e.printStackTrace();
		}
		finally
		{
    
    
		CloseResource(conn, ps);
		}
	}

查询操作

不通用的查询操作

不是通用的查询操作
	public static void Query0() 
	{
    
    
		try {
    
    
			Connection conn=FinalConnection();
			String sql="select name,number,price from book where name = ?";
			PreparedStatement ps= conn.prepareStatement(sql);
			//执行并返回结果
			ResultSet result=ps.executeQuery();
			if(result.next())//如果找到了
			{
    
    
				String name=result.getNString(1);
				String number=result.getNString(2);
				String price=result.getNString(3);
				//可以把他们封装成一个对象输出
				Book b(name,number,price);
				b.Out(b);
			}
			CloseResource(conn, ps, result);
		} catch (Exception e) {
    
    
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

通用的查询操作,但是只能返回一个对象

通用查询(返回一个对象)
	 1.获得数据库链接
	 2.预编译sql返回对象
	 3.填充占位符
	 4.执行executeQuery(),得到结果集ResultSet
	 5.得到结果集的元数据:ResultSetMetaDate
	 6.通过ResultSetMetaDate得到columnCount,columnLabel;通过ResultSet得到列值
	 
	public static <T> T getInstance(Class<T> clazz,String sql,Object...args) 
	{
    
    
		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
    
    
			conn = FinalConnection();
			ps = conn.prepareStatement(sql);
			//填充占位符
			for(int i=0;i<args.length;i++)
			{
    
    
				ps.setObject(i+1,args[i]);
			}
			rs = ps.executeQuery();
			//得到结果集元数据
			ResultSetMetaData rsmd=rs.getMetaData();
			int columnCount=rsmd.getColumnCount();
			if(rs.next())
			{
    
    
				T t=clazz.newInstance();
				//遍历每一列
				for(int i=0;i<columnCount;i++)
				{
    
    
					//获取列值
					Object columnVal=rs.getObject(i+1);
					//获取列的别名  属性
					String columnLabel=rsmd.getColumnLabel(i+1);
					//使用反射,给对象的相应属性赋值
					Field field=clazz.getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(t, columnVal);
				}
				return t;
			}
		} catch (Exception e) {
    
    
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally {
    
    
			CloseResource(conn, ps, rs);
		}
		return null;
	}

通用查询操作 返回一个集合

//返回多个对象   集合
	public static <T>List<T> getForList(Class<T> clazz,String sql,Object...args)
	{
    
    

		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
    
    
			conn = FinalConnection();
			ps = conn.prepareStatement(sql);
			//填充占位符
			for(int i=0;i<args.length;i++)
			{
    
    
				ps.setObject(i+1,args[i]);
			}
			rs = ps.executeQuery();
			//得到结果集元数据
			ResultSetMetaData rsmd=rs.getMetaData();
			int columnCount=rsmd.getColumnCount();
			
			//提前弄一个集合
			ArrayList<T>list=new ArrayList<T>();
			
			while(rs.next())
			{
    
    
				T t=clazz.newInstance();
				//遍历每一列
				for(int i=0;i<columnCount;i++)
				{
    
    
					//获取列值
					Object columnVal=rs.getObject(i+1);
					//获取列的别名  属性
					String columnLabel=rsmd.getColumnLabel(i+1);
					//使用反射,给对象的相应属性赋值
					Field field=clazz.getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(t, columnVal);
				}
				list.add(t);
			}
			return list;
		} catch (Exception e) {
    
    
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally {
    
    
			CloseResource(conn, ps, rs);
		}
		return null;
	}


在调用的时候这样写
	String sql="select name,number,price from book where number = ?";
	Book b=getInstance(Book.class,sql,1);
	b.Out(b);//自己写个函数输出它的属性的

猜你喜欢

转载自blog.csdn.net/weixin_45988242/article/details/108902723