1. 导入数据库对应jdbc驱动
去Oracle官网下载数据库连接驱动,下载地址:https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html
大家根据java版本选择对应的版本驱动。
或者在Oracle安装目录下自带有个jdbc文件夹,点进lib,里面有各版本的jdbc包
2. 导入JAR包
打开项目结构
点击模块,选择依赖,点+导入Jar包后应用
在外部库能检索到jar包说明导入成功
测试能否连接数据库
3.JDBC介绍
3.1 常用接口
1)Driver 接口
Driver 接口由数据库厂家提供,只需要使用 Driver 接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。如:
装载 MySql 驱动:Class.forName("com.mysql.jdbc.Driver");
装载 Oracle 驱动:Class.forName("oracle.jdbc.driver.OracleDriver");
2)Connection 接口
Connection 与特定数据库的连接(会话),在连接上下文中执行 sql 语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在 JDBC URL 中定义的数据库 Connection 连接上。
连接 MySql 数据库:
Connection conn =DriverManager.getConnection("jdbc:mysql://host:port/database","user","password");
连接 Oracle 数据库:
Connection conn =DriverManager.getConnection("jdbc:oracle:thin:@host:port:database","user","password");
连接 SqlServer 数据库:
Connection conn =DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port;DatabaseName=database", "user", "password");
常用方法:
• createStatement():创建向数据库发送 sql 的 statement 对象。
• prepareStatement(sql) :创建向数据库发送预编译 sql 的 PrepareSatement 对象。
• prepareCall(sql):创建执行存储过程的 callableStatement 对象。
• setAutoCommit(boolean autoCommit):设置事务是否自动提交。
注意:
prepareStatement会先初始化SQL,先把这个SQL提交到数据库中进行预处理,多次使用可提高效率。
createStatement不会初始化,没有预处理,每次都是从0开始执行SQL。
prepareStatement支持批量处理,createStatement只执行一次。
PreparedStatement 有效的防止 sql 注入(SQL 语句在程序运行前已经进行了预编译, 当运行时动态地把参数传给 PreprareStatement 时,即使参数里有敏感字符如 or '1=1’也数据库会作为一个参数一个字段的属性值来处理而不会作为一个 SQL 指令
3)Statement 接口
用于执行静态 SQL 语句并返回它所生成结果的对象。
两种 Statement 类:
• Statement:由 createStatement 创建,用于发送简单的 SQL 语句(不带参数)。
• PreparedStatement :继承自 Statement 接口,由 preparedStatement 创建,用于发送含有一个或多个参数的 SQL 语句。PreparedStatement 对象比Statement 对象的效率更高,并且可以防止 SQL 注入,所以我们一般都使用PreparedStatement。
常用 Statement 方法:
• execute(String sql):运行语句,返回是否有结果集
• executeQuery(String sql):运行 select 语句,返回 ResultSet 结果集。
• executeUpdate(String sql):运行 insert/update/delete 操作,返回更新的行数。
• addBatch(String sql) :把多条 sql 语句放到一个批处理中。
• executeBatch():向数据库发送一批 sql 语句执行。
4)ResultSet 接口
ResultSet 提供检索不同类型字段的方法,常用的有:
• getString(int index)、getString(String columnName):获得在数据库里是varchar、char 等类型的数据对象。
• getFloat(int index)、getFloat(String columnName):获得在数据库里是 Float类型的数据对象。
• getDate(int index)、getDate(String columnName):获得在数据库里是 Date 类型的数据。
• getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean 类型的数据。
• getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。
ResultSet 还提供了对结果集进行滚动的方法:
• next():移动到下一行
• Previous():移动到前一行
• absolute(int row):移动到指定行
• beforeFirst():移动 resultSet 的最前面。
• afterLast() :移动到 resultSet 的最后面。
使用后依次关闭对象及连接:ResultSet → Statement → Connection
4. 编写代码连接Oracle数据库
创建文件夹用作数据访问层Dao,可在BaseDao实现初始化数据库连接和连接关闭的操作
JDBC使用步骤:
加载 JDBC 驱动程序 → 建立数据库连接 Connection → 创建执行 SQL 的语句
Statement → 处理执行结果 ResultSet → 释放资源
packagecn.test_oracle.dao;/*基本数据访问类(获取数据库连接)*/importorg.junit.platform.commons.function.Try;importjava.sql.*;publicclassBaseDao{static{//加载驱动try{Class.forName("oracle.jdbc.driver.OracleDriver");}catch(ClassNotFoundException e){thrownewRuntimeException(e);}}//获取数据库连接publicstaticConnectiongetConnection()throwsSQLException{Connection conn =null;try{
conn =DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","system","123456");}catch(SQLException e){thrownewRuntimeException(e);}if(conn !=null){System.out.println("连接成功");}else{System.out.println("连接失败");}return conn;}publicstaticvoidCloseAll(Connection conn,Statement stmt,ResultSet rs){try{if(rs !=null){
rs.close();}}catch(SQLException e){
e.printStackTrace();}try{if(stmt !=null){
stmt.close();}}catch(SQLException e){
e.printStackTrace();}try{if(conn !=null){
conn.close();}}catch(SQLException e){
e.printStackTrace();}}}
数据库表字段类型设计如下
创建实体类,并实现get,set方法
packagecn.test_oracle.entity;importjava.util.Date;//用户表publicclassOwners{privateLong userId;//用户idprivateString userName;privateString userPwd;privateLong age;privateString gender;privateString email;privateDate regTime;publicLonggetUserId(){return userId;}publicvoidsetUserId(Long userId){this.userId = userId;}publicStringgetUserName(){return userName;}publicvoidsetUserName(String userName){this.userName = userName;}publicStringgetUserPwd(){return userPwd;}publicvoidsetUserPwd(String userPwd){this.userPwd = userPwd;}publicLonggetAge(){return age;}publicvoidsetAge(Long age){this.age = age;}publicStringgetGender(){return gender;}publicvoidsetGender(String gender){this.gender = gender;}publicStringgetEmail(){return email;}publicvoidsetEmail(String email){this.email = email;}publicDategetRegTime(){return regTime;}publicvoidsetRegTime(Date regTime){this.regTime = regTime;}}
在OwnersDao实现对数据库的增删改查操作
增加用户代码如下
//增加用户publicstaticvoidAdd(Owners owners){Connection conn =null;//创建执行对象PreparedStatement stmt =null;try{
conn =BaseDao.getConnection();//SQL语句
stmt = conn.prepareStatement("insert into PJ.tb_user values (?,?,?,?,?,?,?)");//设置占位符
stmt.setLong(1, owners.getUserId());
stmt.setString(2, owners.getUserName());
stmt.setString(3, owners.getUserPwd());
stmt.setLong(4, owners.getAge());
stmt.setString(5, owners.getGender());
stmt.setString(6, owners.getEmail());//这里需求的是sql.date,但java提供的是util.date,可以通过java的getTime方法将util.date变成long型,再转换成Date型
stmt.setDate(7,newDate(owners.getRegTime().getTime()));
stmt.execute();}catch(SQLException e){thrownewRuntimeException(e);}finally{BaseDao.CloseAll(conn, stmt,null);}}
修改用户代码如下
//修改用户publicstaticvoidUpdate(Owners owners){Connection conn =null;//创建执行对象PreparedStatement stmt =null;try{
conn =BaseDao.getConnection();//SQL语句
stmt = conn.prepareStatement("update PJ.tb_user set username=?, userpwd=?, "+"age = ?, gender = ?, email = ?, regtime = ? where userid = ?");//设置占位符
stmt.setString(1, owners.getUserName());
stmt.setString(2, owners.getUserPwd());
stmt.setLong(3, owners.getAge());
stmt.setString(4, owners.getGender());
stmt.setString(5, owners.getEmail());//这里需求的是sql.date,但java提供的是util.date,可以通过java的getTime方法将util.date变成long型,再转换成Date型
stmt.setDate(6,newDate(owners.getRegTime().getTime()));
stmt.setLong(7, owners.getUserId());
stmt.execute();}catch(SQLException e){thrownewRuntimeException(e);}finally{BaseDao.CloseAll(conn, stmt,null);}}
删除用户代码如下
//删除用户publicstaticvoidDelete(Long id){Connection conn =null;//创建执行对象PreparedStatement stmt =null;try{
conn =BaseDao.getConnection();//SQL语句
stmt = conn.prepareStatement("delete from PJ.tb_user where userid = ?");//设置占位符
stmt.setLong(1, id);
stmt.execute();}catch(SQLException e){thrownewRuntimeException(e);}finally{BaseDao.CloseAll(conn, stmt,null);}}
查询代码如下
//查询用户publicstaticArrayList<Owners>Query(Long id){ArrayList<Owners> list =newArrayList<>();Connection conn =null;//创建执行对象PreparedStatement stmt =null;ResultSet rs =null;try{
conn =BaseDao.getConnection();//SQL语句
stmt = conn.prepareStatement("select * FROM PJ.tb_user where userid = ?");//设置占位符
stmt.setLong(1, id);//处理执行结果
rs = stmt.executeQuery();while(rs.next()){Owners s =newOwners();
s.setUserId(rs.getLong("userid"));
s.setUserName(rs.getString("username"));
s.setUserPwd(rs.getString("userpwd"));
s.setAge(rs.getLong("age"));
s.setGender(rs.getString("gender"));
s.setEmail(rs.getString("email"));
s.setRegTime(rs.getDate("regtime"));
list.add(s);}return list;}catch(SQLException e){thrownewRuntimeException(e);}finally{BaseDao.CloseAll(conn, stmt, rs);}}
看上述代码能否实现对数据库的交互,测试代码如下:
packagecn.test_oracle.test;importcn.test_oracle.dao.OwnersDao;importcn.test_oracle.entity.Owners;importjava.text.DateFormat;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;publicclass testdao {publicstaticvoidmain(String[] args)throwsParseException{Owners owners =newOwners();
owners.setUserId(2L);
owners.setUserName("clearlove7");
owners.setUserPwd("123456");
owners.setAge(39L);
owners.setGender("男");
owners.setEmail("[email protected]");//将String转换成Date两者处理方式,方式1/* DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
Date date = fmt.parse("2021-01-30");*///将String转换为Date,方式2Date date =java.sql.Date.valueOf("2023-02-12");
owners.setRegTime(date);OwnersDao.Add(owners);//增加用户OwnersDao.Update(owners);//修改用户信息OwnersDao.Delete(2L);//删除用户信息ArrayList<Owners> a =OwnersDao.Query(1L);//查询用户信息for(int i =0; i < a.size(); i++){Owners owner1 = a.get(i);System.out.println(owner1.getUserId());System.out.println(owner1.getUserName());System.out.println(owner1.getUserPwd());System.out.println(owner1.getGender());System.out.println(owner1.getAge());System.out.println(owner1.getEmail());System.out.println(owner1.getRegTime());}}}
结果如下,用户2成功添加进数据库。
查询结果:
版权归原作者 嗨皮~ 所有, 如有侵权,请联系我们删除。