jdbc开发,需要提前先准备驱动包(下载一个mysql驱动包)及配置(项目配置引入这个驱动包)
下载链接:mysql驱动包
注意:jar包的版本要和自己本地mysql版本一致
1.创建项目,最好把jar包放到项目某个目录
2.项目右键
3.添加依赖包
4.写一段代码,使用jar包中的接口或类,看能否引入
出现以上即配置完成。
1.建立数据库连接:类似打开一个cmd客户端连接到mysql
(1) 方式一:DriverManager
// Class.forName("com.mysql.jdbc.Driver");
/**
* DriverManager是jdbc的api, Connection也是(java.sql开头)
* url:
* (1)服务器地址,看看是不是要连接的数据库ip/域名
* (2)带层次的路径: 数据库名
* (3)用户名,密码
*/
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_test?user=root&password=123456&useUnicode=true&characterEncoding=UTF-8&useSSL=false");
(2)方式二:DataSourse(数据源/数据库连接池)
连接池初始化时,就创建一定数量的数据库连接对象(Connection)
connection.close()只是重置连接对象属性,放回连接池
//使用数据库连接池来获取数据库连接对象
//一个Java程序,创建多个还是1个连接池对象?一个
MysqlDataSource ds = new MysqlDataSource();
//url中的参数,可以使用方法来设置
ds.setURL("jdbc:mysql://localhost:3306/db_test");
ds.setUser("root");
ds.setPassword("123456");
ds.setUseSSL(false);//不使用安全连接,如果不设置有警告
//设置编码格式:按某个编码保存数据,也要按一样的编码来使用
ds.setCharacterEncoding("UTF-8");
//1. 建立数据库连接
Connection c = ds.getConnection();
(3)DriverManager VS DataSourse
2.创建操作命令对象Statement:该对象用于执行sql代码
(1)Statement:不带占位符简单操作命令对象(了解)
Statement s = c.createStatement();
(2)预编译的操作命令对象PreparedStatement
带占位符的预编译操作命令对象
//2.创建操作命令对象
//使用预编译的操作命令对象PreparedStatement
//sql语句中,可能包含一些客户端网页传入的数据
String inputName = "数学";//模拟客户端用户传入的id
//? 是占位符,类似格式化打印中%s, %d,可以替换掉
String sql = "select id c_id,name c_name from course where name=?";
PreparedStatement ps = c.prepareStatement(sql);//!!!
/**
* 替换占位符: setXXX(index, value)
* XXX: 值的类型
* index: 是占位符的索引位置(从1开始)
* value: 要替换的值
*/
ps.setString(1, inputName);
//3.执行sql语句: 可以不加分号了(加上也不会报错)
ResultSet rs = ps.executeQuery();//预编译的操作命令对象执行无参的方法
优势:提前预编译,效率更高; 防止sql注入,更安全
(3) CallableStatement:用于执行存储过程的
3.执行sql
//3.执行sql语句: 可以不加分号了(加上也不会报错)
String inputName = "' or '1'='1";//模拟客户端用户输入的
4.如果是查询操作,处理结果集ResultSet ->调用executeQuery,返回结果集
如果是插入,修改,删除操作,调用executeUpdate,返回int表示处理成功多少条
String sql = "select id c_id,name c_name from course where name='"+inputName+"'";
System.out.println(sql);
ResultSet rs = s.executeQuery(sql);
//4.处理结果集
while (rs.next()){//遍历每一行数据
//获取id字段的值
int id = rs.getInt("c_id");
String name = rs.getString("c_name");
System.out.printf("id: %s, name: %s\n", id, name);
}
5.释放资源:反向释放(ResultSet,Statement, Connection)都是调用close()释放
插入操作代码
public class CourseInsert {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//使用数据库连接池来获取数据库连接对象
//一个Java程序,创建多个还是1个连接池对象?一个
MysqlDataSource ds = new MysqlDataSource();
//url中的参数,可以使用方法来设置
ds.setURL("jdbc:mysql://localhost:3306/java44");
ds.setUser("root");
ds.setPassword("123456");
ds.setUseSSL(false);//不使用安全连接,如果不设置有警告
//设置编码格式:按某个编码保存数据,也要按一样的编码来使用
ds.setCharacterEncoding("UTF-8");
//1. 建立数据库连接
Connection c = ds.getConnection();
//2.创建操作命令对象
//使用预编译的操作命令对象PreparedStatement
//sql语句中,可能包含一些客户端网页传入的数据
String inputName = "王者";//模拟客户端用户传入的id
//? 是占位符,类似格式化打印中%s, %d,可以替换掉
String sql = "insert into course(name) values(?)";
PreparedStatement ps = c.prepareStatement(sql);//!!!!
/**
* 替换占位符: setXXX(index, value)
* XXX: 值的类型
* index: 是占位符的索引位置(从1开始)
* value: 要替换的值
*/
ps.setString(1, inputName);
//3.执行sql语句: 可以不加分号了(加上也不会报错)
//插入,修改,删除,都调用executeUpdate,返回int是执行成功多少条
int n = ps.executeUpdate();//预编译的操作命令对象执行无参的方法 !!!
System.out.println(n);
//5.释放资源:反向释放(resultSet, Statement, Connection).close()
}
}