本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/blog/5/5-125.html
1.加载驱动:加载实现数据库接口的实现类
String driver = "com.mysql.jdbc.Driver";
Class.forName(driver);
2.实例化数据库连接对象:(需要数据库账户密码)
connection = DriverManager.getConnection(URL, username, password);
3.获取操纵数据库的statement对象:
Statement statement = connection.createStatement();
4.使用statement对象进行数据库操纵
5.按照顺序关闭ResultSet,Statement,Connection对象,断掉与数据库的连接
6.面向接口编程
7.封装成JdbcUtils处理jdbc相应的基本操作;
8.PrepareStatement可以进行sql语句的预编译和防止SQL注入漏洞。
9.一定记得用完之后关闭数据库连接,该资源极其珍贵。
10.数据库分页:主要完成查询总条数的获取,再根据要查询的页码在数据库中查询到相应的部分内容回传到浏览器,limit ?,?进行分页查询,具体参考常用相关组件和CustomerSystem项目。主要在于浏览器中当前页码数的维护工作。
11.大文本操作:(大文本要用流操作,防止占用过多内存)
设置值:
PreparedStatement.setCharacterStream(index, reader, length);
//注意length长度须设置,并且设置为int型
获取值:
reader = resultSet. getCharacterStream(i);
reader = resultSet.getClob(i).getCharacterStream();
string s = resultSet.getString(i);
12.大数据操作:(大数据要用流操作,防止占用过多内存)
设置值:PreparedStatement. setBinaryStream(i, inputStream, length);
获取值:
InputStream in = resultSet.getBinaryStream(i);
InputStream in = resultSet.getBlob(i).getBinaryStream();
13.批处理:
Statement:优点:可以调用不同的sql语句批处理;
缺点:相同的sql语句要写多次,没有预编译
PreparedStatement:
优点:执行相同sql语句但是参数不同只需要写一次sql语句
缺点:只能应用在SQL语句相同,但参数不同的批处理中
14.获取自动生成的主键:
设置statement执行获取主键:
connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
获取主键结果集:rs = statement.getGeneratedKeys();
15.调用存储过程:
获取存储过程Statement:
connection.prepareCall("{call demoSp(?,?)}");
输入参数:
statement.setString(1, "xxxx");
输出参数:
statement.registerOutParameter(2, Types.VARCHAR);//数据类型Types
执行:
statement.execute();
得到执行结果:
statement.getString(2);
16.事务操作:
开启事务:connection.setAutoCommit(false);
提交事务:connection.commit();
回滚事务:connection.rollback();没提交的情况下会自动回滚到事务开始阶段,该代码用户手动回滚
回滚点:Savepoint
设置回滚点:sp = connection.setSavepoint();
回滚到回滚点:connection.rollback(sp);
回滚点之前的sql要记得提交:connection.commit();
17.事务基础知识:
基本特征:原子性(A)
一致性(C):事务前后的整体状态是一致的
隔离性(I):并发线程安全问题
持久性(D):commit之后保证一定保存了
难题:隔离性!!!--脏读、不可重复读、虚读
脏读:A事务修改但未提交,B事务读,A事务再回滚,则B读取的数据是脏数据;
不可重复读:A事务查询,B事务修改,A事务第二次查询得到的结果和之前的不一致;
虚读:A事务查询,B事务添加一个数据,之后A在查询得到的结果集多了一条;
隔离性解决方案:
隔离级别越高性能越差,根据具体情况进行选择。
注:此处设置的隔离级别是设置当前事务的隔离级别,和别的事务的隔离级别没关系,且对应该隔离级别的该事务就会有对应可能出现的隔离性问题。
注:查询程序可设置Read committed;
统计程序要设置Serializable
18.JDBC设置隔离级别:
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
在开启事务之前设置隔离级别;
19.数据库连接池:
数据库连接的创建代价很大,因此实现创建多个数据库连接形成集合,需要的时候从中进行申请,用完之后再重新返回集合中,并且连接池要控制好连接状态,最大连接数,空闲连接数等参数,并发控制等。
A、 Dbcp连接池:需要pool、dbcp、colletions三个commons的包,版本要对应;
B、 Dbcp使用步骤:
// 加载配置文件
InputStream is = JDBCUtil_DBCP.class.getClassLoader()
.getResourceAsStream("dbcpconfig.properties");
properties.load(is);
// DataSource工厂
factory = new BasicDataSourceFactory();
// 工厂通过配置文件生成DataSource对象
ds = factory.createDataSource(properties);
C、 从连接池申请数据库连接:(在jdbcutils中创建连接池)
ds.getConnection();
D、 C3P0连接池:
导入c3p0的jar包
加入c3p0-config.xml配置文件
创建连接池:
cpds = new ComboPooledDataSource("myConfig");
获取连接对象: cpds.getConnection();
E、 Tomcat服务器自带连接池:
Tomcat创建一个数据库连接池放到JNDI容器中,再通过JNDI容器获取数据库连接池。(其实是DBCP连接池)
附:JNDI详解教程:
http://www.cnblogs.com/xing901022/p/4568803.html
a. 配置Tomcat的Context(此之后Tomcat服务器就创建好了连接池并放入了JNDI容器中)
附:可以配置context.xml的位置,详见:http://localhost:8080/docs/config/context.html
配置详情:
<Context>
<Resource name="jdbc/EmployeeDB"
auth="Container"
type="javax.sql.DataSource"
username="root"
password=""
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/customersystem"
maxActive="8"
maxIdle="4"/>
</Context>
b. 从JNDI容器中获取连接池对象:
初始化 jndi:
Context initCtx = new InitialContext();
得到jndi容器:
Context envCtx = (Context) initCtx.lookup("java:comp/env");
从容器中检索连接池:
DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB");
获取连接:
conn = ds.getConnection();
注:该种方式要把数据库的驱动放到tomcat的lib下,防止找不到数据库驱动。
20.JDBC框架相关:
获取数据库元数据:(数据库基本信息)
DatabaseMetaData metaData = connection.getMetaData();
获取Statement的参数元数据:(PreparedStatement的sql语句参数详细信息)
ParameterMetaData parameterMetaData = st.getParameterMetaData();
ResultSet结果集元数据:(获取结果集的相关详细信息)
ResultSetMetaData resultSetMetaData = rs.getMetaData();
框架设计思路:抽取相同部分代码,再用模版设计模式,接口回调控制主控逻辑,由子类具体实现各个模块的具体过程。保证主流程的统一性和各模块的多样性。
21.Oracle大数据存储处理:(不建议使用dbutils)
样例:
写入:
读取:
本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/blog/5/5-125.html