你想要多大的成功,你愿意为这份成功付出什么?
1. JDBC: 是Java提供的一套类和接口 是链接数据库的一套规范;
2. JDBC为我们提供了java连接数据库的驱动。而这个驱动也是由Java开发出来的,我们只需要将这个驱动放进项目中,通过这个 驱动,我们就可以用Java连接数据库,进行数据库的管理操作。
3: 了解:JDBC与ODBC的区别:
二者皆可以实现对数据库的操作(连接、增删改查、建库建表)。
1. JDBC是SUN开发的java连接数据库的标准;
2. ODBC是微软开发的,C语言的;
2. JDBC操作数据库的步奏:
注意: 每个驱动程序类必须实现的接口 Driver; DriverManager 管理一组 JDBC 驱动程序的基本服务。
1. 注册驱动 registerDriver( Driver driver ),
1. 第一种注册方式: DriverManger.registerDriver( new Driver() ); Driver里面有个静态代码块.执行了这一个过程.我们 只需要加载类的时候,就可以被调用; 因此我们用第二种方法;
2.第二种注册方式: 利用反射注册驱动,forName(里面填入的是带包名的类名);
2. 获取数据库连接对象:
getConnection(String url, user password );
3. 通过链接对象, 获取sql语句的执行对象;
connection.createStatement();
4. 通过 statement对象来执行sql语句;
1. statement. executeUpdate( sql ); 执行DML和DDL语句 返回值 int 受影响的行数;
2. statement.executeQuery( sql ); 执行DQL语句; 返回值resultSet
5. 处理执行sql 后得到的结果集;
6. 关闭资源( 调用close() 方法)
1. 练习 : 插入一条数据;
public class Demo01 {
public static void main(String[] args) throws Exception {
// 注册驱动
// 如果这么注册 相当于注册了2遍驱动 DriverManager.registerDriver(new Driver());
// Driver类源码中有静态代码块
// 并且代码块中 已经注册了一次""
// 该如何正确注册驱动?
// 利用反射注册驱动 反射填进去的是全类名;带包名;
Class<?> forName = Class.forName("com.mysql.jdbc.Driver");
// 第二步获取连接对象
// url 数据库的链接地址 固定格式 jdbc:mysql://主机ip地址: 数据库的端口号(默认3306)/数据库的名
// 用jdbc链接的mysql //
String url = "jdbc:mysql://localhost:3306/myjdbc01";
String user = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url, user, password);
// 这里打印是connection实现类;
// System.out.println(connection);
// 第三步: 通过连接对象获取sql语句的执行对象
Statement statement = connection.createStatement();
// 第四步: 执行sql语句;插入一条数据;
String sql = "insert into goods" + "(sname,sprice,adesc)"
+ "values('手机',8000,'一台高级手机')";
// 返回值是受影响的行数;
int row = statement.executeUpdate(sql);
System.out.println("受影响的行数" + row);
// 关闭资源
// 关闭连接对象,
connection.close();
// 关闭执行sql语句的对象
statement.close();
}
}
2. 查询一条数据;
public class Demo02查询 {
public static void main(String[] args) throws Exception {
// 注册驱动;
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/myjdbc01";
String user = "root";
String password = "123456";
// 获取链接对象
Connection connection = DriverManager.getConnection(url, user, password);
// 获取sql语句对象
Statement create = connection.createStatement();
String sql = "select*from goods";
// 返回查询结果的结果;
ResultSet result1 = create.executeQuery(sql);
while (result1.next()) {
// 打印数据
// 如果使用列的索引注意从1 开始;\
// 如果使用*号查询: 索引是数据库中标的顺序;
// 如果不适用* 直接使用字段顺序就是你sql语句中使用的顺序;
// int int1 = result1.getInt(1);
// String name = result1.getString(2);
// int age = result1.getInt(3);
// String adesc = result1.getString(4);
// System.out.println(int1+name+age+adesc);
// 直接往里面填字段名字 获取数据方式; 里面存在指针, 开始指在第一行最上方;
String sname = result1.getString("sname");
int sid = result1.getInt("sid");
System.out.println(sid + sname + result1.getInt("sprice") + result1.getString("adesc"));
}
// 关闭资源
connection.close();
create.close();
result1.close();
}
}
打印结果
1娃娃100大海专用
2普洱20阿凡达专用
3本体10000对于自己来说很好用
4手机8000一台高级手机
5手机180012台高级手机
3. sql 注入设置:
or'1=1 sql注入; 研究一 下
* sql 注入測試;
* 在sql語句拼接时候.可以加入一个恒等条件;
* 让这条sql语句一定会成立.
* 可以通过这个方式来改变你sql语句原来的意思;
*
* sql 注入设置;
* 键盘输入账号密码
* 查询数据库 ----打印用户信息;
* 并且打印该账号和密码
* select * from goods where username= 'wanglong'and password ='123'
public class Demo03登录 {
public static void main(String[] args) throws Exception {
System.out.println("请输入賬號");
Scanner scanner = new Scanner(System.in);
String user1 = scanner.nextLine();
System.out.println("請輸入密碼");
String password1 = scanner.nextLine();
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/myjdbc01";
String user = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url, user, password);
Statement statement = connection.createStatement();
String sql = " select * from users where username= '"+user1+"' and password= '"+password1+"'";
ResultSet executeQuery = statement.executeQuery(sql);
while (executeQuery.next()) {
// String string = executeQuery.getString("uid");//
System.out.println(executeQuery.getString("username") + " " + executeQuery.getString("password"));
}
connection.close();
statement.close();
executeQuery.close();
}
}
//打印结果 由于字符串拼接原因, 我改变了sql语句本来的条件导致注入设置:
请输入賬號
王龙
請輸入密碼
123456'or'1=1
王龙 123456
坤儿 123456
4. 如何避免注入设置;
1. 获取预编译sql语句的对象; connction.prepareStatement( sql );
2. 使用占位符 ? : 使用占位符时候不用加引号;
3. 调用 statement. setObject ( 1 , user1 ); 替换掉问号;
1.参数1.问号的位置个数,
2.参数2. 问号要替换的变量
public class Demo04防止sql注入 {
public static void main(String[] args) throws Exception {
System.out.println("请输入賬號");
Scanner scanner = new Scanner(System.in);
String user1 = scanner.nextLine();
System.out.println("請輸入密碼");
String password1 = scanner.nextLine();
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/myjdbc01";
String user = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url, user, password);
//获取预编译sql语句的对象
//使用占位符号 ?
//使用占位符不用加单引号
String sql = "select * from users where username=? and password=?";
PreparedStatement statement = connection.prepareStatement(sql);
//设置占位符的值 下面给占位符赋值;
//参数1 : 问号的索引, 从1开始;
//参数2: 替换问号的值;
statement.setObject(1, user1);
statement.setObject(2,password1);
//执行sql语句
ResultSet resulute= statement.executeQuery();
//处理结果街
while (resulute.next()) {
System.out.println(resulute.getString("username")+" "+resulute.getString("password"));
}
}
}
5.修改数据; 使用preparedStatement 修改id为1的数据;
public class Demo05修改数据 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/myjdbc01";
String user = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url, user, password);
String sql = "update goods set sname=?,sprice=? where sid =1 ";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setObject(1, "充气娃娃");
statement.setObject(2, 100);
int row = statement.executeUpdate();
System.out.println("受影响的行数" + row);
connection.close();
statement.close();
}
}
6. 链接工具类:
public class JDBCUitl {
// 声明链接的属性成员变量;
private static Connection connection;
// 私有化构造方法;
private JDBCUitl() {
// TODO Auto-generated constructor stub
}
// 使用静态态代码块
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// 注册失败没有执行下去的意义
// 直接抛出运行异常;
throw new RuntimeException("数据库加载失败");
}
}
// 提供get方法获取链接使用
// 将可能使用到的时候,利用配置文件;proprites;
// 驱动类 url user password ;
public static Connection getConnection() {
String url = "jdbc:mysql://localhost:3306/myjdbc01";
String user = "root";
String password = "123456";
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
throw new RuntimeException("数据库链接异常");
}
return connection;
}
// 关闭资源
// 将需要关闭的资源当做参数穿进去;
public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet) {
// 判断不为空再关闭;
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}