黑马程序员技术交流社区
标题:
【石家庄校区】day10JDBC的概述
[打印本页]
作者:
奔跑的蜗牛006
时间:
2018-5-21 15:04
标题:
【石家庄校区】day10JDBC的概述
本帖最后由 奔跑的蜗牛006 于 2018-5-21 15:05 编辑
JDBC的概述
JDBC:java数据库连接,是一种执行SQL语句的javaAPI.
JDBC是以后学习框架的基础;
驱动数据库:
驱动:两个设备(应用之间通信的桥梁)
JDBC的入门:
驱动都是以Jar包引入
1.创建数据库
2.创建项目,引入Jar包
3.JDBC代码
加载驱动---DriverManager源代码中static代码块中注册驱动了,不需要手动再注册.
获得连接---(java和数据库建立连接)
PreparedStatement之CRUD的步骤:
//导入jar包
//创建工具类JDBCUtils
//创建配置文件(key=value)
//创建Test测试类(增删改查CRUD),查询与其他三个不太一样.
1. 创建工具类Utils
@Test
public void demo1() {
//定义变量
private static final String driverClassName;
private static final String url;
private static final String username;
private static final String password;
static{
//创建配置文件对象
Properties properties = new Properties();
try{
//加载配置文件,找到配置文件位置
properties.load(new FileInputStream("src/db.properties"));
}catch(FileNotFoundException e){
e.printStackTrace();
}
//获得变量,通过key获得value
driverClassName=properties.getProperty("driverClassName");
url=properties.getProperty("url");
username=properties.getProperty("username");
password=properties.getProperty("password");
}
//注册驱动的方法
public static void loadDriver(){
try{
Class.forName("driverClassName");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
//获得连接的方法
public static Connection getConnection(){
//定义连接
Collection conn=null;
try{
//调用注册驱动的方法
loadDriver();
//获得连接
conn=DriverManager.getConnection(url,username,password);
}catch(Exception e){
e.printStackTrace();
}
return conn;
}
//释放资源方法
public static void release(Statement stmt,Connection conn){
if(stmt!=null){
try{
stmt.close();
}catch(SQLException e){
e.printStackTrace();
}
stmt=null;
}
if(conn!=null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
conn=null;
}
}
//查询使用---方法重载ResultSet结果集
public static void release(ResultSet rs,Statement stmt,Connection conn){
if(rs!=null){
rs.close();
}catch(SQLException e){
e.printStackTrace();
}
rs=null;
}
//后边还有两个方法跟上边的一样就不写了.
}
2.PreparedStatement之CURD的保存操作,执行SQL使用executeUpdate(),查询操作用executeQuery()
@Test
public void demo1{
//定义对象
Connection conn=null;
PreparedStatemnt pstmt=null;
try{
//调用自建的工具类获得连接
conn=JDBCUtils.getConnection();
//编写SQL---values加空格
String sql="insert into user values (null,?,?,?,?)";
//获得操作SQL的对象---预编译+sql
pstmt=conn.prepareStatement(sql);
//设置参数
pstmt.setString(1,"eee");
pstmt.setString(2,"ddd");
pstmt.setString(3,"旺财");
pstmt.setInt(4,34);
//执行SQL,影响的行数
int num=pstmt.executeUpdate();
//判断
if(num>0){
System.out.println("保存成功!")
}else{
System.out.println("保存失败!")
}
}catch(Exception e){
e.printStackTrace();
}finally{
//调用方法释放资源
JDBCUtils.release(pstmt,conn);
}
}
3 . 提取配置文件. db.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/web_test3 ---(locakhost:3306是本机地址,可以省略)
username=root ---用户名
password=123 ---数据库密码
开发中: 对扩展是开放的,对修改源码是关闭的.
工具类中使用静态方法是可以直接用类名+方法名调用,而非静态方法需要创建对象才可以调用.
先使用静态定义变量,然后再静态代码块赋值.
解耦合:static静态代码块配置信息提取到外部配置文件
配置文件格式: 扩展名是.properties
属性文件 内容key(变量名)=value(赋值)
XML文件
提取配置文件步骤:
内容key(变量名)=value(赋值)
创建属性文件对象
加载.load文件,文件输入流(文件在哪)
获得变量: 对象 .getPropery
演示SQL注入漏洞(statement不行)
1. '用户名' or 1=1 or或者的意思
2. 'aaa' -- ---把密码注释掉了
解决漏洞:
PreparedStatement
?代表变量,设置参数1代表第一个?,2代表第二个?
preparedStatement保存的步骤:
获得连接
编写SQL语句(where后用?代替变量)
预编译SQL,获得操作SQL对象(使用preparedStatement)传入sql
设置参数setString/Int()
执行SQL语句(括号中不再加sql)
打印查询数据(遍历),使用列名(变量名),如果有别名,就用别名替代.
查询需要ResultSet结果集,需要遍历(while,问自己有没有下一个),查询使用excuteQuery()
while(rs.next()){ System.out.println(rs.getInt("id")+rs.getString("username")+rs.getString("password")+rs.getInt("age")+rs.getString("nickname"));
}
增删改CRUD不需要ResultSet,执行SQL使用executeUpdate()
Statement 和 Preparedment的区别:(面试中)
1.Preparedment有预编译的步骤
2.Statement有注入漏洞
编写SQL模糊查询:String sql="select*from user where nickname like ?";
设置参数:pstmt.setString(1,"%小%");---&写在这里
JDBC的批量处理操作:
批量插入
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2