通过JDBC连接MySQL实现表的插入和查看语句
1.插入语句
因为插入,删除,更新数据操作差不多,我们这里仅仅介绍插入的方法,我们将不使用dbdriver的方式操作,因为这个操作使用的是反射,我们不推荐,下面我们开始正式介绍插入的操作
1.导入库
在官网上搜索jdbc连接的jar包,下载后粘贴到项目路径下,然后选中右击加入库即可
2.创建数据源对象(描述服务源在哪)
服务源可能是本机,也可能是其他服务器
DataSource dataSource = new MysqlDataSource();
接着设置url,用户,和密码
((MysqlDataSource)dataSource).setURL("jdbc:mysql://localhost:13306/dbtest1?useSSL=false&allowPublicKeyRetrieval=true"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("abc123");
为什么不直接new一个MySQlDataSourse呢?
因为加入我们将数据库换成了Oracle,就不用修改太多的代码,没啥影响,实现了低耦合
3.建立抽象连接
这样通信双方都能接收到对方的信息,便于后面的通信
Connection connection = dataSource.getConnection();
4.创建一个SQL语句
为什么使用PreparedStatement而不是Statement?
1.预编译
preparedStatement会将sql语句进行预编译,可以提高执行效率,当出现多次相同的查询语句时会更加高效,因为sql已经被编译过了,数据库会对其进行优化或缓存,效率会进一步提高
注:这里的缓存不是JIT的动态缓存,而是数据库在接受到这些预编译的指令,会生成一系列的查询计划进行缓存,后面在接收到相同的查询指令时,可以使用缓存过的查询计划
2.安全性
可以防止sql注入攻击
3.性能优化
PreparedStatement会减少客户端和服务器的网络通信,因为他可以使用参数替代的sql文本,降低了传输的开销.
String sql = "insert into student values(?,?)"; //预处理语句(要执行的SQL,是需要进行语法解析的) //JDBC也有statement类但是没有预处理功能 //控制台也是把sql发给服务器,服务器负责解析sql并执行 //预处理这里就是解析好了,把解析后的结果交给发给服务器去执行 //如果请求太多了,这样的开销对于服务器来说就不可忽视了 PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1,name); statement.setInt(2,age);
4.将构造好的语句发送给服务器执行
这里的n其实是返回了几条记录收到影响,我们便于查看是否插入成功
int n = statement.executeUpdate(); System.out.println(n);
5.释放资源
这些连接和语句会占用一定的硬件资源,记得使用完释放,记得先释放语句再释放连接
statement.close(); connection.close();
举个例子,我们现在要向student表插入一条数据
"张三",30
下面我们运行这个代码
Scanner sc = new Scanner(System.in); System.out.println("请输入姓名"); String name = sc.next(); System.out.println("请输入年龄"); int age = sc.nextInt(); //1.创建数据源,描述数据源在哪 DataSource dataSource = new MysqlDataSource(); ((MysqlDataSource)dataSource).setURL("jdbc:mysql://localhost:13306/dbtest1?useSSL=false&allowPublicKeyRetrieval=true"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("abc123"); //2.和数据库服务器建立连接(抽象的连接) //可以理解为通信双方各自保存对方的信息,然后就可以进行后续的通信了 Connection connection = dataSource.getConnection(); //3.构造一个sql String sql = "insert into student values(?,?)"; PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1,name); statement.setInt(2,age); //4.把构造好的SQL发送给服务器执行 int n = statement.executeUpdate(); System.out.println(n); //5.释放一些必要的资源 statement.close(); connection.close();
结果就是控制台输出一个1,意思是一行受到了影响,然后打开数据库查看表就会发现已经插入成功了.
注:这里的13306是安装时候设置的端口号,默认为3306,后面的dbtest1是使用的数据库名称
2.查询语句
前面的创建数据源,建立连接都相同,重要的是怎么读取临时表的数据
前面由于操作相同,不做过多赘述
只是我们在接受这个时候的结果集时,有所不同
ResultSet resultSet = statement.executeQuery(); while(resultSet.next()){ String name = resultSet.getString("name"); int age = resultSet.getInt("age"); System.out.print("name: "+name+" "); System.out.print("age: "+age+" "); System.out.println(); }
我们使用一个ResultSet来接收结果集,分别get对应列的数据,最后以需要的格式打印在控制台中便于查看,我们举例查看一下刚刚的student结果集
DataSource dataSource = new MysqlDataSource(); ((MysqlDataSource)dataSource).setURL("jdbc:mysql://localhost:13306/dbtest1?useSSL=false&allowPublicKeyRetrieval=true"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("abc123"); Connection connection = dataSource.getConnection(); String sql = "select * from student"; PreparedStatement statement = connection.prepareStatement(sql); ResultSet resultSet = statement.executeQuery(); while(resultSet.next()){ String name = resultSet.getString("name"); int age = resultSet.getInt("age"); System.out.println(name +" " + age); } resultSet.close(); statement.close(); connection.close();
输出结果如下