dbutils工具
元数据
问题:元数据是什么,有什么作用? 元数据(metaData) 指数据库中 库、表、列的定义信息 1.DataBaseMetaData 数据库元数据(了解) 问题:怎样获取一个DataBaseMetaData? Connection接口中定义了一个方法 getMetaData(); 问题:常用API String driverName = dmd.getDriverName(); //获取驱动名称 System.out.println(driverName); String userName = dmd.getUserName();//获取用户名 System.out.println(userName); String url = dmd.getURL();//获取url System.out.println(url); String databaseProductName = dmd.getDatabaseProductName(); //获取数据库名称 System.out.println(databaseProductName); String databaseProductVersion = dmd.getDatabaseProductVersion();//获取数据库版本. System.out.println(databaseProductVersion); ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException 获取表中主键相关描述 每个主键列描述都有以下列: TABLE_CAT String => 表类别(可为 null) TABLE_SCHEM String => 表模式(可为 null) TABLE_NAME String => 表名称 COLUMN_NAME String => 列名称 KEY_SEQ short => 主键中的序列号(值 1 表示主键中的第一列,值 2 表示主键中的第二列)。 PK_NAME String => 主键的名称(可为 null) 2.ParameterMetaData 参数元数据 参数元数据主要用于获取:sql语句中占位符的相关信息. 问题:怎样获取ParameterMetaData? 在PreparedStatement中有一个方法getParameterMetaData可以获取. 问题:怎样使用? int count = pmd.getParameterCount(); // 获取参数 个数 System.out.println(count); String type1 = pmd.getParameterTypeName(1);//获取参数的类型 System.out.println(type1); 注意:在获取参数类型时会产生异常 java.sql.SQLException: Parameter metadata not available for the given statement 解决方案: 在url后添加参数 jdbc:mysql:///day18?generateSimpleParameterMetadata=true 添加这个参数后,我们在获取,它的结果也是varchar,原因:是mysql驱动的支持问题。 3.ResultSetMetaData 结果集元数据 问题:怎样获取结果集元数据? 可以通过ResultSet的getMetaData()方法获取. 问题:怎样使用? System.out.println(rsmd.getColumnCount());//获取结果集中列数量 System.out.println(rsmd.getColumnName(2));//获取结果集中指定列的名称. System.out.println(rsmd.getColumnTypeName(3));//获取结果集中指定列的类型
dbutils工具
问题:dbutils是什么,有什么作用? 它就是一个简单的jdbc封装工具.使用dbutils可以简化操作.要使用dbutils需要导入jar包. dbutils核心 1.QueryRunner类 它是用于执行sql语句的类。 1.query 用于执行select 2.update 用于执行update delete insert 3.batch 批处理 2.ResultSetHandler接口 用于定义结果集的封装 它提供九个实现类,可以进行不同的封装。 3.DbUtils类 它提供关于关闭资源以及事务rollback,commit操作。 ----------------------------------------------------- Dbutlis详解 1.QueryRunner 1.QueryRunner怎样获取 1.new QueryRunner() 如果是使用这种构造创建的QueryRunner,它的事务是手动控制. 2.new QueryRunner(DataSource ds); 如果是使用这种构造,它的事务是自动事务,简单说,一条sql一个事务。 2.QueryRunner中的三个核心方法 query update batch 对于上述三个方法,它们提供很多重载。 如果QueryRunner在创建时,没有传递DataSource参数,那么在使用 query,update,batch方法时,要传递Connection参数 如果QueryRunner在创建时,传递了Dataource参数,好么在使用 query,update,batch方法时,不需要传递Connection参数。 总结: 怎样配套使用: QueryRunner runner=new QueryRunner(); runner.query(Connection,sql,ResultSetHandler,Object... param); runner.update(Connection,sql,Object...param); runner.batch(Connection con,sql,Object[][] objs); QueryRunner runner=new QueryRunner(DataSource ds); runner.query(sql,ResultSetHandler,Object... param); runner.update(sql,Object...param); runner.batch(sql,Object[][] objs); ----------------------------------------------------------------- ResultSetHandler接口 用于封装结果集. ============================================================================ 模仿QueryRunner 1.query方法模仿 public <T> T query(Connection con, String sql, MyResultSetHandler<T> mrs,Object... params) throws SQLException { PreparedStatement pst = con.prepareStatement(sql); // 得到一个预处理的Statement. // 问题:sql语句中可能存在参数,需要对参数赋值。 ParameterMetaData pmd = pst.getParameterMetaData(); // 可以得到有几个参数 int count = pmd.getParameterCount(); for (int i = 1; i <= count; i++) { pst.setObject(i, params[i - 1]); } ResultSet rs = pst.executeQuery(); // 得到了结果集,要将结果集封装成用户想要的对象,但是,工具不可能知道用户需求。 return mrs.handle(rs); } 2.update方法模仿 public int update(Connection con, String sql, Object... params) throws SQLException { PreparedStatement pst = con.prepareStatement(sql); // 得到一个预处理的Statement. // 问题: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; } =============================================================================== ResulsetHandler九个实现类 ArrayHandler, 将结果集中第一条记录封装到Object[],数组中的每一个元素就是记录中的字段值。 ArrayListHandler, 将结果集中每一条记录封装到Object[],数组中的每一个元素就是记录中的字段值。在将这些数组装入到List集合。 BeanHandler(重点), 将结果集中第一条记录封装到一个javaBean中。 BeanListHandler(重点), 将结果集中每一条记录封装到javaBean中,在将javaBean封装到List集合. ColumnListHandler, 将结果集中指定列的值封装到List集合. MapHandler, 将结果集中第一条记录封装到Map集合中,集合的 key就是字段名称,value就是字段值 MapListHandler, 将结果集中每一条记录封装到Map集合中,集合的 key就是字段名称,value就是字段值,在将这些Map封装到List集合 KeyedHandler,在使用指定的列的值做为一个Map集合的key,值为每一条记录的Map集合封装。 ScalarHandler 进行单值查询 select count(*) from account; --------------------------------------------------------- 扩展:实现BeanHandler 使用BeanUtils实现 Object obj = null; Map<String, String[]> map = new HashMap<String, String[]>(); ResultSetMetaData md = rs.getMetaData(); int count = md.getColumnCount(); if (rs.next()) { try { obj = clazz.newInstance(); for (int i = 1; i <= count; i++) { map.put(md.getColumnName(i), new String[] { rs.getString(md.getColumnName(i)) }); } BeanUtils.populate(obj, map); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } return obj;
虚拟主机
使用虚拟主机可以将项目部署成顶级域名 1.在service.xml文件 1.端口修改为80 2. 配置主机 <Host name="www.customer.com" appBase="D:\java1110\workspace\day19_2" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> <Context path="" docBase="D:\java1110\workspace\day19_2\WebRoot" /> </Host> 3.在hosts文件中配置 127.0.0.1 www.customer.com