java数据库开发之JDBC基础使用方法及实例详解
1.什么是JDBC
JDBC是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
JDBC数据库访问规范
应用程序<->JDBC<->MySQL驱动<->MySQL
<->Oracle驱动<->Oracle
导入jar包
加载驱动Class.forName(‘类名')
给出url、username、password
使用DriverManager类得到Connection类
maven导入依赖
mysql mysql-connector-java 8.0.18
连接示例
importjava.sql.Connection;
importjava.sql.DriverManager;
classDemo{
//MySQL>=8.0配置参数
privatestaticfinalStringJDBC_DRIVER="com.mysql.cj.jdbc.Driver";
privatestaticfinalStringDB_URL="jdbc:mysql://localhost:3306/data";
privatestaticfinalStringUSER="root";
privatestaticfinalStringPASSWORD="123456";
publicstaticvoidmain(String[]args)throwsException{
//注册JDBC驱动
Class.forName(JDBC_DRIVER);
//等效于
//com.mysql.cj.jdbc.Driverdriver=newcom.mysql.cj.jdbc.Driver();
//DriverManager.registerDriver(driver);
//打开链接
Connectionconn=DriverManager.getConnection(DB_URL,USER,PASSWORD);
//关闭链接
conn.close();
}
}
所有的java.sql.Driver实现类,都提供了static代码块,
块内代码把自己注册到DriverManager中
jdbc4.0之后每个驱动jar包中,在META-INF/services目录下提供了一个java.sql.Driver文件
内容就是该接口的实现类名称
2.JDBC完成增、删、改、查
1、增、删、改
//发送DML,DDL intStatement.executeUpdate(Stringsql);
代码示例
//注册JDBC驱动
Class.forName(JDBC_DRIVER);
//打开链接
Connectionconn=DriverManager.getConnection(DB_URL,USER,PASSWORD);
Statementstatement=conn.createStatement();
//增删改
//Stringsql="insertintostudent(sname)values('陆小凤')";
//Stringsql="updatestudentsetsname='花无缺'wheresid=4";
Stringsql="deletefromstudentwheresid=4";
intret=statement.executeUpdate(sql);
System.out.println(ret);
//关闭链接
conn.close();
2、查询
ResultSetexecuteQuery(StringquerySql); booleanResultSet.next(); //获取列数据 ResultSet.getString() ResultSet.getObject() ResultSet.getInt() ResultSet.getDouble()
行光标
beforeFirst<-默认光标位置
first
last
AfterLast
//打开链接
Connectionconn=DriverManager.getConnection(DB_URL,USER,PASSWORD);
Statementstatement=conn.createStatement();
//查询
Stringsql="select*fromstudent";
ResultSetret=statement.executeQuery(sql);
while(ret.next()){
//通过列序号获取
intuid=ret.getInt(1);
//通过列名称获取
Stringname=ret.getString("sname");
System.out.println(uid+","+name);
}
//关闭资源
ret.close();
statement.close();
conn.close();
3.JDBC之代码规范化
//定义
try{
//实例化
}
finally{
//关闭资源
}
4.结果集光标与元数据
JBDC主要的类
DriverManager Connectionconn=DriverManager.getConnection(DB_URL,USER,PASSWORD); Statementstatement=conn.createStatement(); intexecuteUpdate(Stringsql)//执行增、删、改 ResultSetexecuteQuery(Stringsql)//执行查询 booleanexecute(Stringsql)//执行增、删、改、查
ResultSet滚动结果集
一个二维表格,内部维护了一个行光标(游标)
next()//最常用
beforeFirst()
afterLast()
first()
last()
getRow()
absolute()
relative()
isBeforeFirst()
isAfterLast()
isFirst()
isLast()
元数据
//元数据 ResultSetMetaDataResultSet.getMetaData() //获取结果集列数 intResultSetMetaData.getColumnCount() //获取指定列的列名 StringResultSetMetaData.getColumnName(intcolIndex)
5.结果集的特性(是否可滚动、是否敏感、是否可更新)
确定结果集特性
1、是否可滚动
2、是否敏感
3、是否可更新
//不滚动,不敏感,不可更新 StatementcreateStatement() //滚动支持 StatementcreateStatement(intresultSetType,intresultSetConcurrency) resultSetType: ResultSet.TYPE_FORWARD_ONLY//不滚动 ResultSet.TYPE_SCROLL_INSENSITIVE//滚动,不随数据库变化而变化 ResultSet.TYPE_SCROLL_SENSITIVE//滚动,不随数据库变化而变化 resultSetConcurrency//是否通过修改结果集二反向影响数据库 ResultSet.CONCUR_READ_ONLY//结果集只读 ResultSet.CONCUR_UPDATABLE//结果集可更新
6.PreparedStatement的用法
PreparedStatement是Statement子接口
1、防止SQL注入攻击
2、提高代码可读性,可维护性
3、提高效率
//打开链接
Connectionconn=DriverManager.getConnection(DB_URL,USER,PASSWORD);
//使用预处理查询,使用?占位
Stringsql="select*fromstudentwheresid=?";
PreparedStatementstatement=conn.prepareStatement(sql);
//为参数赋值
statement.setInt(1,1);
//获取数据
ResultSetret=statement.executeQuery();
while(ret.next()){
Stringname=ret.getString("sname");
System.out.println(name);
}
//关闭资源
ret.close();
statement.close();
conn.close();
7.预处理的原理
服务器工作:
(1)校验:sql语句的语法
(2)编译:为一个与函数相似的东西
(3)执行:调用函数
PreparedStatement
(1)先将sql发给数据库,数据库先进行校验
(2)执行的时候只发送参数
8.mysql的预编译功能默认是关闭的
preparemyfunfrom'select*fromstudentwheresid=?' set@uid=1 executemyfunusing@uid
设置连接参数:
useServerPrepStmts=true
cachePrepStmts=true
DB_URL="jdbc:mysql://localhost:3306/data?useServerPrepStmts=true&cachePrepStmts=true";
9.JdbcUtils1.0小工具
JdbcUtils.java
packageutil;
importjava.io.IOException;
importjava.io.InputStream;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.SQLException;
importjava.util.Properties;
publicclassJdbcUtils{
//配置文件路径
privatestaticStringdbconfig="dbconfig.properties";
privatestaticPropertiesprop=null;
//静态代码块只执行一次
static{
//初始化数据库配置参数
try{
InputStreamin=JdbcUtils.class.getClassLoader().getResourceAsStream(dbconfig);
prop=newProperties();
prop.load(in);
}catch(IOExceptione){
thrownewRuntimeException(e);
}
//加载驱动
try{
Class.forName(prop.getProperty("driver"));
}catch(ClassNotFoundExceptione){
thrownewRuntimeException(e);
}
}
publicstaticConnectiongetConnection()throwsSQLException{
returnDriverManager.getConnection(
prop.getProperty("url"),
prop.getProperty("username"),
prop.getProperty("password")
);
}
publicstaticvoidmain(String[]args)throwsSQLException{
Connectionconn=getConnection();
System.out.println(conn);
}
}
dbconfig.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/data
username=root
password=123456
10.面向接口编程
DAO模式
dataaccessobject
写一个类,把访问数据库的代码封装起来
DAO在数据库与业务逻辑(service)之间
实体域,即操作的对象
DAO模式步骤
(1)提供一个DAO接口
(2)提供一个DAO接口的实现类
(3)在编写一个DAO工厂,Service通过工厂来获取DAO实现
daoconfig.properties
UserDaoClassName=UserDaoImpl
UserDao.java
publicinterfaceUserDao{
}
UserDaoImpl.java
publicclassUserDaoImplimplementsUserDao{
}
DaoFactory.java
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.Properties;
publicclassDaoFactory{
//配置文件路径
privatestaticStringdbconfig="daoconfig.properties";
privatestaticPropertiesprop=null;
//静态代码块只执行一次
static{
//初始化数据库配置参数
try{
InputStreamin=DaoFactory.class.getClassLoader().getResourceAsStream(dbconfig);
prop=newProperties();
prop.load(in);
}catch(IOExceptione){
thrownewRuntimeException(e);
}
}
/**
*返回一个UserDao的具体实现类
*/
publicstaticUserDaogetUserDao(){
StringdaoClassName=prop.getProperty("UserDaoClassName");
//通过反射创建实现类的对象
try{
ClassClazz=Class.forName(daoClassName);
return(UserDao)Clazz.newInstance();
}catch(Exceptione){
thrownewRuntimeException(e);
}
}
}
11.修改案例,其中dao层为jdbc
User.java
publicclassUser{
privateStringusername;
privateintage;
publicStringgetUsername(){
returnusername;
}
publicintgetAge(){
returnage;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicvoidsetAge(intage){
this.age=age;
}
@Override
publicStringtoString(){
return"User{"+
"username='"+username+'\''+
",age="+age+
'}';
}
}
daoconfig.properties
UserDaoClassName=UserDaoImpl
UserDao.java
publicinterfaceUserDao{
publicvoidaddUser(Useruser);
publicUsergetUserByUsername(Stringusername);
}
UserDaoImpl.java
importutil.JdbcUtils;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.sql.SQLException;
/**
*createtableuser(
*idintprimarykeyauto_increment,
*usernamevarchar(50),
*ageint
*)
*/
publicclassUserDaoImplimplementsUserDao{
/**
*ORM对象关系映射
*@paramuser
*/
@Override
publicvoidaddUser(Useruser){
Connectionconn=null;
PreparedStatementstatement=null;
try{
//得到连接
conn=JdbcUtils.getConnection();
Stringsql="insertintouser(username,age)values(?,?)";
//准备模板
statement=conn.prepareStatement(sql);
//赋值
statement.setString(1,user.getUsername());
statement.setInt(2,user.getAge());
//执行
statement.executeUpdate();
}catch(Exceptione){
thrownewRuntimeException(e);
}finally{
try{
if(statement!=null){
statement.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLExceptione){
}
}
}
@Override
publicUsergetUserByUsername(Stringusername){
Connectionconn=null;
PreparedStatementstatement=null;
try{
//得到连接
conn=JdbcUtils.getConnection();
Stringsql="select*fromuserwhereusername=?limit1";
//准备模板
statement=conn.prepareStatement(sql);
//赋值
statement.setString(1,username);
//执行
ResultSetresultSet=statement.executeQuery();
if(resultSet.next()){
Useruser=newUser();
user.setUsername(resultSet.getString("username"));
user.setAge(resultSet.getInt("age"));
returnuser;
}
else{
returnnull;
}
}catch(Exceptione){
thrownewRuntimeException(e);
}finally{
try{
if(statement!=null){
statement.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLExceptione){
}
}
}
}
DaoFactory.java
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.Properties;
publicclassDaoFactory{
//配置文件路径
privatestaticStringdbconfig="daoconfig.properties";
privatestaticPropertiesprop=null;
//静态代码块只执行一次
static{
//初始化数据库配置参数
try{
InputStreamin=DaoFactory.class.getClassLoader().getResourceAsStream(dbconfig);
prop=newProperties();
prop.load(in);
}catch(IOExceptione){
thrownewRuntimeException(e);
}
}
/**
*返回一个UserDao的具体实现类
*/
publicstaticUserDaogetUserDao(){
StringdaoClassName=prop.getProperty("UserDaoClassName");
//通过反射创建实现类的对象
try{
ClassClazz=Class.forName(daoClassName);
return(UserDao)Clazz.newInstance();
}catch(Exceptione){
thrownewRuntimeException(e);
}
}
}
Service.java
//添加测试
UserDaouserDao=DaoFactory.getUserDao();
Useruser=newUser();
user.setUsername("小明");
user.setAge(23);
userDao.addUser(user);
//查询测试
Useruser1=userDao.getUserByUsername("小明");
System.out.println(user1);
12.util包下的Date与sql包下的时间类型之间的转换
Data->java.sql.Data
Time->java.sql.Time
Timestamp->java.sql.Timestamp
领域对象中所有属性不能出现java.sql包内容
继承关系
java.util.Date
-java.sql.Date
父类转子类:util.Data->sql.Date、Time、Timestamp
java.util.DateUtilDate=newjava.util.Date(); longlongDate=UtilDate.getTime(); java.sql.DatesqlData=newjava.sql.Date(longDate);
子类转父类:sql.Date、Time、Timestamp->util.Data
java.util.DateUtilDate=newjava.sql.Date(System.currentTimeMillis());
13.大数据
可以将文件存入MySQL
my.ini配置
max_allowed_packet=10485760
14.批处理
批处理只针对更新(增,删,改)
一次向服务器发送多条sql语句
开启批处理参数
rewriteBatchedStatements=true
dbconfig.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/data?rewriteBatchedStatements=true
username=root
password=123456
importutil.JdbcUtils;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.SQLException;
classDemo{
publicstaticvoidmain(String[]args)throwsSQLException{
Connectionconn=JdbcUtils.getConnection();
Stringsql="insertintouser(username)values(?)";
PreparedStatementstatement=conn.prepareStatement(sql);
for(inti=0;i<10000;i++){
statement.setString(1,"name"+i);
statement.addBatch();//装箱
}
longstart=System.currentTimeMillis();
statement.executeBatch();//提交数据
longend=System.currentTimeMillis();
System.out.println(end-start);//107
}
}
结束语
本文主要讲了java数据库开发中JDBC基础使用方法及实例
更多关于java数据库开发之JDBC基础使用方法及实例请查看下面的相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。