文章目录
一.通过Java代码如何操作Mysql
通过Java代码如何操作Mysql C/S 客户端服务器模型
JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现。各种不同类型的数据库都依这种规范有相应的实现,都是由java类和接口组成。
二.使用JDBC的步骤:
<1>导入jdbc的Mysql实现依赖
导入依赖
<2>参数配置
jdbcUrl :唯一确定数据库 以及编码形式 中文
jdbc:mysql://127.0.0.1:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
jdbc:mysql :和mysql建立连接时使用的协议
127.0.0.1:3306 :mysql服务器所在的ip地址和端口号
ip地址:唯一的确定mysql服务器运行的主机 127.0.0.1 当前主机
端口号:能够确定mysql服务器是这台主机的哪一个进程 3306 mysql默认端口
IP 和 端口号帮助我们确定mysql服务器的位置。
school : 要操作的数据库的名字。
<3>加载驱动
登录名称:root;
登录密码:123456
加载驱动:
private String url = "jdbc:mysql://127.0.0.1:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
private String userName = "root";
private String password = "123456";
private String jdbcDriver = "com.mysql.jdbc.Driver"; //jdbc 驱动
private Connection connection;
<4>建立连接
connection = DriverManager.getConnection(url, userName, password);
getConnection:就是jdbc提供给我们建立连接的方法 登录到mysql服务器的过程
<5>创建操作数据库对象
创建操作对象:
public void createConnection() {
try {
Class.forName(jdbcDriver);
try {
connection = DriverManager.getConnection(url, userName, password);
if (!connection.isClosed()) {
System.out.println("连接建立成功");
} else {
System.out.println("连接建立失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
<6>使用statement /PreparedStatement对象,执行sql语句
(1)使用statement对象,执行sql语句
在第一步定义对象
private Statement statement;
根据数据库中的表 添加数据,删除数据,改变数据,查询数据:
//添加数据
public void insertTest() {
String insertSql = "insert into test values(2,'小明')";
try {
statement.executeUpdate(insertSql);
//executeUpdate所有会对数据库内容造成修改的sql语句都是调用这个方法执行的
} catch (SQLException e) {
e.printStackTrace();
}
}
//删除数据
public void deleteTest(){
String deleteSql = "delete from test where id =200";
try {
statement.executeUpdate(deleteSql);
} catch (SQLException e) {
e.printStackTrace();
}
}
//改变数据的值
public void updateTest(){
String updateSql = "update test set name = '小张' where id = 1";
try {
statement.executeUpdate(updateSql);
} catch (SQLException e) {
e.printStackTrace();
}
}
//查询数据
public void selectTest() {
String selectSql = "select * from student";
try {
ResultSet resultSet = statement.executeQuery(selectSql); //resultSet 查询到的结果集的集合
//executeQuery:执行查询数据的SQL语句专用
while (resultSet.next()) {//resultSet.next() 判断集合是否有数据
System.out.println("SID " + resultSet.getString(1)
+ " Sname " + resultSet.getString(2) +
" Sage " + resultSet.getString(3) +
" Ssex " + resultSet.getString(4)
);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
(2)使用PreparedStatement对象,执行sql语句
PrepareStatement对象的使用来执行语句:
//添加数据
public void insertTest() {
String insertSql = "insert into test values(?,?)"; //定义无参的sql语句
PreparedStatement pre = null;
try {
pre = connection.prepareStatement(insertSql);//将无参数的sql语句提交给mysql
//给无参数的sql语句提交参数
pre.setInt(1, 201);
pre.setString(2, "小红");
pre.executeUpdate(); //执行这条sql
pre.setInt(1, 202);
pre.setString(2, "小李");
pre.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
pre.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//查询数据
public void selectTest() {
String selectSql = "select Sname,Ssex from student where SID > ?";
try {
PreparedStatement pre = connection.prepareStatement(selectSql);
pre.setString(1, "2");
System.out.println(pre);
ResultSet resultSet = pre.executeQuery();
while (resultSet.next()) {//resultSet.next() 判断集合是否有数据
System.out.println(
"Sname " + resultSet.getString(1) +
" Ssex " + resultSet.getString(2)
);
}
System.out.println("-----------------------------------------------------");
pre.setString(1, "3");
System.out.println(pre);
ResultSet resultSet1 = pre.executeQuery();
while (resultSet1.next()) {//resultSet.next() 判断集合是否有数据
System.out.println(
"Sname " + resultSet1.getString(1) +
" Ssex " + resultSet1.getString(2)
);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//删除数据
public void deleteTest(){
String deleteSql = "delete from student where Sid = ?";
try {
PreparedStatement pre = connection.prepareStatement(deleteSql);
pre.setInt(1,4);
pre.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
//改变数据
public void updateTest(){
String updateSql = "update student set Sname = '王明' where Sid = ?";
try {
PreparedStatement pre = connection.prepareStatement(updateSql);
pre.setInt(1,1);
pre.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
(3)使用statement /PreparedStatement对象的区别
1.结构完全相同,仅仅只是参数值不同
2.PreparedStatement 当执行多条同结构的sql语句时,PreparedStatement对象会先提交一个无参数的
sql语句进进行编译。
3.同结构的sql语句执行多次,PreparedStatement对象的执行效率要比statment对象高的多。
原因:PreparedStatement对象对于同结构的sql只编译一次。而statment对象有几条sql就需要执行几次
4.一个结构的sql语句只执行一次,statment对象更好。原因是:statment对象执行sql时编译和执行一次就完成。而PreparedStatement对象先编译无参数的sql,再提交参数
然后再执行。
综上:只有同结构的sql语句执行多次PreparedStatement对象的执行效率比statment对象高,如果执行一次statment对象更好。
(4)sql注入异常
结构化查询语言(SQL)是一种用来和数据库交互
的文本语言。SQL Injection 就是利用非法的SQL拼接,
从而达到入侵数据库的目的。 它的产生主要是由于程序
对用户输入的数据没有进行严格的过滤,导致非法的数据
库SQL操作语句的执行。
SQL 注入(SQL Injection)攻击具有很大的危害,
攻击者可以利用它读取、修改或者删除数据库内的数据,
获取数据库中的用户名和密码等敏感信息,甚至可以获得
数据库管理员的权限,而且SQL Injection 也很难防范,
一般的防火墙也无法拦截 SQL Injection 攻击。
PreparedStatement对象 能够有效的防止sql注入的攻击。
<7>关闭连接
使用过后关闭连接,避免资源浪费
public void closeConnection() {
try {
connection.close(); //当不在使用mysql时关闭mysql连接 方式资源浪费
} catch (SQLException e) {
e.printStackTrace();
}
}