/*
*tomcat内置连接池管理
*tomcat内置连接池使用的是dbcp
*问题
*tomcat怎样管理连接池(配置)
*要想将一个dbcp连接池让tomcat管理,只需要创建一个context.xml配置文件,
在配置文件中配置相关信息
*配置相关信息,
*context.xml文件的位置:
*tomcat/conf/context.xml 此时这个连接池是给整个服务器使用的
*tomcat/conf/Catalina/localhost下 给服务器下的localhost虚拟主机使用
*context.xml文件放置在web应用的META-INF下 给当前项目使用
*注意:如果是全局设置,就需要将数据库驱动放置在tomcat/lib目录下
*怎样从tomcat中获取连接池对象:在servlet中获取连接池对象
Context context = new InitialContext();
Context envCtx = (Context)context.lookup("java:comp/env"); 固定路径
DataSource datasource = (DataSource) envCtx.lookup("jdbc/EmployeeDB");
*JNDI java naming and drecroty interface java命名和目录接口
*元数据
*元数据:metaData,指数据库中库,表,列的定义信息
*DataBasemetaData:数据库元数据
*接口,关于数据库的整体综合信息
*怎样获取一个DataBasemetaData
connection接口中定义了一个方法 getMetaData()
*常用API:getDriverName() 获取驱动名称
getUserName() 获取用户名
getURL() 获取url
getDataBaseProductName() 获得数据库名
getDataBaseProductVersion() 获取数据库版本
ResultSet getPrimaryKeys() 获取主键相关信息的描述
如:表类别,表模式,表名,列名等
*ParameterMetaData:参数元数据,比如得到sql语句中的占位符信息
*参数元数据主要用于获取sql语句的?占位符信息
*怎样获取ParameterMetaData?
*PreparedStatement中有一个方法可以获取
常用API:
*int getParameterCount():返回占位符参数个数(****)
*String getParameterTypeName(int param[占位符的位置]):返回类型名
*int getParameterType(int param[占位符的位置]):返回类型对应的int值
**在获取参数类型时会产生异常
java.sql.SQLException: Parameter metadata not available for the given statement
*解决:
*在url后添加参数:jdbc:mysql:///day18?generateSimpleParameterMetadata=true
*添加这个参数后,获取的结果是varchar,原因:是mysql驱动的支持问题。
*ResultSetMetaData:结果集元数据
*怎样获取:ResultSet的getMetaData()获取
*常用API:
*getColumnCount() 获取结果集中的列数
*getColumnName(int index) 获取结果集中指定列的名称
*getColumnTypeName(int index) 获取结果集中某一列的类型
*dbutils工具
*dbutils就是jdbc的一个简单的封装工具,使用的时候需要导jar包
*作用:简化jdbc编码的工作量,同时不会影响程序的性能
*核心:
*QueryRunner:用于执行sql语句的类
*query 执行select
*update 执行update delete insert
*batch 执行批处理
*ResultSetHandler:用于定义结果集的封装
提供了9个实现类,可以进行不同的封装
*DbUtils:工具类,提供了关于关闭资源以及事务回滚提交等操作
里面的方法都是静态的,直接类名调用
*QueryRunner详解
*QueryRunner怎样初始化
*直接使用构造方法获取
QueryRunner runner = new QueryRunner();
*如果使用无参构造,它的事务是手动控制
QueryRunner runner = new QueryRunner(DataSource ds);
*如果使用有参构造,它的事务是自动控制
一般是一条sql,一个事务。
*QueryRunner中的三个核心方法怎样使用
*三个核心方法提供了很多重载。
如果创建QueryRunner是使用的是无参构造,在使用那三个核心方法是就需要传递connection对象
我传了connection参数,所以事务我可以自己控制
runner.query(conn,ResultHandler,Object...)
int runner.update(conn,ResultHandler,Object...)
int [] runner.batch(conn,ResultHandler,Object [] [])
如果创建QueryRunner是使用的是有参构造,在使用那三个核心方法是就不需要传递connection对象
没传connection参数,我就不能手动去控制事务了
runner.query(ResultHandler,Object...)
int runner.update(ResultHandler,Object...)
int [] runner.batch(ResultHandler,Object [] [])
*模仿QueryRunner
*query方法模仿
public
T query(Connection con, String sql, MyResultSetHandler
mrs,Object... params) throws SQLException
{
// 得到一个预处理的Statement.
PreparedStatement pst = con.prepareStatement(sql);
// 问题:sql语句中可能存在参数,需要对参数赋值。
//那怎么知道有几个参数呢、此时之前讲的参数元数据就起作用了
ParameterMetaData pmd = pst.getParameterMetaData();
// 获取参数个数
int count = pmd.getParameterCount();
for (int i = 1; i <= count; i++) {
pst.setObject(i, params[i - 1]);
}
//获得完整的sql语句之后,内部去调用查询语句
ResultSet rs = pst.executeQuery();
// 得到了结果集,要将结果集封装成用户想要的对象,但是,工具不可能知道用户需求。
return mrs.handle(rs);
}
*update方法模仿
public int update(Connection con, String sql, Object... params) throws SQLException
{
// 得到一个预处理的Statement.
PreparedStatement pst = con.prepareStatement(sql);
// 问题:sql语句中可能存在参数,需要对参数赋值。
ParameterMetaData pmd = pst.getParameterMetaData();
// 可以得到有几个参数
int count = pmd.getParameterCount();
for (int i = 1; i <= count; i++) {
pst.setObject(i, params[i - 1]);
}
int row = pst.executeUpdate();
// 关闭资源,连接是不用关的,因为这个的目的就是让用户手动管理
pst.close();
return row;
}
*ResultSetHandler详解
*用于封装结果集
*也可以直接用ResultSetHandler的对象,自己去实现封装的方法
*还有九个实现类,实现了封装的具体行为
*ArrayHandler:将结果集中的第一条记录封装到数组中,
数组中的每一个元素就是每一个字段的值
*ArrayListHandler:将结果集中的每一条记录分别封装到一个数组中,
数组中的每一个元素就是一个字段的值,再讲这些数组封装到list集合中
***BeanHandler:将结果集中的第一条记录封装到一个javabean中
***BeanListHandler:将结果集中的每一条记录封装到一个javabean中,
再将这些javabean封装到list集合中
*ColumnListHandler:将结果集中某一列的值封装到list集合中
*MapHandler:将结果集中第一条记录封装到map集合中,
map的key是字段名,value就是字段值
*MapListHandler:将结果集中每一条记录封装到map集合中,
map的key是字段名,value就是字段值,再将map集合封装到list集合中
*KeyedHandler:将结果集中每一条记录封装到map集合中,
再使用指定的列的值作为map集合的key,value为之前指定的map集合
*ScalarHandler:进行单值查询的封装
*/
使用dbutils工具操作数据库之后,简化了很多代码,也简单,方便了很多。
但是自己还不熟练,而且对于自定义的一些工具,自己也写不出来,现在先过视频,以后有时间了慢慢研究。
现在的注册登录和修改信息的操作,比起之前的代码,有了大大的优化。
我发觉自己对于弱类型语言的掌握很不好,不喜欢那种不是很规范的语言。
哎,这是我的短板,一定要克服。加油,秋招一定可以的,不要放弃。