(一)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,包装原来的类,动态的扩展一个对象的功能
- 包装类和原类都继承自同一个类或者实现了同一个接口