jsp学习 jdbc访问数据库
因为我目前在学校有一门课程叫做javaweb,其中涉及到JavaScript中进行数据库访问的测试,经过学习发现与我们之前通过配置数据源结合spring提供的模板以及mybatis提供的方法进行数据库的操作不同的是,java的jdbc相关还是很值得学习的,但是代码耦合度太高,重复性太高,不适合项目开发。
数据库表jsp.user
自建一个jdbc.jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.sql.*" %> <html> <head> <title>Title</title> </head> <body> <% int sno; String sname; String clazz; String sql = "select * from jsp.user"; Class.forName("com.mysql.jdbc.Driver"); Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp", "root", "123456"); PreparedStatement preparedStatement = root.prepareStatement(sql); System.out.println(prepardStatement); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { sno = resultSet.getInt("sno"); sname = resultSet.getString("sname"); clazz = resultSet.getString("clazz"); System.out.println("User{" + "sno=" + sno + ", sname=" + sname + + ", clazz=" + clazz + + }); } preparedStatement.close(); root.close(); %> </body> </html>
分析一下代码:
jdbc获取数据库连接connection创建SQL会话对象(PreparedStatement与Statement)的三部曲:
1、加载数据库驱动,这里利用反射的原理获取一系列关于Driver的API(注意导入驱动的坐标,如果在pom里导入成功,在外部库里可以看到这个maven依赖项的存在)
Class.forName("com.mysql.jdbc.Driver");
2、利用DriverManger的getConnection方法获取数据库连接对象root(图片显示的是getConnection方法的源码,需要的三个参数:URL,user,password)
Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp", "root", "123456");
3、创建sql会话对象preparedStatement(注意这个动态的preparedStatement类它的父类其实是Statement) PreparedStatement preparedStatement = root.prepareStatement(sql);
这里的sql语句就是自定义的String字符串了。
总结:
jdbc访问数据库的基本步骤(参考我上面的jdbc.jsp代码):
- 加载数据库驱动 Class.forName
- 获取数据连接对象 DriverManager.getConnection
- 获取sql会话对象root.prepareStatement
- 执行sql语句preparedStatement.executeQuery
- 处理返回的结果集resultset
- 关闭资源
我们使用mybatis访问数据库时的三板斧与jdbc访问数据库的三部曲之间的对比:
InputStream resourceAsStream = Resources.getResourceAsStream("config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession session = sqlSessionFactory.openSession(); config配置文件的关键代码: <properties resource="jdbc.properties"/> <typeAliases> <typeAlias type="com.hlc.pojo.User" alias="user"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> 数据源类型选择池化 <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments>
Class.forName("com.mysql.jdbc.Driver"); Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp", "root", "123456"); PreparedStatement preparedStatement = root.prepareStatement(sql);
用连接池与不用连接池到底有什么区别?在我个人看来,每一次加载驱动的方式只能用于少量的数据库连接操作中,如果有很多的数据库访问呢?耦合量惊人,代码量也会增加很多。