DataSource databases = new MysqlDataSource();
((MysqlDataSource) databases).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");
jdbc:mysql 表示这个url是用于jdbc mysql的url
127.0.0.1 表示mysql服务器所在的主机的ip值,这里意为本机
3306 表示端口号,mysql的默认端口号就是3306
mydb_one 表示我的数据库名
characterEncoding=utf8 服务器的字符集,如果你的服务器字符集是utf8mb4也写成utf8
useSSL=false 表示传输过程中,不需要加密
((MysqlDataSource) databases).setUser("root");
((MysqlDataSource) databases).setPassword("fl12345.0");
以上写法还能换成另一种写法
MysqlDataSource database = new MysqlDataSource();
database.setURL();
database.setUser("root");
database.setPassword("fl12345.0");
但是第一种写法是更常见的习惯写法,因为代码中持有的实例是DataSource类型,后面一些其他代码如果需要用到DataSource,相关的参数也是DataSource,未来如果数据库进行切换,代码几乎不用改动——低耦合
第二种写法就会导致代码中导出散播着MysqlDataSource这条的类型,如果要进行数据库切换,代码中很多地方都需要修改——高耦合
前面创建好数据源,只是描述了一下这个数据源在哪,但我们并没有实际的去访问这个数据源
例如快递小哥给我打电话,让我去取快递,但实际上我可以选择不去,或者稍后再去取。真正去取快递这个操作,就相当于和数据库建立连接
Connection connection = dataSource.getConnection();
当我们去使用getConnection()方法时,会返回一个Connection对象,idea会给我们提示有很多的Connection,一定要认准,使用的是JDBC的Connection,不是MySQL驱动包里面的Connection,更不是其它的Connection
创建数据源的哪一个步骤出现差错,在建立连接的时候都会抛出SQLException,因此我们需要显示处理SQLException
操作数据库的关键就是构造一个SQL语句
String sql = "insert into student values(1, 'fl')";
//数据库中的student表
//+-------+-------------+------+-----+---------+-------+
//| Field | Type | Null | Key | Default | Extra |
//+-------+-------------+------+-----+---------+-------+
//| id | int(11) | YES | | NULL | |
//| name | varchar(20) | YES | | NULL | |
//+-------+-------------+------+-----+---------+-------+
在JDBC中构造SQL,不必带上分号, 分号只是在命令行中用来区分不同的语句,现在是直接在代码上操作
此处光是一个String类型的sql还不行,需要把这个Sring包装成一个“语句对象”
PreparedStatement statement = connection.prepareStatement(sql);
通过connection里面的prepareStatement这个方法来构造语句对象,这操作就是把字符串风格的sql转成了一个JDBC里面的对象
执行sql
int ret = statement.executeUpdate();
返回值就表示影响了几行
SQL中如果是insert, update, delete, 都使用executeUpdate 方法
如果是select, 则使用executeQuery 方法
sql执行完毕后,还需要释放资源
statement.close();
connection.close();
先释放statement,再释放connection 先创建的后释放,后创建的先释放
整个插入数据已经执行完毕,但是插入的数据都是直接给定的,但实际上大概率我们是需要灵活的处理要插入的数据,例如让用户通过控制台,输入想要插入的数据
Scanner scanner = new Scanner(System.in);
//让用户通过控制台输入一下待插入的数据
System.out.print("请输入id:");
int id = scanner.nextInt();
System.out.print("请输入名字:");
String name = scanner.next();
此时就需要把id和name替换到insert语句中的对应位置上,此处就有两种方式
第一种: 通过字符串拼接这个操作来构造sql,虽然可以,但是不推荐,因为这么写非常麻烦,容易写错,其次就是容易引起“SQL注入”
第二种: 使用代替写法,避免直接拼接字符串
String sql = "insert into student values(?, ?);
PreparedStatement statement = connection.prepareStatement(sql);
//插入多条记录
//String sql = "insert into student values(?, ?), (?, ?)";//下标1,2,3,4 并非1,2,1,2
?相当于告诉java程序,这两个字段的值,还不确定,先占个位置,再使用PreparedStatement的setXXX系列的方法进行替换
setXXX方法有很多,需要让这里的方法和数据库的列的类型匹配
进行替换操作
statement.setInt(1, id); //把第一个?替换成id
statement.setString(2,name); //把第二个?替换成name
这里就是在执行具体的替换操作,从下标1还是计算。
最后还需要执行sql
让用户输入一个id,根据id来删除
//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("fl12345.0");
//2.建立链接
Connection connection = (Connection) dataSource.getConnection();
//3.输入id
Scanner scanner = new Scanner(System.in);
System.out.print("请输入要删除的id:");
int id = scanner.nextInt();
//4.拼接SQL
String sql = "delete from student where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
//5.执行SQL
int ret = statement.executeUpdate();
System.out.println("ret = " + ret);
System.out.println(statement);
//6.释放资源
statement.close();
connection.close();
删除操作和插入操作几乎是一模一样
根据id修改学生姓名
//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("fl12345.0");
//2.建立链接
Connection connection = (Connection) dataSource.getConnection();
//3.输入id
Scanner scanner = new Scanner(System.in);
System.out.print("请输入要修改的学生id:");
int id = scanner.nextInt();
System.out.print("请输入要修改的学生姓名:");
String name = scanner.next();
//4.拼接SQL
String sql = "update student set name = ? where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, name);
statement.setInt(2, id);
//5.执行sql
int ret = statement.executeUpdate();
System.out.println("ret = " + ret);
System.out.println(statement);
//6.关闭资源
statement.close();
connection.close();
修改操作和插入操作几乎是一模一样
查找操作和前面的三个操作相比,要复杂一些,查找操作需要对结果进行访问
//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("fl12345.0");
//2.建立链接
Connection connection = (Connection) dataSource.getConnection();
//3.拼接SQL
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//4.执行SQL,对于查询操作,就需要使用executeQuery
// 查询操作的返回结果不是一个int,而是一张"临时表"
//使用ResultSet表示这张临时表
ResultSet resultSet = statement.executeQuery();
//5.遍历结果集合(返回临时表),先获取到这一行,再获取到这一行中的若干行
// 如果遍历到表的结束位置,此处的next也就返回false
//+-------+-------------+------+-----+---------+-------+
//| Field | Type | Null | Key | Default | Extra |
//+-------+-------------+------+-----+---------+-------+
//| id | int(11) | YES | | NULL | |
//| name | varchar(20) | YES | | NULL | |
//+-------+-------------+------+-----+---------+-------+
// next方法表示获取到一行记录,同时把光标往后移动一行
while (resultSet.next()){
//针对这一行获取到其中的列
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id = "+ id +", name = " + name);
}
//6.释放资源
resultSet.close();//resultSet也需要释放
statement.close();
connection.close();
在获取每一列的数据时,需要用对应的类型去接受,不可混用
在使用get系列方法时,会有两种
第一种传的参数是第几列(从1开始)
第二种传的参数是列的名字(主要用这个)