JDBC:java database connectivity java连接数据库。
sun公司定义了操作了所有关系型数据库的规则(接口)。
使用统一java代码,可以操作所有的关系型数据库。
每个数据库厂商都实现接口,提供数据库驱动jar包,真正执行的代码是驱动jar包中的实现类。
步骤:
1、导入驱动jar包
建目录->粘包->add as Library
2、注册驱动(可以不写)
3、获取数据库的连接对象Connection
4、定义sql
5、获取执行sql语句的对象 Statement
6.执行sql,执行返回结果
7、处理结果
8、释放资源
DriveManager:驱动管理对象
功能:
注册驱动(告诉程序应该使用哪一个数据库驱动jar包)
static void registerDriver(Driver driver):注册给定的驱动程序DriveManager
写法:Class.forName("com.mysql.jdbc.Driver");
原理:通过查看源码,发现在com.mysql.jdbc.Driver存在静态代码块,调用了DriveManager的registerDriver方法
(mysql 5后不需要注册驱动,自动注册驱动,建议写上)
获取数据库连接
static Connection getConnection(String url,String user,String password)
url:指定连接的路径
语法:jdbc:mysql://ip地址:端口号/数据库名称
如果连接的是本机的mysql服务器,并且mysql服务默认端口3306.则url可简写为:
jdbc:mysql:///数据库名称
Connection:数据库连接对象
获取执行sql的对象:
Statement createStatement()
PrepareStatement prepareStatement(String sql)
管理事务:
*开启事务
setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
*提交事务
commit()
*回滚事务
rollback()
Statement:用于执行静态sql语句
执行sql:
int executeUpdate(String sql):执行DML(insert,update,delete)语句,DDL(创建,删除)语句
返回值:影响的行数
可以通过影响的行数判断DML语句是否成功(>0)
ResultaSet executeQuery(String sql):执行DQL(select)语句
ResultSet:结果集对象,封装查询结果
游标一开始在表头位置
boolean next():游标向下移动一行,判断是否有数据
getXxx():获取数据。Xxx代表数据类型
getInt,getString,get....
参数:
传入int 代表列的编号(从1开始)
传入String 代表列的名称 getString("sex")
ResultSet遍历:
JDBC工具类:JDBCUtils(简化书写)
public class JDBCUtils { private static String url; private static String user; private static String password; //配置文件只读取一次,静态代码块 static{ //读取资源文件,获取值 Properties properties=new Properties(); //加载文件 try { properties.load(new FileReader("src/jdbc.properties")); url=properties.getProperty("url"); user=properties.getProperty("user"); password=properties.getProperty("password"); } catch (IOException e) { e.printStackTrace(); } } //获取连接 public static Connection getConnection() { try { return DriverManager.getConnection(url,user,password); } catch (SQLException e) { e.printStackTrace(); } return null; } //释放资源 public static void close(Statement st,Connection ct){ if(st!=null){ try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if(ct!=null){ try { ct.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(ResultSet rs,Statement st,Connection ct){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } close(st,ct); } }
PreparedStatement:执行sql对象
SQL注入问题:
在拼接sql时,有一些sql特殊的关键字参与字符串的拼接,会造成安全问题
解决:使用PreparedStatement表示对象,执行预编译的sql语句(参数使用?作为占位符)
定义时sql参数使用?作为占位符
select *from user where username = ? and password = ?
获取执行sql语句的对象
PrepareStatement pre=Connection.prepareStatement(String sql);
给?赋值:
setXxx(参数1,参数2) //参数1:?位置 //参数2:?值
执行sql:不需要传递sql
注意:后期都会使用preparedstatement进行增删改查。