musql-connection下载:
需要对应mysql版本进行下载
可以在管理员模式下打开cmd输入select version() 查看版本信息
什么是JDBC?
JDBC(Java DataBase Connectivity)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询、更新(增删改)数据库中数据的方法。JDBC,是Sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可。不同的数据库厂商,需要针对这套接口,提供不同实现。不同的实现的集合,即为不同数据库的驱动。下图出自博客
二、JDBC操作1.创建java类
将之前下载的软件包解压后找到这个复制到lib包下
-
mysql中创建一个数据库
要对数据库进行处理,首先得创建一个数据库,在mysqlyog中直接创建一个命名为market的数据库
2.数据库的连接
public class Test {
public static void main(String[] args) {
// 获取mysql连接地址 market为要连接的数据库名
String strURL = "jdbc:mysql://localhost:3306/market?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8";
//(因为我的mysql字符编码不是utf8所以URL会有所区别)
//有的是 jdbc:mysql://localhost:3306/数据库名称?&useSSL=false&serverTimezone=UTC
// 用户名称
String username = "用户名";
// 用户密码
String password = "用户密码";
try {
Class.forName("com.mysql.jdbc.Driver");// mysql加载驱动
//mysql.5版本不用加cj; 若是mysql.8 就需要加ysql.cj.jbdc...
Connection con = DriverManager.getConnection(strURL, username, password);
System.out.println("数据库连接成功");
con.close();
System.out.println("数据库已关闭");
}catch (ClassNotFoundException | SQLException e){
e.printStackTrace();
}
}
}
补充查看字符编码命令:
修改字符编码命令:
set character_set_server=utf8;
MySQL数据库编码
3.创建对象对数据库进行处理
// 创建statement类对象,用来执行SQL语句! Statement stm = con.createStatement();
知识速递:
-
jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
-
增、删、改 用executeUpdate()返回值为int型,表示被影响的行数
-
查用executeQuery() 返回的是一个集合 .next()表示 指针先下一行,还有first()指向第一行 、last()指向最后一行、如果有数据就返回true
4.ResultSet是我们使用jdbc连接时,查询的一个返回结果集,ResultSet resultSet = stm.executeQuery(sql),
4.数据库的增加
//定义sql语句对数据库进行处理
String sql="INSERT INTO student VALUES(6,'七月六便士',53)";
//用executeUpdate()检查是否插入成功
int i= stm.executeUpdate();//返回值为被影响的行数
if(i !=1 ){
System.out.println("操作失败");
}else{
System.out.println("操作成功");
}
5.数据库的查询
-
查询所有元素
String sql="SELECT * FROM student";
// 通过SQL查询,把查询到的结果返回至Result的结果集
ResultSet rs = stm.executeQuery(sql);
while(rs.next()){
int id=rs.getInt("id");
String name=rs.getString("name");
System.out.println("id:"+id+" name:"+name);
}
查询指定元素信息
String sql="SELECt * FROM student WHERe id=? AND name=?";
// 为SQL语句设置参数,这里setObject()方法中的第一个参数代表的是SQL语句中的第几个问号,而第二参数代表的是设置变量
PreparedStatement pst = con.prepareStatement(sql);//已经预处理了,后面不用再加sql
pst.setInt(1,2);
//第一个数表示是第几个问号
pst.setString(2,"情书");
ResultSet rs = pst.executeQuery();//不需要sql了,前面已经预处理了
while(rs.next()){
int id=rs.getInt("id");
String name=rs.getString("name");
int price=rs.getInt("price");
System.out.println("id:"+id+" name:"+name+" price:"+price);
}
PreparedStatement与Statement:
PreparedStatement有预编译的过程,而且绑定了sql语句,无论执行多少遍,都不会再次进行编译。而Statement则不同,sql执行多少遍,就需要编译多少遍,所以PreparedStatement效率要比Statement高
6.关闭仓库
//最后需要关闭 rs.close(); stm.close(); con.close();
在数据库操作完毕之后,需要关闭ResultSet、Statement、Connection
操作完数据库之后ResultSet、Statement、Connection`是在程序中占用内存的,所以我们需要关闭,而且需要注意关闭的顺序,是从左到右的。
三、数据库工具类为什么需要?
如果数据信息量很庞大的话,不断地打开关闭数据库会非常的麻烦,所以就把操作封装成一个Java类,并且通过配置资源配置文件储存需要数据库连接基本信息。
db.properties:
连接池配置文件db.properties是java中采用数据库连接池技术完成应用对数据库的操作的配置文件信息的文件。
新建一个resource目录,在里面新建一个资源包命名为db。
在db.properties输入
driver=com.mysql.cj.jdbc.Driver//注意mysql.5没有cj url=jdbc:mysql://localhost:3306/market?&useSSL=false&serverTimezone=UTC username=root password=123456jdbc工具类处理数据库
最终代码模板:
1.jdbc工具类代码; 创建在jdbc包下的 JDBCUtil 类(固定的代码形式)
package jdbc;
import java.sql.*;
public class JDBCUtil {
// MySQL 5应为com.mysql.cj.jdbc.Driver
private static final String driver = "com.mysql.jdbc.Driver";
private static final String url = "jdbc:mysql://localhost:3306/market?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8";
private static final String userName = "用户名";
private static final String password = "用户密码";
// 获取数据库连接
public static Connection getConnection() {
Connection con = null;
try {
Class.forName(driver);
con = DriverManager.getConnection(url, userName, password);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
return con;
}
// 数据库查询,返回结果集
public static ResultSet query(Connection con, PreparedStatement st, ResultSet rs, String sql
, Object[] params) throws SQLException {
st = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
if (params != null) {
for (int i = 0; i < params.length; i++) {
st.setObject(i + 1, params[i]);
}
}
rs = st.executeQuery();
return rs;
}
// 数据库增删改
public static int update(Connection con, String sql
, Object[] params, ResultSet rs, PreparedStatement st) throws SQLException {
st = con.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
st.setObject(i + 1, params[i]);
}
return st.executeUpdate();
}
// 关闭数据库连接
public static void release(Connection con, Statement st, ResultSet rs) {
boolean flag = true;
if (rs != null) {
try {
rs.close();
rs = null;
} catch (SQLException e) {
e.printStackTrace();
flag = false;
}
}
if (st != null) {
try {
st.close();
st = null;
} catch (SQLException e) {
e.printStackTrace();
flag = false;
}
}
if (con != null) {
try {
con.close();
con = null;
} catch (SQLException e) {
e.printStackTrace();
flag = false;
}
}
}
}
2.mysql驱动
driver=com.mysql.jdbc.Driver ///还是要注意有无 cj. url=jdbc:mysql://localhost:3306/market?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8 username=root password=123456
3.测试代码,处理数据库
查询数据
package jdbc;
import java.sql.*;
public class Test2 {
public static void main(String[] args) {
Connection con;
PreparedStatement st = null;
ResultSet rs = null;
try {
// 获取链接
con = JDBCUtil.getConnection();
String sql = "SELECT * FROM student WHERe id = ? AND name = ?";
st = con.prepareStatement(sql);
Object[] params = {2, "情书"};
rs = JDBCUtil.query(con, st, rs, sql, params);
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString(2);
int price = rs.getInt(3);
System.out.println(id + " " + name + " " + price);
}
// 关闭数据库
JDBCUtil.release(con, st, rs);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
增加数据
try {
// 获取链接
con = JDBCUtil.getConnection();
String sql ="INSERT INTO student VALUES(? ,?,?)";
// st = con.prepareStatement(sql);
Object[] params = {6 ,"七月六便士",53};
int i = JDBCUtil.update(con,sql, params,rs ,st);
if(i != 1 ){
System.out.println("插入失败");
}else{
System.out.println("插入成功");
}
// 关闭数据库
JDBCUtil.release(con, st, rs);
} catch (SQLException e) {
e.printStackTrace();
}
关于VALUES(?, ?, ?) :
在PreparedStatement里面我们需要对SQL语句进行预处理, 所以首先需要把这些参数用占位符?来代替
而statement里面并不需要首先预处理 , 所以就不需要这边的参数用 ?来代替
PreparedStatement是如何防止SQL注入的?
暑期编程PK赛 得CSDN机械键盘等精美礼品!


