JDBC是Java连接数据库的一套接口,可以让我们方便的在Java中使用数据库。掌握JDBC的使用是Java开发的基本功。
预备工作导入jar包。根据使用的数据库软件导入相应的jar包。idea相应设置中添加。
代码部分(MySQL为例) // 1.加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.从驱动管理器获取JDBC连接对象 Connection conn = DriverManager.getConnection("数据库连接地址","帐号","密码"); /******************************************************************** * 连接地址基本格式--> 主协议:子协议://ip地址:端口号/数据库名称 * * mysql的连接地址--> jdbc:mysql://localhost:3306/mydatabase * * oracle的连接地址--> jdbc:oracle:thin:@localhost:1521:ORCL * ********************************************************************/ // 3.从连接对象获取SQL执行环境 Statement state = conn.createStatement(); // 4.执行SQL语句 state.execute("SQL语句"); // 5.释放资源 state.close(); conn.close();JDBC中的方法说明
Statement //此方法将会执行SQL语句,如果是查询语句返回ture否则返回false boolean execute(String sql); //此方法执行DML和DDL语句,int返回值代表影响行数(准确的说,是筛选条件选中的行数) int executeUpdate(String sql); //执行查询语句,查询结果以集合形式返回 ResultSet executeQuery(String sql); /*ResultSet的行为相当于带头节点的链表,最开始指针指向头节点,而不是第一行数据*/ ResultSet //调用一次,指针向下一行移动,如果下一行不存在函数返回false boolean next(); //其他移动方式 boolean privious(); boolean absolute(int row); boolean beforeFirst(); boolean afterLast(); //获取行字段,XXX是字段的类型 XXX getXXX(String columnLabel); //columnLabel是字段名 XXX getXXX(int columnIndex); //columnIndex是字段索引,从1开始 SQL参数问题--注入问题在实际项目中,SQL的参数一定是以变量形式传入,将变量放入SQL语句中最直接的方法就是字符串拼接。
public void setName(String id,String newName){ ... state.executeUpdate("update students set s_name='" + newName + "' where s_id='" + id + "'"); }<!>请注意
-- 上面的代码看上去没有任何问题,比如传入参数23和"张飞",就能把id为23的同学名字改为"张飞" -- 对应生成的SQL语句为 update students set where sid='23' -- 当id == "1' or '1'='1"时,拼接的语句会是什么? update students set where sid='1' or '1'='1' -- 这句SQL的顾虑条件变成了恒为true的表达式!执行这句SQL将会把所有学生名字改为'张飞' -- 这不是我们想要的结果,拼接后改变了原本的语义。这就是注入问题 预编译解决SQL注入问题 //参数用?代替 PreparedStatement state = conn.prepareStatement("update students set name=? where sid=?"); //设置参数,参数索引从1开始 state.setString(1,"张飞"); state.setString(2,"1' or '1'='1"); //预编译的SQL不会被改变语义,"1' or '1'='1"仅作为参数被传递 state.execute(); 使用事务当我们遇到类似于转账业务时,需要使用业务保障转账的安全性。资金从一个账户转移到另一个账户,两个账户数据的改变必须同时成功或失败,否则可能出现资金凭空消失或凭空增加的情况!
//conn是获得的数据库连接对象 conn.setAutoCommit(false); //开启事务 conn.rollback(); //回滚事务 conn.commit(); //提交事务 /*在try-catch块中,出现异常时应回滚事务,并在finally中释放资源*/ JDBC进阶--DAO设计模式DAO(Data Access Object)是数据访问接口。DAO模式就是将数据库操作于业务逻辑解耦合,提高程序的扩展性。
典型的DAO实现具备四个部件
DAO接口。业务逻辑所面向的接口,与具体实现无关。
DAO接口的实现类,定义了具体与如何操作数据库。
数据传递对象。业务代码从DAO拿到的数据不应该是ResultSet对象,而是根据业务重新封装的合适对象。
DAO的工厂类。业务从工厂获得DAO实例,实现了业务与数据库操作的进一步解耦合。
JDBC进阶--连接池连接池和多线程中的线程池相似。使用了动态代理和装饰者模式,使得极大减少了数据库的重复连接,提高了数据库使用性能。此外连接池顺便把类加载、连接地址登录的步骤和连接参数设定封装起来,参数从代码中分离到properties文件当中。
知识点补充:使用 .properties 文件作为配置文件properties文件是以键值对文本方式存储数据。Java中有对应的Properties类专门用于读取properties文件的内容。Properties是Map集合的一个具体实现。具体操作方式如下:
//将配置文件druid.properties放到src文件夹下 public class Demo{ public static void main(String[] args) throws Exception { Properties ppt = new Properties(); //将properties文件作为输入流,通过.load()方法从流中将数据读入集合中。 InputStream is = Demo.class.getClassLoader().getResourceAsStream("druid.properties"); ppt.load(is); } } 连接池使用
准备工作,导入jar包。
将 properties配置文件 放到src文件夹下