JDBC连接数据库
操作步骤:
准备jar包mysql-connector-java-5.1.0-bin.jar
- 加载驱动Class.forName(“com.mysql.jdbc.Driver”);
- 使用DriverManager获取数据库connection连接
- 创建Statement对象 用于执行SQL语句
- 执行SQL语句
- 释放资源
1.jdbc连接数据库步骤
实现jdbc连接mysql,查询输出learn库下department的数据
Connection conn=null;
Statement stat=null;
ResultSet rs = null;
try {
// 加载 驱动(方言)
Class.forName("com.mysql.jdbc.Driver");
// 数据库端口号默认为3306可以在数据库名后加~保证编码格式和时区
// ?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
String url="jdbc:mysql://127.0.0.1:3306/learn?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull";
String uname="root";
String upwd="bai123456";
// 根据路径,用户名,密码获取connection连接
conn=DriverManager.getConnection(url,uname,upwd);
// 创建statement对象执行sql语句
String sql="select * from department";
stat = conn.createStatement();
// executQuery返回一个set结果集,execute返回一个bool,执行成功返回false,失败返回true,executUpdate返回一个int,受影响行数
rs = stat.executeQuery(sql);
while(rs.next()) {
System.out.println("部门id:\t"+rs.getLong(1));
System.out.println("部门名称:\t"+rs.getString("dName"));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
2.PreparedStatement避免sql注入
使用PreparedStatement可以避免sql注入。(使用占位符?代替字符串拼接)字符串拼接可以利用sql注释来避免输入密码,安全系数很低。
public static void main(String[] args) {
Connection conn=null;
PreparedStatement ps=null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://127.0.0.1:3306/learn?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull";
String uname="root";
String upwd="bai123456";
conn=DriverManager.getConnection(url,uname,upwd);
// ?为占位符,先对sql进行预编译,再对占位符注入值
String sql="select * from department where did=? AND dName=?";
ps=conn.prepareStatement(sql);
// 第一个参数为位置,从1开始,第二个为注入值
ps.setLong(1,2);
ps.setString(2, "研发部");
ResultSet rs = ps.executeQuery();
while(rs.next()) {
System.out.println("部门id:\t"+rs.getLong("did"));
System.out.println("部门名称:\t"+rs.getString("dName"));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
封装JDBC
为什么封装jdbc?
普通的jdbc连接可读性差,不利于代码后期修改,复用性差,所以我们尝试_将数据库连接打开关闭封装成一个工具类,定义实体类传输数据,数据的增删改查定义为接口_来优化数据库连接。
什么是Dao层?
DAO(Date Access Object)起着转换器的作用,将数据在实体类和数据库记录之间进行转换,实现对持久化数据的访问。DAO层包含entiy包(实体类user),Dao接口(userDao),Dao实现类(userDaoImpl),工具类(负责数据库连接打开关闭)。
![image.png](https://img-blog.csdnimg.cn/img_convert/736512185d9a91c476aa4a0fc160065a.png#clientId=u4d911c19-0c68-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=163&id=u3c3f97cc&margin=[object Object]&name=image.png&originHeight=254&originWidth=1139&originalType=binary&ratio=1&rotation=0&showTitle=false&size=49414&status=done&style=none&taskId=u42f2d231-de79-4c21-996b-233446c3474&title=&width=728.96)
封装Jdbc
将开启数据库连接封装为方法getConn()
,查询数据库为方法executQuery(String sql,Object objs[]),
查询数据库信息方法exectueSql(String sql,Object objs[])
,关闭数据库连接closeResourse()
package dao.pojo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class BaseDao {
Connection conn=null;
PreparedStatement ps=null;
/**
* 开启jdbc连接
* @return 成功返回true,失败返回false
*/
public boolean getConn() {
boolean bool=false;
try {
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://127.0.0.1:3306/learn?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull";
String username="root";
String userpwd="bai123456";
conn=DriverManager.getConnection(url,username,userpwd);
bool=true;
} catch (Exception e) {
bool=false; //未正常启动连接
e.printStackTrace();
}
return bool;
}
/**
* 将对象的值注入到数据库(增删改)
* @param sql语句string
* @param obj存储改变数据库的对象
* @return 返回受影响行数
*/
public int exectuQuery(String sql,Object objs[]) {
int res=0; //0行为操作失败
if(getConn()) {
try {
ps=conn.prepareStatement(sql);
if(objs!=null) {
for(int i=0;i<objs.length;i++) {
ps.setObject(i+1,objs[i]);
}
}
res=ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
return res;
}
/**
* 查询数据库内容
* @param sql
* @param objs
* @return 查询结果(以集合set返回)
*/
public ResultSet exectueSql(String sql,Object objs[]) {
ResultSet rs=null;
if(getConn()) {
try {
if(objs!=null) {
for(int i=0;i<objs.length;i++) {
ps.setObject(i+1, objs[i]);
}
}
rs=ps.executeQuery();
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return rs;
}
/**
* 关闭资源
*/
public void closeResourse() {
try {
if(ps!=null) {
ps.close();
}
if(conn!=null) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}