JDBC编程的六步(导入jar包) 1.注册驱动:通知Java程序我们即将要连接的是哪个品牌的数据库 使用反射或者利用类 功能:1.注册驱动:Class.forName("com.mysql.jdbc.Driver"); 或DriverManager.registerDriver(Driver.driver);注册驱动 java5以后可以省略这个包,所谓驱动就是导入不同的规范,这个规范时不同的数据库厂家为了使用JDBC而定义的标准 DriverManager 2.获取数据库连接对象(Connection不能直接执行sql):Java进程和MySQL进程两个进程之间的通道开启了 使用DriverManager提供的getConnection(String url,String user,String password)获取 各个参数代表的含义: url:指定连接的路径 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称 例子:jdbc;mysql://localhost:3306/school 如果连接的是本机mysql服务器。并且mysql服务默认接口是3306,则url可以简写成jdbc;mysql:///school user:用户名 password:密码 Connection: 功能: 1.获取执行sql的对象: Statement createStatement(); 2.PrepareStatement prepareStatement(String sql) 2.管理事务: 开启事务:setAutoComit(boolean autoComit);调用方法设置参数为false,即开启事务 提交事务:comit() 回滚事务:rollback() 3.获取数据库操作对象(statement或prepareStatement):这个对象很重要,用这个对象执行SQL语句 Statement:用于执行静态SQL语句并返回其生成的结果对象 PreparedStatement:用于执行动态SQL语句并返回其生成的结果对象 1.通过connection的createStatement()方法获取statement对象, 2.通过prepareStatement(String sql)可以执行动态sql,防止出现sql注入问题,安全性更高,该方法中传递的产生即为要执行的sql代码 4.执行SQL语句:执行crud操作 因为statement(或prepareStatement)是执行sql语句的对象,所以调用相关方法即可成功执行 statement对象提供的三个主要的方法: 1.boolean execute(String sql):调用该方法设置参数为false,即开启事务 2.int executeUpdate(String sql):执行DML(insert、update、delete)语句、DDL(create,alter,drop)语句 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功,返回值>0的执行成功,反之,则失败 3.ResultSet executeQuery(String sql):执行DQL语句(select语句),返回一个ResultSet ResultSet:结果集对象 理解(数据库我们需要掌握基本的增删改查,增删改我们执行完成以后只是对数据表的的数据进行了修改,不需要返回一个结果集合,如果我们需要要查看数据只需要查看表,或者执行select语句,当我们执行select语句的时候就需要返回一个结果集,这个结果集就是ResultSet,我们需要查看集合中的东西就需要用相关的方法对该集合进行遍历,理解了这个逻辑,我们就能理解,为什么执行增删改我们用的是executeUpdate方法,而执行查我们单独使用executeQuery方法) 5.处理查询结果:如果第四步是select语句,才有第五步 当我们执行sql语句执行的是select时,我们如果想获得结果就一定要对结果集进行操作,ResultSet提供了两个方法对结果集合进行遍历 1.next();游标向下移动一行,判断当前行是否是最后一行末尾 2. get***(参数);获取一列的数据 参数:1.可以接受int类型的数据,代表列的编号,从1开始 2.可以接受String类型的数据,代表列的名称,如getString("sNum"); 使用get方法时要注意的两个点“ 1.get后面所对应的类型一定要和字段的类型相对应 2.使用第二种重载方式传入的参数一定要和字段名对应 使用:1.游标向下移动一行 2.判断是否有数据 3.获取数据 6.释放资源:关闭所有的资源
学习完了上面的知识我们来看一个简单的代码test1
public class test1 {
public static void main(String[] args) throws Exception{
//1.导入驱动jar包,复制对应的jar加入到文件夹,add as library
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/school","root","answerme1");
//4.定义sql语句,该语句用于修改列的约束
String sql=" alter table student change column sgrade sGrade int default '80'";
//5.获取执行sql的对象statement
Statement stmt = conn.createStatement();
//6.执行sql
stmt.executeUpdate(sql);//因为我们执行的是修改语句,并不需要返回一个结果集,所以省略了处理结果的步骤
//7.释放资源
stmt.close();
conn.close();
}
}
上述代码在加载驱动的时候调用getConnection(),方法的时候传入的参数太长,我们一般不会这样使用,我们一般会定义三个字符串,给字符串赋值以后传入该方法
关于prepareStatement对象的介绍
我们来实现一下这样的场景——模拟登录
//核心的代码如下
//用户输入学号与姓名,然后利用sql语句经行查找,看看是否存在这样的人
Scanner sc =new Scanner(System.in);
Scanner sc1 =new Scanner(System.in);
System.out.println("请输入你的学号");
int snum=sc.nextInt();
System.out.println("请输入你的姓名");
String sname=sc1.nextLine();
//sql语句
String sql ="select * from student where sNum = '"+snum+"' and sName = '"+sname+"'"; //注意字符串的拼接,因为snum和sname都不是一个值,而是一个变量,所以我们需要使用字符串的拼接
resultset rs=statement.executeQuery();
if(rs.next())
System.out.println("登录成功");
else
System.out.println("登录失败");
//我们在登录的时候如果输入的用户名类似于xxx or a ==a时就会出现sql注入问题,这个情况会导致
任何一个用户都可以登录成功,这样的现象被称为sql注入问题
为了解决上面的sql注入问题,我们引入prepareStatement来执行sql语句
步骤: 1.导入jar包 2.注册驱动 3.获取数据库连接对象 4.定义sql,sql的参数使用?作为占位符,如:select * from user where username = ? and passward = ?; 5.获取执行sql语句的对象preparedstatement 6.给?赋值,setXXX(),参数1:?的位置编号从1开始,参数2:?的值 7.执行sql 8.处理结果 9.资源释放
//Sql语句使用占位符来占位,防止了因为与逻辑表达式冲突造成的错误,
String sql ="select * from student where sNum = ? and sName = ?";
pre = con.prepareStatement(sql);
//通过相关的set方法,为占位符设置值,注意set方法中的参数第一个表示位置,从1开始,第二个表示要传入的值
pre.setInt(1,snum);
pre.setString(2,sname);