知乎关键词排名,关键词优化一年多少钱,做百度移动网站,wordpress做超链接目录
1. JDBC原理
2. 导入JDBC驱动包
3. 编写JDBC代码实现Insert
3.1 创建并初始化一个数据源
3.2 和数据库服务器建立连接
3.3 构造SQL语句
3.4 执行SQL语句
3.5 释放必要的资源
4. JDBC代码的优化
4.1 从控制台输入
4.2 避免SQL注入的SQL语句
5. 编写JDBC代码实现…目录
1. JDBC原理
2. 导入JDBC驱动包
3. 编写JDBC代码实现Insert
3.1 创建并初始化一个数据源
3.2 和数据库服务器建立连接
3.3 构造SQL语句
3.4 执行SQL语句
3.5 释放必要的资源
4. JDBC代码的优化
4.1 从控制台输入
4.2 避免SQL注入的SQL语句
5. 编写JDBC代码实现Select 1. JDBC原理
1. 各种数据库如MySQL、Oracle、SQLServer等在开始时会提供一组编程接口API
API即application programming interface即代码层次上的提供的功能API往往是通过函数或类的形式来提供的。
2. 不同的数据库系统的API是不同的JDBC就是统一Java与数据库连接的一套规范的API 3.Java程序员如果想要进行数据库开发就需要在项目中导入对应数据库的驱动包才能编写代码。
4. 驱动包是数据库厂商提供的此处以MySQL为例获取方式有
1从MySQL官网获取现为Oracle官网的一个子网
2github
3maven中央仓库
注中央仓库可以理解为一个服务器托管了各种软件程序包maven就类似于应用商店通过应用商店就可以访问到应用程序包并进行下载
2. 导入JDBC驱动包 3. 编写JDBC代码实现Insert
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class JDBCInsert {public static void main(String[] args) throws SQLException {// 1. 创建并初始化一个数据源DataSource dataSource new MysqlDataSource();// 把dataSource对象转为MysqlDataSource类型// setUrl是MysqlDataSource类的方法要调用需先将对象转为MysqlDataSource类型((MysqlDataSource)dataSource).setUrl(jdbc:mysql://127.0.0.1:3306/JDBCProgram?characterEncodingutf8useSSLfalse);((MysqlDataSource)dataSource).setUser(root);((MysqlDataSource)dataSource).setPassword(xxxxx);// 2. 和数据库服务器建立连接Connection connection dataSource.getConnection();// 3. 构造 SQL 语句String sql insert into student values(1, Mike);// 使用PreparedStatement对sql语句进行预编译PreparedStatement statement connection.prepareStatement(sql);// 4. 执行 SQL 语句int ret statement.executeUpdate();System.out.println(ret ret);// 5. 释放必要的资源statement.close();connection.close();}
} 运行代码在idea控制台有 并在MySQL中查看Student表结果
mysql select* from student;
------------
| id | name |
------------
| 1 | Mike |
------------
1 row in set (0.00 sec)
编写JDBC代码需要以下五个步骤
3.1 创建并初始化一个数据源
1数据源即数据的源头此处数据来源于数据库即此处要描述数据库服务器在哪里
数据库中使用DataSourse接口进行描述
2在创建并初始化一个数据源也可以无需向上转型向下转型直接使用MysqlDataSource
MysqlDataSource dataSource new MysqlDataSource();
只是在向上转型向下转型的写法比较流行二者均可使用
3URL即唯一资源定位符用于描述网络上某个资源所在的位置此处设置为
((MysqlDataSource)dataSource).setUrl(jdbc:mysql://127.0.0.1:3306/JDBCProgram?characterEncodingutf8useSSLfalse);
① jdbc是固定的mysql为连接的哪一个库
② 127.0.0.1为本地回环地址表示本主机
③ 3306为数据库服务器默认端口号标记某一主机上的进程
④ JDBCProgram为数据库名自行创建
⑤ characterEncodingutf8useSSLfalse分别表示字符集为utf8和不加密SSL是一个加密协议
3除设置URL之外还需设置User和Passward才能访问数据库服务器用户名默认为root密码为安装数据库时的密码
4经过第一步后只是描述了数据库的位置与用户名、密码等还没有进行连接
3.2 和数据库服务器建立连接
1使用getConnection方法与数据库服务器建立连接并用Connection类型的变量来接受返回值注意选择第一个jdbc的Connection 2如果getConnection方法正常运行则连接建立成功如果连接建立失败会直接抛异常;
3.3 构造SQL语句
基于以下数据库与数据表
mysql use jdbcprogram
Database changed
mysql show tables;
-----------------------
| Tables_in_jdbcprogram |
-----------------------
| student |
-----------------------
1 row in set (0.00 sec)mysql desc student;
-----------------------------------------------
| Field | Type | Null | Key | Default | Extra |
-----------------------------------------------
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
-----------------------------------------------
2 rows in set (0.00 sec) 1构造的SQL语句与在MySQL中构造的规定相同
2如果请求是个SQL字符串服务器是可以处理的。服务器就需要对SQL进行解析。
客户端数目庞大时会导致服务器压力很大故而在客户端使用PreparedStatement对SQL语句进行预编译就可以减轻服务器的压力
3.4 执行SQL语句
1注意SQL语句的insert、delete和update操作都是使用executeUpdate方法进行执行的返回值是int类型数据表示影响的行数
2select操作使用的是executeQuery方法
3.5 释放必要的资源
1数据库的客户端与服务器进行通信时会消耗一定的系统资源如CPU、内存、硬盘、带宽等等。为了防止服务器同时处理多个客户端造成系统资源受限当客户端不使用服务器时就对资源进行释放
2语句与连接均需要释放需要先释放语句再释放连接。
释放的顺序与创建的顺序是相反的。
3除Datsource之外还有一种DriverManager的写法这种写法是通过反射的方式加载驱动包中的类进一步进行后续操作的。
但并不建议使用这种写法反射属于java开发的特殊手段其代码可读性非常差编译期难以对代码的正确性进行检查容易产生运行时异常建议不到万不得已不要使用反射
并且DataSource内置了数据库连接池可以复用连接提高连接服务器的效率
4. JDBC代码的优化
对于上文的JDBC代码要插入的数据是硬编码但是让用户编码是不现实的故而需要将数据通过其他方式供用户输入。
4.1 从控制台输入
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;public class JDBCInsert {public static void main(String[] args) throws SQLException {Scanner scanner new Scanner(System.in);// 1. 创建并初始化一个数据源DataSource dataSource new MysqlDataSource();((MysqlDataSource)dataSource).setUrl(jdbc:mysql://127.0.0.1:3306/JDBCProgram?characterEncodingutf8useSSLfalse);((MysqlDataSource)dataSource).setUser(root);((MysqlDataSource)dataSource).setPassword(xxxxx);// 2. 和数据库服务器建立连接Connection connection dataSource.getConnection();// 3. 从控制台读取用户输入的内容System.out.println(请输入学生姓名);String name scanner.next();System.out.println(请输入学生学号);int id scanner.nextInt();// 4. 构造 SQL 语句String sql insert into student values( id , name );// 预编译PreparedStatement statement connection.prepareStatement(sql);// 5. 执行 SQL 语句int ret statement.executeUpdate();System.out.println(ret ret);// 6. 释放必要的资源statement.close();connection.close();}
}运行代码在控制台输入一下信息 在mysql中查看Student表
mysql select* from student;
------------
| id | name |
------------
| 1 | Mike |
| 2 | Mary |
------------
2 rows in set (0.00 sec)
4.2 避免SQL注入的SQL语句
在上例代码中构造的SQL语句为
String sql insert into student values( id , name );
如果用户输入的name形如王五);select* from ***导致看似一条SQL语句变为多个语句就会出现SQL注入问题如果再携带drop database之类的语句可能会对系统造成更大的伤害。
针对以上问题可以借助PreparedStatement的拼装功能实现
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;public class JDBCInsert {public static void main(String[] args) throws SQLException {Scanner scanner new Scanner(System.in);// 1. 创建并初始化一个数据源DataSource dataSource new MysqlDataSource();// 把dataSource对象转为MysqlDataSource类型// setUrl是MysqlDataSource类的方法要调用需先将对象转为MysqlDataSource类型((MysqlDataSource)dataSource).setUrl(jdbc:mysql://127.0.0.1:3306/JDBCProgram?characterEncodingutf8useSSLfalse);((MysqlDataSource)dataSource).setUser(root);((MysqlDataSource)dataSource).setPassword(xxxxx);// 2. 和数据库服务器建立连接Connection connection dataSource.getConnection();// 3. 从控制台读取用户输入的内容System.out.println(请输入学生姓名);String name scanner.next();System.out.println(请输入学生学号);int id scanner.nextInt();// 4. 构造 SQL 语句String sql insert into student values(?, ?);// 使用PreparedStatement对sql语句进行预编译PreparedStatement statement connection.prepareStatement(sql);statement.setInt(1, id);statement.setString(2, name);// 打印statement需在拼接数据之后System.out.println(statement);// 5. 执行 SQL 语句int ret statement.executeUpdate();System.out.println(ret ret);// 6. 释放必要的资源statement.close();connection.close();}
}
输入学生姓名与学号后控制台输出结果如下 在mysql中查看Student表
mysql select* from student;
------------
| id | name |
------------
| 1 | Mike |
| 2 | Mary |
| 3 | John |
------------
3 rows in set (0.00 sec)
注1构造的SQL语句中的2个?是两个占位符statement.setInt与statement.setString方法就可以把占位符替换为指定的值 statement.setInt(1, id);statement.setString(2, name);
分别表示将第一个占位符替换为id的值第二个占位符替换为name的值当用户输入给id和name赋值后就会通过该方法自动替换
2可以使用打印statement的方法查看具体拼接情况需将该语句置于拼接数据之后
假如代码执行出错了也可以把statement打印出来查看具体语法是否出错
5. 编写JDBC代码实现Select
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class JDBCSelect {public static void main(String[] args) throws SQLException {// 1. 创建并初始化数据源DataSource dataSource new MysqlDataSource();((MysqlDataSource)dataSource).setUrl(jdbc:mysql://127.0.0.1:3306/JDBCProgram?characterEncodingutf8useSSLfalse);((MysqlDataSource)dataSource).setUser(root);((MysqlDataSource)dataSource).setPassword(97805);// 2. 建立连接Connection connection dataSource.getConnection();// 3. 构造SQL语句String sql select* from Student;PreparedStatement statement connection.prepareStatement(sql);// 4. 执行SQL语句ResultSet resultSet statement.executeQuery();// 5. 遍历结果集合while(resultSet.next()){int id resultSet.getInt(id);String name resultSet.getString(name);System.out.println(id id , name name);}// 6. 释放资源resultSet.close();statement.close();connection.close();}
}控制台输出结果为 注1执行SQL的语句为
ResultSet resultSet statement.executeQuery();
对比SQL实现Insert的executeUpdate方法返回的是一个int类型数据实现Select的executeQuery方法返回的是一个ResultSet类型对象。
该对象可以视为是一张表初始时光标指向表首行可以使用getXXX方法获取当前光标指向的行的数据。每调用一次next就使光标下移一行当光标遍历完整张表再调用next时就会返回false
2getXXX方法用于取出这一行指定列的值使用的方法要与列的类型匹配
参数可以是第几列的下标也可以是列名更推荐使用列名 while(resultSet.next()){int id resultSet.getInt(id);String name resultSet.getString(name);System.out.println(id id , name name);}
3实现Select的程序在释放资源时相较于Insert需要多释放一个resultSet可以将查询结果的临时表视为一个resultSet