几种常用数据库的连接,以及Dao层的实现。
1、加载JDBC驱动:
1 加载JDBC驱动,并将其注册到DriverManager中: 2 //MySQL数据库 3 Class.forName("com.mysql.jdbc.Driver").newInstance(); 4 //Oracle数据库 5 Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); 6 //Sql Server数据库 7 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); 8 //DB2数据库 9 Class.froName("com.ibm.db2.jdbc.app.DB2Driver").newInstance(); 10 //Informix数据库 11 Class.forName("com.informix.jdbc.IfxDriver").newInstance(); 12 //Sybase数据库 13 Class.forName("com.sybase.jdbc.SybDriver").newInstance(); 14 //PostgreSQL数据库 15 Class.forNaem("org.postgresql.Driver").newInstance();
2、建立数据库连接:
1 //MySQL数据库//后接字符格式防止中文乱码 2 String url="jdbc:mysql://localhost:3306/test?user=root&password=123456&useUnicode=true&characterEncoding=utf-8"; 3 Connection conn=DriverManager.getConnection(url); 4 5 //Oracle数据库 6 String url="jdbc:oracle:thin:@localhost:1521:orcl"; 7 String user="scott"; 8 String password="tiger"; 9 Connection conn=DriverManager.getConnection(url,user,password); 10 11 //Sql Server数据库 12 String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"; 13 String user="admin"; 14 String password="123456"; 15 Connection conn=DriverManager.getConnection(url,user,password); 16 17 //DB2数据库 18 String url="jdbc:db2://localhost:5000/sample"; 19 String user="amdin" 20 String password=-"123456"; 21 Connection conn=DriverManager.getConnection(url,user,password); 22 23 //Informix数据库 24 String url="jdbc:informix-sqli://localhost:1533/testDB:INFORMIXSERVER=myserver;user=username;password=123456"; 25 Connection conn=DriverManager.getConnection(url); 26 27 //Sybase数据库 28 String url="jdbc:sybase:Tds:localhost:5007/tsdata"; 29 Properties sysProps=System.getProperties(); 30 SysProps.put("user","userid"); 31 SysProps.put("password","password"); 32 Connection conn=DriverManager.getConnection(url,SysProps); 33 34 //PostgreSQL数据库 35 String url="jdbc:postgresql://localhost/test"; 36 String user="myuser"; 37 String password="123456"; 38 Connection conn=DriverManager.getConnection(url,user,password);
3、建立Statement对象或PreparedStatement对象:
<!-- PreparedStatement是预编译的,继承自Statement。如果带有不同参数的同一SQL语句被多次执行的时候,PreparedStatement对象比Statement对象更有效。实际上,在多数时候都建议使用PreparedStatement来代替Statement,这是因为每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用。所以语句在被DB的编译器编译后的执行代码被缓存下来,下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行。而Statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配。-->
1 //建立Statement对象 2 String sql="select * from user where userName="+username; 3 Statement stmt=conn.createStatement(sql); 4 //建立ProparedStatement对象 5 String sql="select * from user where userName=?"; 6 PreparedStatement pstmt=Conn.prepareStatement(sql); 7 pstmt.setString(1,"admin");
4、执行sql语句:
1 //执行SQL查询 2 String sql1="select * from users"; 3 ResultSet rs=stmt.executeQuery(sql); 5 6 //执行insert update delete等语句 7 String sql2="delete from users where id=?"; 8 pstmt.setString(1, id);9 pstmt.executeUpdate(sql);
5、执行完毕后,依将关闭ResultSet、Statement、PreparedStatement、Connection对象,释放所占用的资源:
1 rs.close(); // 2 stmt.close(); 3 pstmt.close(); 4 con.close();
以上就是整个数据库连接的完整步骤。下面是我做的数据库工厂例子,返回一个数据库连接对象
(当然,你首先得导入对应数据库的连接包,此处以MySql数据库为例)
1 package com.db; 2 3 import java.io.InputStream; 4 import java.sql.Connection; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 import java.util.Properties; 9 10 import javax.sql.DataSource;11 12 import org.apache.commons.dbcp.BasicDataSourceFactory;13 14 public class DbcpDb {15 private static DataSource ds=null;16 17 static 18 {19 20 try {21 InputStream in=DbcpDb.class.getClassLoader().22 getResourceAsStream("dbcpconfig.properties");//加载配置23 Properties prop=new Properties();24 prop.load(in);25 BasicDataSourceFactory factory=new BasicDataSourceFactory();//工厂模式26 ds=factory.createDataSource(prop);//将配置传递给Datasource工厂27 }catch (Exception e) {28 // TODO Auto-generated catch block29 e.printStackTrace();30 throw new RuntimeException(e.getMessage());31 }32 33 }34 35 public static Connection getConnection() throws SQLException {36 return ds.getConnection();37 38 }39 40 public static void close(Connection con,PreparedStatement pstmt,ResultSet rs) {41 try {42 if(rs!=null)43 rs.close();44 } catch (SQLException e) {45 // TODO Auto-generated catch block46 e.printStackTrace();47 }48 try {49 if(pstmt!=null)50 pstmt.close();51 } catch (SQLException e) {52 // TODO Auto-generated catch block53 e.printStackTrace();54 }55 try {56 if(con!=null)57 con.close();58 } catch (SQLException e) {59 // TODO Auto-generated catch block60 e.printStackTrace();61 }62 }6364 }
使用配置文件是一种良好的编程习惯,避免了数据库配置与代码的硬耦合,以下是数据库配置文件("dbcpconfig.properties"):
1 #连接设置 2 driverClassName=com.mysql.jdbc.Driver 3 url=jdbc\:mysql\://localhost\:3306/test 4 username=root 5 password=123456 6 7 # 8 initialSize=10 9 # 10 maxActive=5011 # 12 maxIdle=2013 # 14 minIdle=515 # 16 maxWait=6000017 18 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 19 #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。20 connectionProperties=useUnicode=true;characterEncoding=utf821 22 #指定由连接池所创建的连接的自动提交(auto-commit)状态。23 defaultAutoCommit=true24 25 #driver default 指定由连接池所创建的连接的只读(read-only)状态。26 #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)27 defaultReadOnly=28 29 #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。30 #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE31 defaultTransactionIsolation=READ_COMMITTED
dao层事例
1 package com.dao; 2 3 import java.io.Serializable; 4 import java.util.List; 5 6 public interface BaseDao{ 7 8 public boolean save(T entity); 9 10 public boolean update(T entity);11 12 public boolean delete(T entity);13 14 public T findById(Serializable id);15 16 public List findByHql(String hql,Object...params);17 18 public List findByPage(String hql,int pageNo,int pageSize,Object...params);19 20 public int getCount(String hql,Object...params);21 22 }
dao的实现层
省。