您好,欢迎访问一九零五行业门户网

原生JDBC的开发步骤和介绍

导包:将需要的jar包复制到项目名下的新建的lib文件夹中,
    jdbc的原生开发步骤
  1、注册驱动
  2、获得连接
  3、获得执行者对象
  4、获得结果集
  5、结果集处理
  6、释放资源
jdbc
java database connectivity,java数据库连接,是一种用于执行sql语句的java api。
jdbc是java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用java语言编写的接口和类组成。
驱动
jdbc需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
jdbc规范(掌握四个核心对象)
drivermanager:用于注册驱动
connection: 表示与数据库创建的连接
statement: 操作数据库sql语句的对象
resultset: 结果集或一张虚拟表
使用jdbc技术,通过mysql提供的驱动程序,操作数据库实现步骤:
1.注册驱动
告知jvm我们使用的是什么驱动程序(mysql,oracle....)
drivermanager.registerdriver(new com.mysql.jdbc.driver());不建议使用
原因有2个:
>导致驱动被注册2次。
>强烈依赖数据库的驱动jar
解决办法:
class.forname(com.mysql.jdbc.driver);
2.获取数据库的连接
数据库是tcp程序服务器,连接服务器(通过3次握手)
就相当于建立了一条java程序通往数据库服务器的连接通路
static connection getconnection(string url, string user, string password)
试图建立到给定数据库 url 的连接。
参数说明:url 需要连接数据库的位置(网址) user用户名  password 密码
例如:getconnection(jdbc:mysql://localhost:3306/day06, root, root);
url:sun公司与数据库厂商之间的一种协议。
jdbc:mysql://localhost:3306/day06
协议子协议  ip :端口号数据库
mysql: jdbc:mysql://localhost:3306/day04或者jdbc:mysql:///day14(默认本机连接)
oracle数据库: jdbc:oracle:thin:@localhost:1521:sid
3.获取执行者对象
执行sql语句的对象,作用就是执行sql
接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象的。
statement  createstatement(); //创建操作sql语句的对象
4.执行sql语句,获取结果集
使用执行者对象执行sql语句
获取sql语句的结果集(增删改:整数,执行有效行数  查询:返回的就是一个结果集)
常用方法:
? int executeupdate(string sql); --执行insert update delete语句.
? resultset executequery(string sql); --执行select语句.
? boolean execute(string sql); --仅当执行select并且有结果时才返回true,执行其他的语句返回false.
5.处理结果集
resultset实际上就是一张二维的表格,我们可以调用其boolean next()方法指向某行记录,当第一次调用next()方法时,便指向第一行记录的位置,这时就可以使用resultset提供的getxxx(int col)方法(与索引从0开始不同个,列从1开始)来获取指定列的数据:
rs.next();//指向第一行
rs.getint(1);//获取第一行第一列的数据
常用方法:
? object getobject(int index) / object getobject(string name) 获得任意对象
? string getstring(int index)/ string getstring(string name) 获得字符串
? int getint(int index)/int getint(string name) 获得整形
? double getdouble(int index)/ double getdouble(string name) 获得双精度浮点型
6.释放资源
与io流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。
使用jdbc对数据库进行增删改查代码演示:
  1 public static void main(string[] args) throws exception {  2         //1.注册驱动  3         class.forname(com.mysql.jdbc.driver);  4         //2.获取数据库连接  5         string url = jdbc:mysql://localhost:3306/mybase4;  6         string user = root;  7         string password = root;    8         connection conn = drivermanager.getconnection(url, user, password);  9         //3.获取执行者对象 10         statement stat = conn.createstatement(); 11         //调用更新数据的方法 12         //update(stat); 13         //调用删除数据的方法 14         //delete(stat); 15         //调用增加数据的方法 16         //insert(stat); 17         //调用查询数据的方法 18         select(stat); 19         //6.释放资源 20         stat.close(); 21         conn.close(); 22     } 23  24     /* 25      * 使用jdbc技术,查询数据库中表的数据 26      */ 27     private static void select(statement stat) throws exception { 28         //拼接sql语句 29         string sql = select * from category; 30         /* 31          * 4.执行sql语句 32          * 使用statement中的方法 33          * resultset executequery(string sql) 执行给定的 sql 语句,该语句返回单个 resultset 对象。   34          * 返回值resultset标准接口的实现类对象,实现类对象由mysql驱动提供,可以使用resultset接口接收 35          */ 36         resultset rs = stat.executequery(sql); 37         system.out.println(rs);//com.mysql.jdbc.jdbc4resultset@1acb189 38         /* 39          * 5.处理结果 40          * resultset中有一个方法 41          * boolean next() 将光标从当前位置向前移一行。 42          * 如果新的当前行有效,则返回 true;如果不存在下一行,则返回 false   43          * 如果有结果集返回true,若果没有结果集返回false 44          * 相当于迭代器中的hasnext方法 45          */ 46         while(rs.next()){ 47             /* 48              * next返回true,有结果集 49              * 取出结果集 50              * 使用resultset中的方法getxxx(参数); 51              * 参数: 52              *     int columnindex:列所在的索引,从1开始 53              *     string columnlabel:列名 54              * 注意: 55              *     如果使用getint,getdouble指定数据类型的方法,返回值就是对应的数据类型 56              *     如果使用getobject方法返回值是object类型(只是打印可用) 57              * 如果使用getstring方法返回值是string类型 58              */ 59             /*int i1 = rs.getint(1); 60             string s2 = rs.getstring(2); 61             system.out.println(i1+\t+s2);*/ 62              63             //system.out.println(rs.getobject(1)+\t+rs.getobject(2)); 64             system.out.println(rs.getobject(cid)+\t+rs.getobject(cname)); 65             //5.释放资源 66             rs.close(); 67         } 68     } 69  70     /* 71      * 使用jdbc技术,对数据库中的表数据进行增加 72      */ 73     private static void insert(statement stat) throws sqlexception { 74         //拼接sql语句 75         string sql = insert into category(cname) values('玩具'); 76         //4.执行sql语句 77         int row = stat.executeupdate(sql); 78         //5.处理结果 79         if(row>0){ 80             system.out.println(增加数据成功!); 81         }else{ 82             system.out.println(增加数据失败!); 83         } 84          85     } 86  87     /* 88      * 使用jdbc技术,对数据库中的表数据进行删除 89      */ 90     private static void delete(statement stat) throws exception { 91         //拼接sql语句 92         string sql = delete from category where cid=5; 93         //4.执行sql语句 94         int row = stat.executeupdate(sql); 95         //5.处理结果 96         if(row>0){ 97             system.out.println(删除数据成功!); 98         }else{ 99             system.out.println(删除数据失败!);100         }101     }102 103     /*104      * 使用jdbc技术,对数据库中的表数据进行更新105      */106     private static void update(statement stat) throws exception {107         //拼接sql语句108         string sql = update category set cname='鞋帽' where cid=6;109         //4.执行sql语句110         int row = stat.executeupdate(sql);111         //5.处理结果112         if(row>0){113             system.out.println(更新数据成功!);114         }else{115             system.out.println(更新数据失败!);116         }117     }
1 jdbc工具类 2 “获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类jdbcutils。提供获取连接对象的方法,从而达到代码的重复利用。 3 代码演示: 4 public class jdbcutils { 5      6     //私有构造方法,防止外界创建对象调用方法 7     private jdbcutils() { 8     } 9     10     //定义connectionn变量11     private static connection conn;12     13     //保证代码只执行一次,可以放入静态代码块中14     static{15         try {16             //注册驱动17             class.forname(com.mysql.jdbc.driver);18             //获取连接19             string url=jdbc:mysql://127.0.0.1:3306/mybase4;20             string user=root;21             string password = root;22             conn = drivermanager.getconnection(url, user, password);23         } catch (exception e) {24             //注意,如果连接数据库失败,停止程序25             throw new runtimeexception(e+连接数据库失败);26         }27     }28     29     //创建一个静态方法,获取数据库连接对象,并返回30     public static connection getconnection(){31         return conn;32     }33     34     /*35      * 创建一个静态方法,对资源进行释放36      * resultset rs37      * statement stat38      * connection conn39      */40     public static void close(resultset rs,statement stat,connection conn){41         try {42             if(rs!=null){43                 rs.close();44             }45         } catch (sqlexception e) {46             e.printstacktrace();47         }48         try {49             if(stat!=null){50                 stat.close();51             }52         } catch (sqlexception e) {53             e.printstacktrace();54         }55         try {56             if(conn!=null){57                 conn.close();58             }59         } catch (sqlexception e) {60             e.printstacktrace();61         }62     }63 }
sql注入问题
sql注入:用户输入的内容作为了sql语句语法的一部分,改变了原有sql真正的意义。
假设有登录案例sql语句如下:
select * from 用户表 where name = 用户输入的用户名 and password = 用户输的密码;
此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录。但是当用户输入的账号为xxx 密码为:xxx’  or ‘a’=’a时,则真正执行的代码变为:
select * from 用户表 where name = ‘xxx’ and password =’ xxx’  or ’a’=’a’;
此时,上述查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是sql注入问题。
为此,我们使用preparedstatement来解决对应的问题。
preparedstatement:预编译对象,是statement对象的子类。
特点:
性能高
会把sql语句先编译
能过滤掉用户输入的关键字。
preparedstatement预处理对象,处理的每条sql语句中所有的实际参数,都必须使用占位符?替换。
string sql = select * from user where username = ? and password = ?;
preparedstatement使用,需要通过以下3步骤完成:
1.preparedstatement预处理对象代码:
获得预处理对象,需要提供已经使用占位符处理后的sql语句
preparedstatement psmt = conn.preparestatement(sql)
2.设置实际参数
void setxxx(int index, xxx xx) 将指定参数设置指定类型的值
参数1:index 实际参数序列号,从1开始。
参数2:xxx 实际参数值,xxx表示具体的类型。
例如:
setstring(2, 1234) 把sql语句中第2个位置的占位符?替换成实际参数 1234
3.执行sql语句:
int executeupdate(); --执行insert update delete语句.
resultset executequery(); --执行select语句.
boolean execute(); --执行select返回true 执行其他的语句返回false.
以上就是原生jdbc的开发步骤和介绍的详细内容。
其它类似信息

推荐信息