答:Java DataBase Connectivity. jdbc是java提供给数据库厂商的接口,实现了接口的数据库就可以通过jdbc api与java代码连接. 使用jdbc,通过相应的数据库驱动与数据库连接后,就可以使用jdbc执行sql语句,操作数据库. jdbc将数据库与java代码隔离开,这样即使更换了数据库,也只需要更改注册的驱动,而不需要更改其他的java代码.
一号:DriverManger.register(new com.mysql.jdbc.Driver()); 二号:Class.from(“com.mysql.jdbc.Driver”); - 答:在com.mysql.jdbc.Driver这个类中,存在一个静态代码块,在静态代码块中就已经执行了一号代码. - 当Driver类被加载进内存时,就会执行一遍静态代码块,也就执行了一次一号代码. - 所以如果在注册驱动时直接使用一号代码,一号代码中new Driver()的操作就会加载Driver类,加载的时候又执行了一次一号代码. - 这样实际上就注册了两次,浪费内存,所以推荐使用二号代码.
1,execute()方法的返回值:
如果执行sql语句得到了结果集,则返回true;如果得到的是受影响的行数或什么也没得到,则返回false;(也可以直接说没得到结果集返回false,只不过前面的说法能表明你知道执行sql还能得到什么)2,executeUpdate()方法的返回值:
执行sql语句后,数据库中受影响的行数3,executeQuery()方法的返回值:
是一个ResultSet对象,执行查询语句后得到的结果就被封装在这个ResultSet对象中.即使什么都没查到,ResultSet对象也不为null,只是该对象中没有内容而已.1,防止SQL注入:如果接收用户传递过来的参数,通过statement对象执行的sql语句为下面的:
String sql = "select * from user where name='"+name+"'";而用户输入的name参数为下面的:
String name="k' or '1'='1'";那么执行该sql语句就可以查询到user表中的所有内容,这显然跳出了我们的安全限制,这种操作就叫做SQL注入.
PrepareStatement对象可以防止SQL注入,因为该对象会将接收到的参数,不管参数中是否含有单引号等会影响sql语句结构的符号,都将该参数作为一个整体与name这个判断条件判断.原理是PrepareStatement会将’转义成\’2,PrepareStatement对象采取的是预编译形式,会先将sql语句编译好交给数据库,执行的时候就直接执行可以了,方便更改参数复用,效率高速度快,而Statement每次执行都会重新编译一次sql语句.
主要就记住这两句话:
1,父类的引用指向了子类的对象
2,一个对象可以有多种表现形态1)BeanHandler: 查询返回单个对象 2)BeanListHandler: 查询返回list集合,集合元素是指定的对象 3) ArrayHandler, 查询返回结果记录的第一行,封装对对象数组, 即返回:Object[] 4) ArrayListHandler, 把查询的每一行都封装为对象数组,再添加到list集合中 5) ScalarHandler (通常单行单列的时候用) 6) MapHandler 查询返回结果的第一条记录封装为map
query方法接收的是ResultSetHandler接口类型的对象,这使得我们可以传入不同的该接口的实现类对象,这样就可以根据我们的需求传入参数,也就是说这个接口是我们与query方法之间的协议,约定,当我们传入的对象实现了ResultSetHandler接口时,QueryRunner就能帮我们将结果集中的数据封装起来,返回给我们,而且因为这里是接口的引用作为参数,那么我们也可以自定义一个类T实现ResultSetHandler接口,将T的对象传入进去,如何操作ResultSet中的数据,我们可以写在T类复写的handle方法中,这也就是ResultSetHandler接口提供给我们的可扩展性.