笔记--元数据和dbutils工具

/*
*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工具操作数据库之后,简化了很多代码,也简单,方便了很多。

但是自己还不熟练,而且对于自定义的一些工具,自己也写不出来,现在先过视频,以后有时间了慢慢研究。

现在的注册登录和修改信息的操作,比起之前的代码,有了大大的优化。

我发觉自己对于弱类型语言的掌握很不好,不喜欢那种不是很规范的语言。

哎,这是我的短板,一定要克服。加油,秋招一定可以的,不要放弃。

commons-dbutils包是Apache开源组织提供的用于操作数据库的工具包。简单来讲,这个工具包就是用来更加方便我们操作数据库的,最近工作中使用了一下,感觉确实方便很多,基本告别自己封装JDBC代码对数据库进行增删改查了。代码看着也很简洁。 例如: 增删改查使用的类:QueryRunner类+ResultSetHandler类,使用这俩类就可以解决掉。 QueryRunner类的query()方法:new QueryRunner().query(Connection conn, String sql, ResultSetHandler rsh) query方法后面参数中加一个Connection连接,是在获取不到数据源的情况下,也就是说,QueryRunner的实例化构造函数使用无参的那个,下面我的实现代码就是用的这种方法。 当然还有一种实例化:new QueryRunner(new Datasource()).query(String sql, ResultSetHandler rsh) query方法中的参数 ResultSetHandler 参数中加上ResultSetHandler接口的实现类参数(下面这些实现类),执行完SQL后,返回的数据就是已经封装好的我们想要的结果了。 ArrayHandler :将ResultSet中第一行的数据转化成对象数组 ArrayListHandler将ResultSet中所有的数据转化成List,List中存放的是Object[] BeanHandler :将ResultSet中第一行的数据转化成Bean对象 BeanListHandler :将ResultSet中所有的数据转化成List ColumnListHandler :将ResultSet中某一列的数据存成List KeyedHandler :将ResultSet中存成映射,key为某一列对应为Map,Map中存放的是数据 MapHandler :将ResultSet中第一行的数据存成Map MapListHandler :将ResultSet中所有的数据存成List<Map> ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object
项目环境:springmvc+mybati+bootstrap springmvc+mybatis整合bootstrap前端框架的SMB架构,利用MybatisGenerator-v0.1.1.jar反向生成底层代码,专注于业务代码编写,达到快速开发的目的。 修改步骤: 一、修改项目名称、及包名(此步骤可忽略)。 二、配置generatorConfig-smb.xml。 1、修改<classPathEntry location="C:\Users\Administrator\.m2\repository\mysql\mysql-connector-java\5.1.31\mysql-connector-java-5.1.31.jar" /> location指向mysql-connector-java JAR包 2、修改<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/smb?generateSimpleParameterMetadata=true&useUnicode=true&characterEncoding=utf-8" userId="root" password="root" />数据库连接地址、用户名或密码 3、配置当前项目的 model、mapper、xml对应targetPackage的包名及对应targetProject的存放物理地址。 4、配置数据表和实体的映射关系 <table schema="" tableName="User" domainObjectName="User"> <generatedKey column="id" sqlStatement="JDBC" identity="true"/> </table> 参考:http://generator.sturgeon.mopaas.com/configreference/xmlconfig.html 三、利用MybatisGenerator-v0.1.1.jar反向生成底层代码。 1、进入该项目的smb\src\main\resources\mapper目录。 2、运行MybatisGenerator-v0.1.1.jar工具(或者使用java -jar命令运行) 3、利用工具打开generatorConfig-smb.xml配置文件,运行没有异常即可。 4、将生成的代码copy至项目对应的目录。 四、编写业务代码。 技术交流QQ群:178552702
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值