1.数据库编程的必备条件
编程语言:C, C++. JAVA, python等
数据库:mysql, oracle, sql server等
数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提
供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。同样的,
要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc。
2.java数据库编程:JDBC
JDBC是执行SQL语句的专用java api (用于连接java数据库的)
JDBC :java标准库,提供的一套API(类+方法) 统一各种数据库提供的API
这样图可以清楚的表示JDBC的作用了
3. jar包导入项目中
(jar包可以在官网自行下载)
第一步:新建一个项目(名字 lib 的目录,lib是library库的缩写,也可写其他名字)
第二步:
- 然后右键这个目录选择【添加为库…】
点击add就会出来下面这个图片的内容 默认点ok就行
导入完成
4.编写代码连接数据库
1.创建dataSource 数据源 (描述了数据库服务器在哪里)
使用对象获取方法
DataSource dataSource = new MysqlDataSource();
下面的方法 setUrl ,setUser, setPassword都是MysqlDataAource这个接口实现类里面的方法,由于向上转型后父类无法调用子类的独有的方法,所以我们还需要向下转型
通过强制类型转换就可以调用我们需要使用的方法了
这里有个问题是为什么不直接使用MysqlDataSource呢 (这样就可以不用上下转换了)
这里要是使用这个代码会产生隐患
MysqlDataSource mysqlDataSource = new MysqlDataSource();
因为我们在设计一些接口、类的时候始终要遵循【高内聚 · 低耦合】的思想,即类的内部各个方法之间要紧密关联,但类与类之间不要产生太大的依赖
因为在上面我们使用的是【MysqlDataSource 】,所以在程序的其他方法中,我们可能也需要使用到这个类去做一个接受,就是因为这种高内聚的原因,导致了【MysqlDataSource 】被大量地进行扩散,此危害性就在于后续我们的项目要更换数据库的就需要改动很多的代码,加大了工作量!!!
setUrl括号里面的内容了解即可
setUser 用户名默认是root即可
setPassword 安装mysql数据库时设置的密码
2.DriverManager
(驱动管理类)的静态方法获取
区别:
DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接。
DataSource提供连接池的支持。连接池在初始化时将内置了【数据库连接池】,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Conncetion连接对象回收
💬 可能有同学对这个【数据库连接池】不太理解,我们这里来讲一讲(doge)在Java中呢我们学习过很多的池,比方说:String字符串常量池、进程池、线程池、内存池,它们都是池
Connection 连接
我们就可以通过【DataSource】接口中一个方法叫做
getConnection()
这个方法去建立一个网络连接,它会返回一个实例为【Connection】的对象
5.构造sql语句
·定义一个字符串SQL 插入一句字段
String sql = “insert into student values (2,'张三')”;
- 但是呢有这条语句还不够,在JDBC中,我们还需要搭配一个对象去描述这里的sql情况
- 这里主要讲一下这个
PreparedStatement
,可能有很多同学看懵了。首先对于【startment】对象来说,是将SQL语句发送到数据库中。PreparedStatement statement = connection.prepareStatement(sql);
6.执行SQL语句
- 只需要调用这个类中的
executeUpdate()
即可,如果你要执行的SQL语句是【增】、【删】、【改】操作的话,那么你的SQL执行语句就写下面这一条就可以了int n = statement.executeUpdate();
- 但若是你执行的是【查】操作的话,结果就不是这样了,而是要写成下面这句
statement.executeQuery();
7.断开连接,释放资源
(后创建的先释放)
8.代码优化:
我们可以把SQL语句构造成 带有?的占位符
9.代码展示:
JDBC往数据库插入数据
public class JDBCInsertDemo {
public static void main(String[] args) throws SQLException {
/**
* 使用 JDBC 往数据库中插入一个记录
* 需要提前准备好数据库(java106) 和 数据表(student)
*/
// 1.创建数据源,描述了数据库服务器在哪
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("panjialie1218");
// 2.和数据库建立网络连接 (写JDBC实际上是实现一个MySQL客户端,通过网络和服务器进行通讯)
Connection connection = dataSource.getConnection();
// 3.输入学号和姓名
System.out.println("请输入学号:");
Scanner sc1 = new Scanner(System.in);
int id = sc1.nextInt();
System.out.println("请输入姓名:");
Scanner sc2 = new Scanner(System.in);
String name = sc2.next();
// 4.构造一个 SQL 语句,来完成插入操作
//String sql = "insert into student values (1, 'zhansan')"; -- 太死板
//String sql = "insert into student values (" + id + ", '" + name + "')"; -- 会SQL注入攻击
String sql = "insert into student values (?, ?)"; //通过占位符进行替换
// jdbc中还需要搭配一个特定的对象,来搭配描述这里的sql情况
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, name);
// 5.执行 SQL 语句 (控制客户端给服务器发送请求)
int ret = statement.executeUpdate();
System.out.println("ret = " + ret);
// 6.断开和数据库的连接,并且释放掉必要的资源
statement.close();
connection.close();
}
}
JDBC修改数据库里面的数据:
// 3.输入学号和姓名
System.out.println("请输入你要修改的学号");
Scanner sc1 = new Scanner(System.in);
int id = sc1.nextInt();
System.out.println("请输入你要修改的姓名");
Scanner sc2 = new Scanner(System.in);
String name = sc2.next();
// 4.构造SQL语句, 来完成更新操作
String sql = "update student set name = ? where id = ?";
// jdbc中还需要搭配一个特定的对象, 来搭配描述这里的sql情况
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, name);
statement.setInt(2, id);
JDBC删除数据表记录
// 3.输入学号和姓名
System.out.println("请输入你要删除学生的学号");
Scanner sc = new Scanner(System.in);
int id = sc.nextInt();
// 4.构造SQL语句, 来完成更新操作
String sql = "delete from student where id = ?";
// jdbc中还需要搭配一个特定的对象, 来搭配描述这里的sql情况
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
JDBC查询数据表记录
public class JDBCSelectDemo {
public static void main(String[] args) throws SQLException {
/**
* 使用 JDBC 往数据库中插入一个记录
* 需要提前准备好数据库(java106) 和 数据表(student)
*/
// 1.创建数据源,描述了数据库服务器在哪
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("panjialie1218");
// 2.和数据库建立网络连接 (写JDBC实际上是实现一个MySQL客户端,通过网络和服务器进行通讯)
Connection connection = dataSource.getConnection();
// 3.构造一个 SQL 语句,来完成插入操作
String sql = "select * from student";
// jdbc中还需要搭配一个特定的对象,来搭配描述这里的sql情况
PreparedStatement statement = connection.prepareStatement(sql);
// 5.执行 SQL 语句 (控制客户端给服务器发送请求)
ResultSet ret = statement.executeQuery();
while(ret.next())
{
int id = ret.getInt("id");
String name = ret.getString("name");
System.out.println("id = " + id + "; name = " + name);
}
// 6.断开和数据库的连接,并且释放掉必要的资源
statement.close();
connection.close();
}
}