JDBC编程
JDBC概念
JDBC是Java DataBase Connectivity的缩写,即Java程序访问数据库的标准接口。JDBC是由Sun公司开发的操作所有关系型数据库的规则(接口)。数据库厂商实现这套接口,提供数据库驱动jar包。
访问某个具体数据库时,只需引入特定的JDBC驱动,就可通过JDBC接口访问。这样保证了,一套Java代码,可以访问不同数据库。
快速入门
1.下载并导入jar包
下载地址:下载jar包
复制下载好的驱动jar包到项目libs目录下,邮件libs选择Add As Library
或者直接添加Maven依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connnector-java</artifactId>
<version>5.1.47</version>
<scope>runtime</scope>
</dependency>
2.注册驱动
Class.forname("com.mysql.jdbc.Driver");
3.获取数据库连接对象 Connection
Connection conn =DriverManager.getConnection("jdbc:mysql://localhost:3306/db3","root","password");
4.定义sql
String sql="update account set balance=500 where id=1";
5.获取执行sql语句的对象Statement
Statement stmt=conn.createStatement(sql);
6.执行sql,接受返回结果
int count=stmt.executeUpdate(sql);
7.处理结果
System.out.println(count);
8.释放资源
stmt.close();
conn.close():
DriverManager
驱动管理对象-功能1:注册驱动
DriverManager存在静态方法registerDriver(Driver driver)用来注册。通常情况下,通过class.forName(“com.mysql.jdbc.Driver”)注册驱动,注册时首先将com.mysql.jdbc.Driver加载如内存,com.mysql.jdbc.Driver类中存在如下的静态代码块用来注册驱动。
注意:在mysql5版本之后,无需注册驱动。mysql可以自动注册驱动
功能2-获取数据库连接
static Connection getConnection(String url,Stirng user,String password)
#url 指定连接的路径
jdbc:mysql://ip地址:端口号/数据库名称
如果连接的是本机mysql服务器(端口号3306)上述路径可以简写为
jdbc:///数据库名称
#user 用户名
#password 密码
Connection
数据库连接对象–功能1:获取执行sql的对象
Statement createStatement()
PreparedStatement prepareStatement(String sql)
功能2:管理事务
//开启事务(参数为false时开启事务)
setAutoCommit(boolean atuoCommit)
//提交事务
commit()
//回滚事务
rollback()
Statement
执行sql的对象:用于执行静态SQL语句并返回其生成的结果的对象。
功能1:执行sql
//可以执行任意的sql
boolean execute(String sql)
//执行DML(insert,update,delete)语句,DDL(create,alter,drop)语句
int executeUpdate(String sql)
#返回值:影响的行数
//执行DQL(select)语句
ResultSet executeQuery(String sql)
ResultSet
结果集对象
next() //游标向下移动一行,判断当前行是否是最后一行(是否有数据),如果是,则返回false,如果不是则返回true。相当于迭代器的hasnext()next()结合体
getXXX()(参数)//int getInt(),String getString()
参数(1)int,代表列的编号,从1开始(2)String 代表列名称
注意:使用步骤(1)游标向下移动一行(2)判断是否有数据(3)获取数据
preparedStatement
*执行sql的对象 *表示预编译的SQL语句的对象(动态SQL)
sql注入问题在拼接sql时,有一些sql的特殊关键字参与字符串拼接,会造成安全性问题。
select * from user where username=‘a’ and password =‘a’ or ‘a’=‘a’
解决方法:使用preparedstatement对象
参数使用?作为占位符。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = scanner.nextLine();
System.out.println("请输入密码");
String password = scanner.nextLine();
boolean flag = new Demo06().login(username, password);
if (flag==true){
System.out.println("登录成功" );
}else{
System.out.println("登录失败");
}
}
/*
* 登录方法
* */
public boolean login(String username,String password){
if (username==null||password==null){
return false;
}
Connection conn=null;
PreparedStatement preparedStatement=null;
ResultSet rs=null;
try {
conn = JDBCUtils.getConnection();
//定义sql,参数使用?作为占位符
String sql="select * from user where username=? and password=?";
//获取执行sql的对象(传入sql对象)
preparedStatement = conn.prepareStatement(sql);
//给?赋值
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
//执行查询,不需要传递sql
rs = preparedStatement.executeQuery();
return rs.next();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(rs,preparedStatement,conn);
}
return false;
}
增加记录
public static void main(String[] args){
Connection connection=null;
Statement statement=null;
try{
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.定义sql
String sql="insert into table1 values(null,'赵敏',15,70,null,null)"
//3.获取connection对象
connection=DriverManager.getConnection("jdbc:mysql:///student","root","root")
//4.获取sql执行对象
statement=connection.creatStatement();
//5.执行sql
int count=statement.executeUpadte(sql);
//6.处理结果
if(count>0){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}finally{
//7.释放资源
if(statement!=null){
try{
statement.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(connection!=null){
try{
connection.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
修改记录
public static void main(String[] args) throws Exception {
//1.导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/student", "root", "921100");
//4.定义sql语句
String sql="update student set score=90 where id=1";
//5.获取执行sql的对象 Statement
Statement statement = connection.createStatement();
//6.执行sql
int count = statement.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
statement.close();
connection.close();
}
查询记录
public static void main(String[] args){
Connection connection=null;
Statement statement=null;
ResultSet resultSet=null;
try {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2,定义sql
String sql="select * from student";
//3.获取connection对象l
connection = DriverManager.getConnection("jdbc:mysql:///student","root","921100");
//4.获取sql执行对象
statement = connection.createStatement();
//5.执行sql
resultSet = statement.executeQuery(sql);
//6.光标向下移动一行
while( resultSet.next()) {
//7.获取数据
int age = resultSet.getInt("age");
String name = resultSet.getString("name");
System.out.println(name + "--------" + age);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
//7,释放资源
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JDBC控制事务
事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这个步骤要么同时成功,要么同时失败
在执行sql之前开启事务
setAutoCommit(boolean autoCommit) //调用该方法设置参数为false,即开启事务
当所有sql都执行完提交事务
commit()
在catch代码块中回滚事务
catch()