JavaWeb基础(1):JDBC

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/H_Targaryen/article/details/82823543

(一)JDBC

(1)简介

  • JDBC:Java Database Connection
    • 用于执行SQL语句的Java API
    • 可以连接MySQl、Orcale数据库

(2)基本操作

  • 一个典型的查询数据库表的操作
	public void f1() throws ClassNotFoundException,java.sql.SQLException {
		//注册驱动
		Class.forName("com.mysql.jdbc.Driver");

		//获取连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456");

		//创建语句执行
		String sql = "select * from category";

		//设置参数
		PreparedStatement st = conn.prepareStatement(sql);

		//执行SQL
		ResultSet rs = st.executeQuery();

		//处理结果
		while(rs.next()){
			System.out.println(rs.getString("cid") + ":" + rs.getString("cname"));
		}

		//释放资源
		rs.close();
		st.close();
		conn.close();

	}

(3)API

  • DriverManager:用于管理JDBC驱动的基本服务
//DriverManager的getConnection方法:
public static Connection getConnection(String url,
                                       String user,
                                       String password)
                                throws SQLException
								
URL: 协议:数据库类型 参数
	例如:jdbc:mysql://localhost:3306/test
user:数据库用户名
password:密码
  • Connection:连接(Interface)
    • createStatement()
    • prepareStatement(String sql) 获取预编译语句执行者
  • Statement 语句执行者(可能会诱发SQL注入)
  • PreparedStatement
    • setXXX(参数index,对应参数) :给PreparedStatement对象设置参数
    • executeQuery() :返回值为ResultSet对象(返回查询的具体结果)
    • executeUpdate() :返回值为int类型(执行结果affect的row数)
  • ResultSet
    • next():返回值为boolean类型,如果有下一条记录,则移动光标。常用于循环体判断条件
    • getint(int n):返回第n列
    • getString(String s):返回字段名的值
    • getObject():可以获取任意值

(4)工具类使用

  • 将字符创常量放在.properties文件(.properties文件放在src目录下)中,然后使用ResourceBundle类每次去提取字符创变量对应的值,这样在项目中修改用户名以及密码等字符串值的时候比较方便
    • 这种操作也体现了面向对象中的封装思想
  • ResourceBundle
    • getBundle(“properties文件名”):返回值为ResourceBundle对象

(1)dbutils

JavaBean是一个遵循特定写法的Java类:有一个无参的构造函数,属性私有化并且通过public方法访问和修改属性

  • dbutils
    • 封装了JDBC代码的工具包,简化Dao层操作
    • 需要导入的包:commons-dbutils-1.6.jar
    • 核心类是QueryRunner类
		QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource()); //创建QueryRunner对象,传参为一个ComboPooledDataSource对象
		String sql = "insert into category values(?,?)";
		qr.update(sql,"c013","商品7"); //执行sql语句
  • QueryRunner
    • 构造方法:new QueryRunner(DataSource ds);
    • update(sql,参数1,参数2):执行SQL语句

(5)连接池

  • 连接池
    • 概念:连接池初始化时存入一些连接,要使用的时候获取,使用完成之后归还连接
    • 数据库创建连接是消耗资源的操作,如果对每个请求向数据库请求连接效率很低
    • 使用Pool维持连接的思想和线程池非常相似
  • 常用连接池
    • DBCP
    • C3P0

(1) DBCP

  • DBCP:Database Connection Pool
    • Apache上的Java连接池
    • 需要导入的包:commons-dbcp.jar,commons-pool.jar
		Properties prop = new Properties();
		prop.load(new FileInputStream("src/dbcp.properties")); //在dbcp.properties中配置属性
		DataSource ds = new BasicDataSourceFactory().createDataSource(prop); //生成一个连接池
		Connection conn = ds.getConnection(); //获取一个连接

(2)C3P0

  • Hibernate、Spring使用c3p0
    • 需要导入jar包比如:c3p0-0.9.1.2.jar
    • 在src目录下配置c3p0.properties文件或者使用c3p0-config.xml配置文件
  • c3p0.properties文件:
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql:///test //数据库名称
c3p0.user=root //用户名
c3p0.password=123456 //密码
  • 获取连接的方式
		ComboPooledDataSource ds = new ComboPooledDataSource(); //连接池
		Connection conn = ds.getConnection(); //获取连接

(6)装饰者模式

  • 装饰者模式
    • 23种设计模式之一
    • 不改变原类中的方法
    • 创建一个包装类Wrapper,包装原来的类,动态的扩展一个对象的功能
    • 包装类和原类都继承自同一个类或者实现了同一个接口

猜你喜欢

转载自blog.csdn.net/H_Targaryen/article/details/82823543