一.回想
还记得以前自学的时候,刚接触到数据库,讲解的连接数据库的最基本的理论知识和方法,现在温习一下基础知识并总结如下!
1.JDBC连接数据库的基本流程
加载JDBC驱动程序 —> 提供JDBC连接的URL,ROOT,PASSWORD —> 连接数据库 —> 获取Statement相关类 —> 完成增删改 —> 关闭JDBC的相关对象
2.详细
①JDBC的驱动程序的加载
网上有说到JDBC加载驱动程序有4种方法,但是不太明白。这里用java的反射来完成驱动程序的加载。但是前提是需要相应的jar包才能成功加载
maven配置jar包:
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
<scope>runtime</scope>
</dependency>
mysql的驱动:com.mysql.jdbc.Driver
oracle的驱动:oracle.jdbc.driver.OracleDriver
for example:
Class.forName(com.mysql.jdbc.Driver);//初始化jdbc驱动,并加载相应的驱动到jvm中
②连接数据库
这里使用的是java SE API 提供的DriverManager类来获得连接的Connection接口
mysql的url:jdbc:mysql://localhost:3306/test(数据库名)
oracle的url:jdbc:oracle:thin:@localhost:1521:test(数据库名)
for example:
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String passwd = "root"; Connection connection = DriverManager.getConnection(url,user,passwd);
可以配置properties文件通过流获取
for example:
jdbc.properties文件内容(键值对的形式):
url:jdbc:mysql://localhost:3306/test
user:root
passwd:root
获取:
InputStream in = this.getClass().getResourceASStream("/jdbc.properties");
Properties p = new Properties();
p.load(in);
String url = p.getProperty("url");
String user = p.getProperty("user");
String passwd = p.getProperty("passwd");
③获取Statement相关类进行增删改
Interface Statement(只能用于执行静态代码+拼接):
方法:boolean execute(String sql);
int executeUpdate(String sql);//可执行增删改
ResultSet executeQuery(String sql);//执行查询功能
Statement statement = connection.createStatement();
//boolean flag = statement.executeUpdate("update table1 set name = 'xl' where id = 1");//增删改用executeUpdate方法
ResultSet resultSet = statement.executeQuery("select * from table1");//查询使用executeQuery方法 返回ResultSet
while(resultSet.next()){
System.out.print(resultSet.getObject(1)+"---"+resultSet.getObject(2));
//System.out.print(resultSet.getString(1)++"---"+resultSet.getDate(2));
}
Interface PreparedStatement(可以执行动态代码):
方法:boolean execute();
int executeUpdate();//可执行增删改
ResultSet executeQuery();//执行查询功能
String sql = "update test set name = ? where id = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1,"ssx");
ps.setInt(2,1);
ps.execute();
另外,可由ResultSet 获得接口ResultSetMetadate(使用getMetaDate()方法)
方法:String getCatalogName(int column) 获取表名
int getColumnCount() :获取结果集的列数
String getColumnLabel(int column) :获取相应列的列名
3.封装jdbc
可以参看这里:写的很好
二.通过JNDI配置数据库信息(Spring)
JNDI:
- JNDI(Java Naming and Directory Interface) java命名和目录服务接口
- 降低程序和程序之间的耦合性
- 降低设备和设备的耦合性
- Tomcat服务器实现了JNDI服务,启动Tomcat服务器,等同于启动JNDI服务器
- JNDI是SUN制定的一套规范,这套规范可以和JDBC进行类比,JDBC也是一套规范,我们面向JDBC接口调用就可以获取数据库中的数据。同样,我们面向JNDI接口调用,可以获取“资源”,这个资源不是在底层数据库中。
- JNDI提供了一种服务,这个服务可以将“名称”和“资源”进行绑定,然后程序员通过面向JNDI接口调用方法lookup可以查找到相关的资源。
1.在tomcat目录下的conf/context.xml中配置如下:
<Resource name="jdbc/microDB" auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/micro_dev?characterEncoding=UTF-8"
username="root"
password="root"
maxActive="50"
maxIdle="30"
maxWait="10000"/>
2.在spring的配置文件中配置如下(applicationContext.xml):
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/microDB</value>
</property>
</bean>
3.在项目的根目录下的web.xml中配置如下:
<resource-ref>
<description>DHCP数据库连接池</description>
<res-ref-name>jdbc/microDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
4.编写测试连接
public class PropertyConnDateBase {
public static void test(){
Connection conn = null;
Context context = null;
try {
context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/microDB");
conn = ds.getConnection();
System.out.println(conn);
}catch (Exception e){
e.printStackTrace();
}finally { }
}
}
5.在jsp页面中测试
<%PropertyConnDateBase.test();%>
6.在后台可以看到打印成功;
**:不能通过在main方法中获取到jndi的连接来测试,这个jndi可能必须要在服务器开启的情况下才能获取到上下文context,main属于一个静态的方法,会报错没有初始化的context。