DataBaseMetaData对象:由Connection.getDataBaseMetaData()方法获得,可以用来获取数据库的元数据,提供的方法有:

  • getURL():返回一个String类,代表数据库的URL,例:jdbc:mysql://localhost:3306/dataname;
  • getUserName:返回连接数据库管理系统的用户名,例:root@localhost;
  • getDatabaseProductName():返回数据库的产品名,例:MYSQL
  • getDatabaseProductVersion():返回数据库的版本号,例:5.1.44-community;
  • getDriverName():返回驱动程序名;例:MySQL-AB JDBC Driver;
  • getDriverVersion():返回驱动程序的版本号;例:mysql-connector-java-5.0.8;
  • isReadOnly():返回布尔值,表示是否只允许读;

ParametrMetaData对象:由PrepareStatement.getParameterMetaData()方法获得,可以用来获取PreparedStatement对象的元数据,常用的方法有:

  • getParameterCount():获得指定参数的个数;
  • getParameterType(int):获取指定参数的sql类型;
String sql = "select * from user where name = ? and password = ?";
PreparedStatement st = conn.PrepareStatement(sql);
ParameterMetaData pm = st.getParameterMetaData();
pm.getParameterCount();
pm.getParameterType();

ResultSetMetaData对象:由ResultSet.getMetaData()方法获得,用来获取ResultSet对象的元数据,常用的方法:

  • getColumnCount():返回resultset对象的列数;
  • getColumnName(int column):获得指定的列名;
  • getColumnTypeName(int column):获得指定列的类型;

开发一个jdbcUtils工具类:

package lzj.learn;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties; public class JdbcUtils{
private static String driver = null;
private static String url = null;
private staric String username = null;
private static String password = null;
//读取db.properties文件,对参数都赋予值;
static{
try{
InputStream in = Jdbc.Utils.class.getClassLoader().getResourseAsStream("db.properties");
Porperties prop = new Properties();
prop.load(in);
driver = prop.getProperty("driver");
url = prop.getProperty("url");
username = prop.getProperty("username");
password = prop.getProperty("password");
Class.forName(driver);
}catch(Exception e) {
throw new ExceptionInInitializeError(e);
}
}
//连接数据库,获取连接对象
public static Connection getConnection() throws SQLException{
return DriverManafer.getConnection(url,username,password);
}
//释放资源
public static void release(Connection conn,Statement st,ResultSet rs) {
if(rs!=null){
try{
rs.close();
}catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if(st!=null){
try{
st.close();
}catch (Exception e){
e.printStackTrace();
}
}
if(conn!=null){
try{
conn.close();
}catch{
e.printStackTrace();
}
}
}
//更新数据库;sql参数:要执行的SQL语句;params[]:执行时使用的参数
public static void update (String sql , Object params[]) throws SQLException{
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try{
conn = getConnection();
st = conn.prepareStatement(sql);
for(int = ;i<params.length;i++){
st.setObject(i+,params[i]);
}
st.executeUpdate();
}finally{
release(conn,st,rs);
}
}
//查询数据库,与更新数据库不同的是,查询数据库多提供了一个处理结果集的处理器
public static Object query(String sql ,Object params[],ResultSetHandler rsh) throws SQLException{
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try{
conn = getConnection();
st = conn.prepareStatement(sql);
for(int i = ;i<params.length;i++){
st.setObject(i+,params[i]);
}
rs = st.executeQuery();
return rsh.handler(rs);//将查询的结果集交给ResultSetHandler类,再通过定义ResultSetHandler类,实现handler方法即可实现对结果集的操作;
}finally{
release(conn,st,rs);
}
}
}

对处理器接口ResultSetHandler定义可如下:

package lzj.learn;
import java.sql.ResultSet;
//结果集处理接口
public interface ResultSetHandler{
public Object handler (ResultSet rs);//通过实现handler方法实现对结果集的操作
}

有了上述的框架后,就可以针对单个实体对象进行CRUD了;

packagec lzj.learn;

import java.sql.SQLException;
import java.util.List;
import me.gacl.domain.Account;
import me.gacl.util.BeanHandler;
import me.gacl.util.BeanListHandler;
import me.gacl.util.JdbcUtils; public class AccountDao { public void add(Account account) throws SQLException{
String sql = "insert into account(name,money) values(?,?)";
Object params[] = {account.getName(),account.getMoney()};
JdbcUtils.update(sql, params);
} public void delete(int id) throws SQLException{
String sql = "delete from account where id=?";
Object params[] = {id};
JdbcUtils.update(sql, params);
} public void update(Account account) throws SQLException{ String sql = "update account set name=?,money=? where id=?";
Object params[] = {account.getName(),account.getMoney(),account.getId()};
JdbcUtils.update(sql, params); } public Account find(int id) throws SQLException{
String sql = "select * from account where id=?";
Object params[] = {id};
return (Account) JdbcUtils.query(sql, params, new BeanHandler(Account.class));
} public List<Account> getAll() throws SQLException{
String sql = "select * from account";
Object params[] = {};
return (List<Account>) JdbcUtils.query(sql, params,new BeanListHandler(Account.class));
}
}

java_第一年_JDBC(6)的更多相关文章

  1. java_第一年_JDBC(7)

    Commons-dbutils是一个开源的JDBC工具类库,对JDBC进行封装,简化编码的工作量,包含的API: org.apache.commons.dbutils.QueryRunner org. ...

  2. java_第一年_JDBC(2)

    上篇说到,通过JDBC可实现java编程程序和mysql数据库进行连接并交互,而交互后所形成的结果集是通过ResultSet对象来操作的. 创建ResultSet对象: stmt = conn.cre ...

  3. java_第一年_JDBC(1)

    JDBC(Java Data Base Connectivity),用于实现java语言编程与数据库连接的API. 数据库驱动:应用程序并不能直接使用数据库,而需要通过相应的数据库驱动程序后再操作数据 ...

  4. java_第一年_JDBC(5)

    事务概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功: 开始事务:start transaction 提交事务:commit 回滚事务:rollback 事务的四大特 ...

  5. java_第一年_JDBC(4)

    注:该篇只是为了小白的我熟悉下JDBC的代码,练习篇 在mysql中建test测试库,并创建一张employees表,加入一些数据如下图: 通过JDBC连接对表中数据进行添加: package lzj ...

  6. java_第一年_JDBC(3)

    事务 我们在通过JDBC连接数据库并开始交互时,默认情况下是自动提交的,有时由于为了保持业务流程的完整性.提高性能或是使用分布式事务,需要启动支持事务,此时的方法是调用Connection对象的set ...

  7. java_第一年_JavaWeb(14)

    EL :EL表达式主要用于获取数据.执行运算.获取对象.调用java方法: 获取数据 语法:"${标识符}" 会调用pageContext.findAttribute方法,从pag ...

  8. java_第一年_JavaWeb(13)

    JSTL标签库——核心标签库 为了弥补html标签的不足,为了更加方便地在jsp页面中使用java逻辑代码,JSTL标签库因运而生,而其中的佼佼者,被恩宠最多的就是核心标签库了: 核心标签库从功能上可 ...

  9. java_第一年_JavaWeb(11)

    自定义标签:主要是用来移除JSP页面中的java代码. 先从一个简单的案例了解其怎么移除代码: 一个正常的jsp页面: <%@ page language="java" pa ...

随机推荐

  1. XTemplate模板学习和使用总结

    XTemplate模板学习和使用总结 前言   XTemplate是我接触的第一个模板语言,用在公司的一个NodeJS项目中,跟它打交道经常是因为需要使用它的语法向模板中注入数据.因为是刚入门前端不久 ...

  2. java8 时间日期操作包总结

  3. LeetCode--006--Z 字形变换(python)

    将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: 之后,你的输出需要从左 ...

  4. php array_shift()函数 语法

    php array_shift()函数 语法 作用:删除数组中第一个元素,并返回被删除元素的值.富瑞联华 语法:array_shift(array) 参数: 参数 描述 array 必需.规定数组. ...

  5. Linux相关基础知识

    文件目录 /bin 放置系统执行档的目录,指令可被root与一般账户所使用. /boot 放置开机使用到的文档,包括linux核心档案,开机选单与所需设定档. /dev 任何装置与周边设备都是以档案的 ...

  6. uniapp 之navigateTo:fail page 跳转路径不对

    开发uniapp,点击列表跳转详情报错 [system] navigateTo:fail page `/pages/tabBar/index/detail/detail?title=uni-app行业 ...

  7. Model 层

    package com.test.mvp.mvpdemo.mvp.v1.model; import com.test.mvp.mvpdemo.mvp.v1.MainContract; import o ...

  8. Visual Studio2015 community 许可证到期问题

    申请微软账户直接登录可以继续使用.

  9. Ubuntu启动 卡在checking battery state 解决方案

    Ubuntu启动,卡在checking battery statALT + F1或者CTRL+ALT+F6切换到命令行[CTRL+ALT+F7返回界面]执行 sudo gdm start后就可以正常登 ...

  10. Scrapy爬虫框架下执行爬虫的方法

    在使用Scrapy框架进行爬虫时,执行爬虫文件的方法是 scrapy crawl xxx ,其中 xxx 是爬虫文件名. 但是,当我们在建立了多个文件时,使用上面的命令时会比较繁琐麻烦,我们就可以使用 ...