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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。