JDBC

来源:互联网 发布:网络侦探 2周目 彩蛋 编辑:程序博客网 时间:2024/06/05 02:00
JDBC
* 1.JDBC: java语言操作各种数据库的技术
* JDBC由一堆接口和类组成
* 类: DriverManger,用于注册驱动
* 接口:
* Connection:数据库连接类的根接口
* Statement:数据库语句执行类的根接口
* ResultSet:结果集类的根接口
* 以上接口的实+现类,在驱动包中
* 2.JDBC和具体数据库的驱动,他们是接口和实现类的关系
* ·
* 3.[重点]原生JDBC开发的步骤
* 0.向工程中导入具体的数据库驱动包
* 1.注册驱动 Class.forName()
* DriverManger.register(new com.mysql.jdbc.Driver());//注册两次
* Class.forName("com.mysql.jdbc.Driver");
*
* com.mysql.jdbc.Driver" 数据库驱动类
* 2.连接数据库,获取连接对象(四大要素:驱动,连接串,用户名,密码)
* Connection conn = DriverManager.getConnection();
* 前提:必须有驱动
* Connection conn = DriverManager.getConnection(
* "jdbc:mysql://ip地址:3306/数据库名","用户名","密码"
* );
* mysql: jdbc:mysql://localhost:3306/day04或者jdbc:mysql:///day04(默认本机连接)
* 3.获取sql语句执行对象 Statement对象 Statement stmt = conn.createStatement();
* Statement st = conn.createStatement();
* PreparedStatement pst = conn.prepareStatement(String sql);
* pst.setObject("占位符序号","具体的参数值");
*
* 4.使用执行对象执行sql语句,获取到结果集
* ResultSet rs = st.excuteQuery(sql);
* ResultSet rs = pst.excuteQuery();
*
* 5.处理结果集
* rs.next();//判断有没有下一条记录
* rs.getObject("字段名");//rs.getObject(字段对应的序号);
*
* 6.释放资源
* rs.close(),st.close,conn.close()
*
* 4.[重点]
* JDBCUtils.java工具类
* //先定义4个字符串,数据库操作中的四大要素
* //这个工具类,主要为我们获取一个数据库连接
* private static String driverName = "com.mysql.jdbc.Driver";
* private static String url = "jdbc:mysql://localhost:3306/day04";
* private static String username = "root";
* private static String password = "123";
* //在静态代码块中注册驱动
* static{
* Class.forName(driverName);
* }
*
* //获取连接
* public static Connection getConnection(){
* return DriverManger.getConnection(url,username,password);
* }
*
* //关闭资源
* public static void closeAll(Connection conn,Statement st,ResultSet rs){
* //先判断是否为空
* //如果不为空关闭
*


连接池
* 所有连接池必须满足 javax.sql.DataSource规范
* 1.DBCP连接池
DBCP(DataBase connection pool)数据库连接池。是apache上的一个 java连接池项目,也是 tomcat使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。dbcp没有自动的去回收空闲连接的功能。
* 实现类: BasicDataSource implements javax.sql.DataSource
* 使用方式一:不借助配置文件
* BasicDataSource ds = new BasicDataSource();//没有连接的连接池
* //设置数据库连接的四大要素
* ds.setDriverClassName("com.mysql.jdbc.Driver");
* ds.setUrl("jdbc:mysql://localhost:3306/数据库名");
* ds.setUsername("root");
* ds.setPassword("123");
* 只要你设置了四大要素,那么ds连接池 自动就会去缓存几个连接对象
* //获取连接
* ds.getConnection();
DBCP工具类
private static String driverName = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/day04";
private static String username = "root";
private static String password = "ROOT";
private static BasicDataSource ds = new BasicDataSource();
static{
ds.setDriverClassName(driverName);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
}
public static DataSource getDataSource(){
return ds;
}
public static Connection getConnection(){
return ds.getConnection();
}
* 使用方式二:借助配置文件 用properties配置文件
* 注意:配置文件名,可以随便起,一般叫做dbcpconfig.properties
* 配置文件的内容:(必须有的四大要素)
* driverClassName=com.mysql.jdbc.Driver
* url=jdbc:mysql://localhost:3306/day04
* username=root
* password=123
* #<!-- 初始化连接 -->
* initialSize=10

* 使用方式三(推荐):
* 不需要解析dbcpconfig.properties文件
* 用到一个核心类: BasicDataSourceFactory
* DataSource ds = BasicDataSourceFactory.createDataSource(Properties对象);
* 然后直接使用
* ds.getConnection();
private static DataSource ds = null;
static{
try {
Properties ps = new Properties();
// ps.load(new FileInputStream("dbcpconfig.properties"));
ps.load(DBCPUtils02.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));
ds = BasicDataSourceFactory.createDataSource(ps);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
public static Connection getConnection() throws SQLException{
return ds.getConnection();
}

* 补充:
* 加载配置文件的两种方式:
* 1.配置文件在工程的根目录
* Properties ps = new Properties();
* ps.load(new FileInputStream("配置文件名"));
* 2.配置文件在src根目录
* Properties ps = new Properties();
* InputStream in = 当期类.class.getClassLoader().getResourceAsStream("配置文件名");
* ps.load(in);

* 2.C3P0连接池
C3P0是一个开源的jdbc连接池,它实现了数据源和jndi绑定,支持jdbc3规范和jdbc2的标准扩展。c3p0是异步操作的,缓慢的jdbc操作通过帮助进程完成。扩展这些操作可以有效的提升性能。目前使用它的开源项目有Hibernate,Spring等。c3p0有自动回收空闲连接功能。
* * 实现类: ComboPooledDataSource implments javax.sql.DataSource
* 方式一: 自己设置四大要素
* ComboPooledDataSource ds = new ComboPooledDataSource();
* ds.setDriverClass("com.mysql.jdbc.Driver");
* ds.setJdbcUrl("jdbc:mysql://localhost:3306/数据库名");
* ds.setUser("root");
* ds.setPassword("123");
* 获取使用
* ds.getConnection();
* 方式二:基于XML配置文件
* 注意:
* 1.文件名和文件中标签名 必须是官方指定的
* 2.必须放到src根目录下,C3P0的实现类ComboPooledDataSource会自动加载
* 使用
* ComboPooledDataSource ds = new ComboPooledDataSource();
* //不需要设置四大要素,因为ds会自动去加载 src下一个叫做次c3p0-config.xml的文件
* ds.getConnection();
* public static DataSource getDataSource(){
return ds; //返回datasource 用于DButils中
QueryRunner qr = new QueryRunner(MyUtils.getDataSource()); 公有的得到数据源的方法
}

C3P0工具类
1.创建私有静态数据源(连接池对象)成员变量
ComboPooledDataSource ds = new ComboPooledDataSource();
2.创建公有的得到数据源(连接池对象)的方法
public static DataSource getDataSource(){
return ds;
}
3.创建共有的得到连接对象的方法
public static Connection getConnection(){
return ds.getConnection();
}
4.创建共有的关闭资源的方法
public static void close(){}
* 3.DBUtils:阿帕奇的common框架
* DBUtils:主要用于 关闭连接,释放资源,和事务相关
* QueryRunner: 主要用于 增删改查 CURD
* int update(String sql,Object... params);//用于增删改
* 不一定 query(String sql,ResultSetHandler接口实现类对象 ,Object...params);//用于查询的
*
* ResultSetHandler:
* (Object[])ArrayHandler:把结果集中的第一条记录,封装成Object[],返回这个Object数组
* (List<Object[]>)ArrayListHandler:把结果集中每一条记录,分别封装成Object数组,把这个数组再封装到集合中,并返回集合
* *(JavaBean)BeanHandler:把结果集中的第一条记录,封装到JavaBean对象,返回这个对象
* new BeanHandler<JavaBean>(JavaBean.class)
* *(List<JavaBean>)BeanListHandler:把结果集中每一条记录,分别封装到JavaBean对象,把这些对象保存到集合中,并返回这个集合
*
* (List<Object>)ColumnListHandler:把结果集中的某一列的值,封装到list集合中,并返回
*
* (Map<String,Object>)MapHandler:把结果集中的第一条记录,封装到Map<String,Object>中
* 键是字段名,值是字段值
* (List<Map<String,Object>>)MapListHandler:把结果集中的每一条记录,封装到Map<String,Object>中
* 键是字段名,值是字段值,再把这个Map存储到集合中,并返回这个集合
* *(Object)ScalarHandler:主要用来保存单一数据
* new ScalarHandler<Double>();
* QueryRunner的使用步骤:
* //1.创建QueryRunner对象
* QueryRunner qr = new QueryRunner();//无参构造,在执行时候必须传入连接,用于事务开发
* QueryRunner qr = new QueryRunner(new ComboPooledDataSource);//有参
* //2.执行sql
* qr.update();//增删改
* qr.query();//查询
* //3.不需要我们手动关系连接,sql执行对象,结果集


*

原创粉丝点击