文章目录
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);//自己写个函数输出它的属性的