1.Jdbc的使用
1.简述
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行sql语句的Java API。可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范
**总结:**JDBC是java提供给开发人员的一套操作数据库的接口
数据库驱动就是实现该接口的实现类
2.原理
- Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动
- DBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!
- 每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。
3.开发步骤
1.注册驱动
2.获得连接
3.获得语句执行平台
4.执行sql语句
5.处理结果
6.释放资源
一堆close()
4.实例
1.获得连接
//1.注册驱动 反射技术,将驱动类加入到内容
// 使用java.sql.DriverManager类静态方法 registerDriver(Driver driver)
// diver是一个接口,参数传递,MysqL驱动程序中的实现类
//DriverManager.registerDriver(new Driver());
//驱动类源代码,注册2次驱动程序
Class.forName("com.MysqL.jdbc.Driver");
//2.获得数据库连接 DriverManager类中静态方法
//static Connection getConnection(String url, String user, String password)
//返回值是Connection接口的实现类,在MysqL驱动程序
//url: 数据库地址 jdbc:MysqL://连接主机IP:端口号//数据库名字
String url = "jdbc:MysqL://localhost:3296/mybase";
String username="root";
String password="123";
Connection con = DriverManager.getConnection(url, username, password);
//3.获得语句执行平台, 通过数据库连接对象,获取到sql语句的执行者对象
// con对象调用方法 Statement createStatement() 获取Statement对象,将sql语句发送到数据库
// 返回值是 Statement接口的实现类对象,,在MysqL驱动程序
Statement stat = con.createStatement();
System.out.println(stat);
}
2.执行结果
//intsert操作
// 返回值int,操作成功数据表多少行
int row = stat.executeUpdate
("INSERT INTO sort(sname,sprice,sdesc) VALUES('汽车用品',50000,'疯狂涨价')");
System.out.println(row);
//6.释放资源 一堆close()
stat.close();
con.close();
//select操作
String sql = "SELECT * FROM sort";
//4. 调用执行者对象方法,执行sql语句获取结果集
// ResultSet executeQuery(String sql) 执行sql语句中的select查询
// 返回值ResultSet接口的实现类对象,实现类在MysqL驱动中
ResultSet rs = stat.executeQuery(sql);
//5 .处理结果集
// ResultSet接口方法 boolean next() 返回true,有结果集,返回false没有结果集
while(rs.next()){
//获取每列数据,使用是ResultSet接口的方法 getXX方法参数中,建议写String列名
System.out.println(rs.getInt("sid")+" "+rs.getString("sname")+
" "+rs.getDouble("sprice")+" "+rs.getString("sdesc"));
}
rs.close();
stat.close();
con.close();
5.sql注入攻击
SELECT * FROM 用户表 WHERE NAME = 用户输入的用户名 AND PASSWORD = 用户输的密码;
此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录。
但是当用户输入的账号为XXX 密码为:XXX’ OR ‘a’=’a时,则真正执行的代码变为:
SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’ OR ’a’=’a’;
此时,上述查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是sql注入问题。
6.PrepareStatement
1.预处理对象
使用PreparedStatement预处理对象时,建议每条sql语句所有的实际参数,都使用逗号分隔。
String sql = “insert into sort(sid,sname) values(?,?)”;;
PreparedStatement预处理对象代码:
PreparedStatement psmt = conn.prepareStatement(sql)
int executeUpdate(); --执行insert update delete语句.
ResultSet executeQuery(); --执行select语句.
boolean execute(); --执行select返回true 执行其他的语句返回false.
c: 设置实际参数
void setXxx(int index, Xxx xx) 将指定参数设置为给定Java的xx值。在将此值发送到数据库时,驱动程序将它转换成一个 sql Xxx类型值。
例如:
setString(2, “家用电器”) 把sql语句中第2个位置的占位符? 替换成实际参数 “家用电器”
2.实际处理
Class.forName("com.MysqL.jdbc.Driver");
String url = "jdbc:MysqL://localhost:3296/mybase";
String username="root";
String password="123";
Connection con = DriverManager.getConnection(url, username, password);
String sql = "SELECT * FROM sort";
PreparedStatement pst = con.prepareStatement(sql);
//调用pst对象的方法,执行查询语句,Select
ResultSet rs=pst.executeQuery();
while(rs.next()){
System.out.println(rs.getString("sid")+" "+rs.getString("sname")+" "+rs.getString("sprice")+" "+rs.getString("sdesc"));
}
rs.close();
pst.close();
con.close();
3.通过配置文件连接
FileInputStream fis = new FileInputStream("database.properties");
System.out.println(fis);
//使用类的加载器
InputStream in = PropertiesDemo.class.getClassLoader().getResourceAsstream("database.properties");
System.out.println(in);
Properties pro = new Properties();
pro.load(in);
//获取集合中的键值对
String driverClass=pro.getProperty("driverClass");
String url = pro.getProperty("url");
String username = pro.getProperty("username");
String password = pro.getProperty("password");
Class.forName(driverClass);
Connection con = DriverManager.getConnection(url, username, password);
System.out.println(con);