jdbc数据库连接步骤(jdbc访问数据库的基本步骤)

jdbc数据库连接步骤(jdbc访问数据库的基本步骤)

松鼠叨叨叨

我记得当时学完javaweb的时候,老师要求用MVC模式模仿淘宝商城写一个简单的demo,其中只包括用户的登录注册,加入购物车、提交订单等功能,那时候jdbc、servlet等等全部要自己写,而且还不是前后端分离的,提交表单也是用的form提交然后到serlvet接收处理数据然后再转发或重定向。

简单的图就是这样的(少了service层)

怎么说呢,当时的感觉就是重复代码很多,过程很繁琐,如果可以写一个工具帮助我们完成重复的工作那就太好了。(如果跟我有相同经历的伙伴应该会很有感触)

于是后面接触了一些框架,持久层的框架现在用的多的有Mybatis、Mybatis-plus、Hibernate、还有spring-data-jpa等等,你会发现新的框架层出不穷,而且越来越好用,很多数据操作它内部封装好的方法就够用了,而且还比你自己想的要更加全面,连抛异常都很完善。(果然大佬永远都是大佬,可以造工具的那种…>_<)

框架好用,但原始的Jdbc连接数据库步骤你还记得吗?

有的伙伴肯定会问,我都有这么好用的框架,它不香么?为啥还要学这么古老的方式去操作数据库呢,松鼠觉得框架的产生往往就是解决像我前面说的种种不方便和繁琐的工作,那么既然是这样如果能搞懂以前没有框架的时候是怎么连接数据库并操作的,你就会更加理解框架香在哪里,到底给咱们带来了什么样的方便。

闲话就这么多,我们开始切入正题

大家其实看这个模板的步骤过程大体上就明白了:

jdbc数据库连接步骤(jdbc访问数据库的基本步骤)

松鼠敲敲敲

那么我们就根据上面的模板先写一个简单的demo吧。我这里用的是mysql数据库首先需要导入数据库的驱动包:mysql-connector-java用maven管理的话直接添加坐标:<!–数据库连接驱动–> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.21</version> </dependency>然后我们需要写一个实体类方便等会儿接收参数:我测试的数据库表:

public class User{ Integer id; Integer age; String name; //省略get set 和tostring方法 }那么接下来只需要按照步骤来就可以了:public class JdbcTest { public static void main(String[] args) throws ClassNotFoundException, SQLException {//声明数据库驱动,数据源的url,用于登录数据库的账户和密码(将其他功能封装成方法的时候方便使用) String driver = “com.mysql.jdbc.Driver”; String url = “jdbc:mysql://127.0.0.1:3306/test”; String user = “root”; String pwd = “root”;//加载数据库驱动 Class.forName(driver);//根据url创建数据库连接对象Connection Connection con = DriverManager.getConnection(url,user,pwd); //用数据库连接对象创建Statement对象(或PrepareStatement) String sql=”select * from user”; PreparedStatement ps = con.prepareStatement(sql);//做数据库的增删改查工作 ResultSet rs = ps.executeQuery(); if(rs==null){ System.out.println(“该表数据为kong”); } while(rs.next()){ User myUser=new User(); myUser.setId(rs.getInt(“id”)); myUser.setAge(rs.getInt(“age”)); myUser.setName(rs.getString(“name”)); System.out.println(myUser.toString()); } //关闭结果集对象 rs.close(); ps.close();con.close(); }}

查询的结果:

你看,我们每对数据库做一次操作就需要写这么一大串代码是不是很麻烦?其实真正在变化的就是sql语句和对数据库做的增删改查操作,其他的连接数据库信息、加载驱动,连接数据库对象、关闭结果集对象、异常处理的工作,基本上都是重复的工作。我们完全没必要每次都写。记得当时没有框架的解决办法就是,将连接数据库的信息单独放在一个配置文件里,将加载数据库的驱动、连接数据库,释放资源的操作提取成一个静态工具类,在dao层使用的时候直接用类名 方法名调用即可。怎么抽取呢?往下看:首先创建jdbc.properties文件:db.driverClassName=com.mysql.jdbc.Driverdb.url=jdbc:mysql://127.0.0.1:3306/testdb.username=rootdb.password=root

然后抽取工具类:

public class JDBCUtils { //思路:方便对数据库的使用,省去了大量的创建连接数据库使用语句 //基本步骤 //1.对基本的语句抽取成静态代码块 //2.创建连接的方法 //创建销毁的方法 private static String driverClass; private static String url; private static String username; private static String password; static { try { Properties properties= new Properties(); properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream(“jdbc.properties”)); driverClass = properties.getProperty(“db.driverClassName”); url = properties.getProperty(“db.url”); username= properties.getProperty(“db.username”); password= properties.getProperty(“db.password”); Class.forName(driverClass); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection() { Connection connection = null; try { connection = DriverManager.getConnection(url, username, password); } catch (Exception e) { e.printStackTrace(); } return connection; } public static void release(Connection connection, Statement statement, ResultSet resultSet) { try { if (connection != null) { connection.close(); } if (statement != null) { statement.close(); } if (resultSet != null) { resultSet.close(); } } catch (Exception e) { e.printStackTrace(); } }//这里我做了一个重载 public static void release(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) { try { if (connection != null) { connection.close(); } if (preparedStatement != null) { preparedStatement.close(); } if (resultSet != null) { resultSet.close(); } } catch (Exception e) { e.printStackTrace(); } }}

测试刚才的查询表单:

//模拟dao层的实现public class JdbcUtilTest { public static void main(String[] args) throws SQLException { //查询所有 Connection conn = JDBCUtils.getConnection(); String sql = “select * from user”; PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); if(rs==null){ System.out.println(“该表数据为kong”); } while(rs.next()){ User myUser=new User(); myUser.setId(rs.getInt(“id”)); myUser.setAge(rs.getInt(“age”)); myUser.setName(rs.getString(“name”)); System.out.println(myUser.toString()); } JDBCUtils.release(conn,ps,rs); }}

最后的结果是一样的:

欧克,这样写你会发现代码变简洁了但实际上还是有诸多不便:连接数据库的操作和关闭实际上还是我们自己手动放在dao中,而且查出来的数据需要手动的get,set,万一表单数据贼多,那岂不是很麻烦……所以说,框架真香~当然你还可以再写好一点:用一个连接池放一些连接数据库的connection

发表评论

登录后才能评论