java_第一年_JDBC(6)
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)的更多相关文章
- java_第一年_JDBC(7)
Commons-dbutils是一个开源的JDBC工具类库,对JDBC进行封装,简化编码的工作量,包含的API: org.apache.commons.dbutils.QueryRunner org. ...
- java_第一年_JDBC(2)
上篇说到,通过JDBC可实现java编程程序和mysql数据库进行连接并交互,而交互后所形成的结果集是通过ResultSet对象来操作的. 创建ResultSet对象: stmt = conn.cre ...
- java_第一年_JDBC(1)
JDBC(Java Data Base Connectivity),用于实现java语言编程与数据库连接的API. 数据库驱动:应用程序并不能直接使用数据库,而需要通过相应的数据库驱动程序后再操作数据 ...
- java_第一年_JDBC(5)
事务概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功: 开始事务:start transaction 提交事务:commit 回滚事务:rollback 事务的四大特 ...
- java_第一年_JDBC(4)
注:该篇只是为了小白的我熟悉下JDBC的代码,练习篇 在mysql中建test测试库,并创建一张employees表,加入一些数据如下图: 通过JDBC连接对表中数据进行添加: package lzj ...
- java_第一年_JDBC(3)
事务 我们在通过JDBC连接数据库并开始交互时,默认情况下是自动提交的,有时由于为了保持业务流程的完整性.提高性能或是使用分布式事务,需要启动支持事务,此时的方法是调用Connection对象的set ...
- java_第一年_JavaWeb(14)
EL :EL表达式主要用于获取数据.执行运算.获取对象.调用java方法: 获取数据 语法:"${标识符}" 会调用pageContext.findAttribute方法,从pag ...
- java_第一年_JavaWeb(13)
JSTL标签库——核心标签库 为了弥补html标签的不足,为了更加方便地在jsp页面中使用java逻辑代码,JSTL标签库因运而生,而其中的佼佼者,被恩宠最多的就是核心标签库了: 核心标签库从功能上可 ...
- java_第一年_JavaWeb(11)
自定义标签:主要是用来移除JSP页面中的java代码. 先从一个简单的案例了解其怎么移除代码: 一个正常的jsp页面: <%@ page language="java" pa ...
随机推荐
- 两个jquery编写插件实例
(1) 封装基于jq弹窗插件 相信码友们对于$.fn.extexd();$.extend()以及$.fn.custom和$.custom都有一定的了解:我阐述一下我自己对于$.fn.custom和 ...
- CentOS搭建NodeJs服务器—Mongodb安装
1.下载Mongodb 直接下载(下载很慢) cd /mongdb wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon- ...
- JSON提取器
如果返回的数据是JSON格式的,我们可以用JSON提取器来提取需要的字段,这样更简单一点 Variable names:保存的变量名,后面使用${Variable names}引用 JSON Path ...
- 8:Spring Boot中thymeleaf模板中使用 Shiro标签
1,添加 pom.xml grade: compile('com.github.theborakompanioni:thymeleaf-extras-shiro:1.2.1') 2, Subject ...
- asp.net能否上传文件夹下所有文件
HTML部分 <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="index.aspx. ...
- 【bzoj3038】上帝造题的七分钟2
*题目描述: XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. “第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段数中每个数都开平 ...
- 基于BootStrap的分页代码实现
public class PageUtil { //targetUrl 访问url totalNum总记录数 currentPage 当前页数 pageSize每页的大小 public static ...
- C++ Boost库的编译及使用
https://www.jianshu.com/p/de1fda741beb https://www.cnblogs.com/weizhixiang/p/5804778.html Windows编译 ...
- 学习C#20天有感
自学C#有20多天了,期间出差去深圳一周,每天平均学习4小时左右,看书+视频,之前有点C语言基础(仅限于基础哈哈),计划30内把C#的基本语法和SQL的基本语法熟悉,把面向对象相对深入的理解一些,然后 ...
- linux让命令或程序在终端后台运行的方法(Ubuntu/Fedora/Centos等一样适用)
https://segmentfault.com/a/1190000008314935