当当当当~~~~欢迎大家阅读,今天我们学习JDBC程序编写步骤
以上是JDBC程序编写步骤的流程图
步骤一:导入java.sql包
步骤二:加载并注册驱动程序
java.sql.Driver 接口:是所有 JDBC 驱动程序需要实现的接口,这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现,例如:
mySql的驱动: com.mysql.jdbc.Driver
Oracle的驱动:oracle.jdbc.driver.OracleDriver
接下来我们将以Mysql为例进行操作:将数据库连接需要的4个基本信息申明在配置文件中
(一)创建配置文件【jdbc.properties】此配置文件声明在工程的src下
user=root
password=****
url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true
driverClass=com.mysql.jdbc.Driver
(二)获取数据库连接的四要素
要素一:用户名: user可以用“属性名=属性值”方式告诉数据库
要素二:密码: password可以用“属性名=属性值”方式告诉数据库
要素三:URL:用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接
要素四:Driver接口实现类:java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现
(三)使用配置文件的好处
1、实现了代码和数据的分离,如果需要修改配置信息,直接在配置文件中修改
2、如果修改了配置信息,省去重新编译的过程。
步骤三:创建Connection对象,连接数据库
@Test
public void testConnection() throws Exception{
//1、读取配置文件中的4个基本信息
InputStream is = ConnectionTest1.class.getClassLoader().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);
System.out.println(conn);
}
步骤四:创建Statement的子接口PreparedStatement对象
(一)PreparedStatement VS Statement
1、使用Statement操作数据表的弊端
问题一:存在拼串操作,繁琐
问题二:存在SQL注入问题
2、PreparedStatement的介绍
与Statement的关系:是 Statement 的子接口
特点:可以预编译sql语句
用途:可以解决Statement的sql注入问题,拼串问题
3、使用PreparedStatement的好处
(1)避免Statement的拼串操作繁琐
(2)PreparedStatement 可以防止 SQL 注入问题
(3)PreparedStatement操作Blob的数据,而Statement做不到
(4)PreparedStatement 可以实现更高效的批量操作
(二)使用PreparedStatement实现通用的增、删、改的方法
代码:
//通用的增删改操作
public void update(String sql,Object ...args){//sql中占位符的个数与可变形参的长度相同!
Connection conn = null;
PreparedStatement ps = null;
try {
//1.获取数据库的连接
conn = JDBCUtils.getConnection();
//2.预编译sql语句,返回PreparedStatement的实例
ps = conn.prepareStatement(sql);
//3.填充占位符
for(int i = 0;i < args.length;i++){
ps.setObject(i + 1, args[i]);//小心参数声明错误!!
}
//4.执行
ps.execute();
} catch (Exception e) {
e.printStackTrace();
}finally{
//5.资源的关闭
JDBCUtils.closeResource(conn, ps);
}
}
案例:
@Test
public void testCommonUpdate(){
String sql="delete from account where id=?";
update(sql,7);
}
(三)使用PreparedStatement实现通用的查询操作
以上是查询操作的流程图
1、返回表中的一条元素
代码:
public <T> T getInstance(Class<T> clazz,String sql, Object... args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
// 获取结果集的元数据 :ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();
// 通过ResultSetMetaData获取结果集中的列数
int columnCount = rsmd.getColumnCount();
if (rs.next()) {
T t = clazz.newInstance();
// 处理结果集一行数据中的每一个列
for (int i = 0; i < columnCount; i++) {
// 获取列值
Object columValue = rs.getObject(i + 1);
// 获取每个列的列名
// String columnName = rsmd.getColumnName(i + 1);
String columnLabel = rsmd.getColumnLabel(i + 1);
// 给t对象指定的columnName属性,赋值为columValue:通过反射
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columValue);
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn, ps, rs);
}
return null;
}
案例:
@Test
public void testGetInstance(){
String sql="select id,username,balance from account where id=?";
Account account = getInstance(Account.class, sql, 3);
System.out.println(account);
}
2、返回表中的多条元素
代码:
public <T> List<T> getForList(Class<T> clazz,String sql, Object... args){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
// 获取结果集的元数据 :ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();
// 通过ResultSetMetaData获取结果集中的列数
int columnCount = rsmd.getColumnCount();
//创建集合对象
ArrayList<T> list = new ArrayList<T>();
while (rs.next()) {
T t = clazz.newInstance();
// 处理结果集一行数据中的每一个列:给t对象指定的属性赋值
for (int i = 0; i < columnCount; i++) {
// 获取列值
Object columValue = rs.getObject(i + 1);
// 获取每个列的列名
// String columnName = rsmd.getColumnName(i + 1);
String columnLabel = rsmd.getColumnLabel(i + 1);
// 给t对象指定的columnName属性,赋值为columValue:通过反射
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columValue);
}
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn, ps, rs);
}
return null;
}
案例:
@Test
public void testGetForList(){
String sql="select id,username,balance from account where id<?";
List<Account>list=getForList(Account.class, sql, 3);
list.forEach(System.out::println);
}
步骤五:关闭资源
数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。
//关闭资源的操作
public static void closeResource2 (Connection conn, Statement ps,ResultSet rs){
try {
if(ps!=null)
ps.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
if(conn!=null)
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
if(rs!=null)
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
JDBC API小结
(一)两种思想
1、面向接口编程的思想
JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可。
不同的数据库厂商,需要针对这套接口,提供不同实现。不同的实现的集合,即为不同数据库的驱动
2、ORM思想(object relational mapping)
(1)一个数据表对应一个java类
(2)表中的一条记录对应java类的一个对象
(3)表中的一个字段对应java类的一个属性
(二)两种技术
1、使用结果集的元数据:ResultSetMetaData
getColumnCount():获取列数
getColumnLabel():获取列的别名
2、反射的使用
(1)创建对应的运行时类的对象
(2)运行时,动态的调用指定的运行时类的属性、方法
以上就是JDBC程序编写步骤啦,希望我的文章对你有所帮助,如果有错误的地方还望大家批评指正,谢谢大家阅读!