`
txf2004
  • 浏览: 6865902 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

9月21日培训日记

阅读更多

评某位学员(不愿公布其姓名)使用PrepareStatement的代码,该程序代码如下:
package cn.incast;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Logger;

public class DemoClass {
private ConnectionConfig connectionConfig = null;
//private Logger log = Logger.getLogger("cn.incast");
private Connection cn = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
public boolean doQuery(String name,String pass) throws IOException, ClassNotFoundException, SQLException
{
cn = this.connectionConfig.foundConnection();
pstmt = cn.prepareStatement("select id from student where user=? and pass=?");
//如果使用Statement类那么查询语句应该是"Select id from Student where name='"+name +"'pass='"+pass"'"
//就容易出现
//使用SQL Server,因为SQL Server中''是转义字符
//name = name.replace("'","''");
//使用MySql ,因为MySql中\是转义字符,而java中\\是字符\
name = name.replace("'","\\'");
pstmt.setString(1,name);
pstmt.setString(2,pass);
rs = pstmt.executeQuery();

boolean bool = true;
if(rs.next())
{
//log.info("WelCome come "+ name +" !");
this.doClose();
return bool;
}
else
{
//log.info("The UserName and Userpassword error !");
bool = false;
this.doClose();
return bool;
}

}

public void doClose()
{
connectionConfig.close(rs,pstmt,cn);
}
public ConnectionConfig getConnectionConfig() {
return connectionConfig;
}

public void setConnectionConfig(ConnectionConfig connectionConfig) {
this.connectionConfig = connectionConfig;
}

}
问题:
(1)使用PrepareStatement后,参数中的单引号(')不用再进行转义处理,该学员的name = name.replace("'","\\'");语句显然有问题,弄巧成拙!
(2)对于boolean bool = true;这条语句:变量命名为bool,显然不如命名为bFound好;另外,boolean变量的初始值设置为false要比设置为true的感觉好得多!
(3)该程序后面的if...else...代码块太幼稚了,if与else中的代码有许多重复,应把这些重复代码放在if...else...代码块的后面,修改成如下形式,就要优雅得多:
boolean bFound = false;
if(rs.next())
{
bFound = true;
}

this.doClose();
return bFound;
两个小技巧:
(1)在实际项目中往数据库里存密码,应采用MD5加密
(2)如果一个函数接受的参数很多,应将这些参数打包成一个对象。
思考:
将mysql连接串写成jdbc:mysql:///itcast:能明白什么意思吗?

复习编写mysql的存储过程,并讲解在jdbc中如何调用存储过程和如何获取存储过程的返回值。李杰实验经验:如果获取是sql server的存储过程返回值,一定要用registerOutParameter方法对返回参数注册,而我们今天在Mysql中获取输出参数的值时,没有调用registerOutParameter。

李杰完成的实验结果:网络断线多长时间,rs.next都可以,但时间较长,cn.createStatement就不行了。
原因与实际问题的思考:网络是虚连接,应考虑web server与database server不在同一台服务器上的时候,网络断线或database server重新启动的情况,这也是cn.createStatement有可能失败的原因之一。

讲解DataSource,各个驱动程序中都应该提供DataSource实现,查看sql server 和mysql的驱动jar包,可以看到它们提供的DataSource实现类。
讲解了连接池的实现原理,再次引出包装设计模式,示意代码如下:
class PooledConnection implements Connection
{
Connection realConnection = null;
Pool pool;
PooledConnection(Connection realConnection,Pool pool)
{
this.realConnection = realConnection;
this.pool = pool;
}

createStatement()
{
realConnection.createStatement();
}

prepareCall()
{
realConnection.prepareCall();
}

close()
{
//realConnection.close();
pool.release(realConnection);
}
}

class Pool
{
public Connection getConnection()
{
Connection realConnection = xxxx;
return new PooledConnection(realConnection,this);
}
}

讲解各种开源框架实现的数据源:Spring的DriverManagerDataSource,Jakarta的BasicDataSource(以及相应的数据源工厂BasicDataSourceFactory),ibatis的SimpleDataSource(以及相应的数据源工厂),hibernate的DriverManagerConnectionProvider。做ibatis实验时,发现即使密码为"",但这一部分也必须设置,找出错误的原因就是在eclipse中查看源代码。
下面是课堂现场讲解中使用spring对上面几个数据源进行实验的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="dsdemo" class="cn.itcast.DsDemo">
<property name="dataSource">
<ref bean="ds"></ref>
</property>
</bean>
<bean id="ds" class="com.ibatis.common.jdbc.SimpleDataSource">
<constructor-arg>
<props>
<prop key="JDBC.Driver">com.mysql.jdbc.Driver</prop>
<prop key="JDBC.ConnectionURL">jdbc:mysql:///itcast</prop>
<prop key="JDBC.Username">root</prop>
<prop key="JDBC.Password"></prop>
</props>
</constructor-arg>
</bean>
<!-- bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql:///itcast</value>
</property>
<property name="username">
<value>root</value>
</property>
</bean-->
<!-- bean id="ds" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql:///itcast</value>
</property>
<property name="username">
<value>root</value>
</property>
</bean-->
</beans>
作业:
第一小组:dbcp实验,请在程序中硬编码使用BasicDataSourceFactory创建出BasicDataSource对象。
第二小组:hibernate实验,请在程序中硬编码使用Hibernate的DriverManagerConnectionProvider获取连接
第三小组:ibatis实验,请在程序中硬编码使用SimpleDataSourceFactory创建出SimpleDataSource对象。
第四小组:由李杰做一个调用存储函数并获取存储函数返回值的实验。

分享到:
评论

相关推荐

    营销系统员工培训日记.doc

    营销系统员工培训日记.doc

    动力节点 王勇老师drp项目 培训日记

    动力节点王勇老师的DRP项目培训日记,绝对经典!

    PPT个人日记模板.rar

    图文并茂,设计不错的PPT个人日记模板

    唐骏日记,唐骏日记,唐骏日记

    唐骏日记,唐骏日记唐骏日记,唐骏日记唐骏日记,唐骏日记唐骏日记,唐骏日记

    SAP 开发日记2SAP 开发日记2SAP 开发日记2SAP 开发日记2

    SAP 开发日记2SAP 开发日记2SAP 开发日记2SAP 开发日记2SAP 开发日记2SAP 开发日记2SAP 开发日记2SAP 开发日记2SAP 开发日记2SAP 开发日记2

    题目标题: 高斯日记

    在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。 高斯获得博士学位的那天日记上标着:8113 请你算出高斯获得博士学位的年月日。 提交答案的格式是:yyyy-mm-dd, 例如:...

    SAP 日记1SAP 日记1SAP 日记1SAP 日记1

    SAP 日记1SAP 日记1SAP 日记1SAP 日记1SAP 日记1SAP 日记1SAP 日记1SAP 日记1SAP 日记1SAP 日记1SAP 日记1SAP 日记1SAP 日记1SAP 日记1SAP 日记1

    Android代码-移动日记本功能包含传统的日记本和音频日记视频日记实现私密日记和普通日记。.zip

    移动日记本功能包含传统的日记本和音频日记视频日记实现私密日记和普通日记。.zip

    晨间日记21天excel模版下载.xlsx

    晨间日记21天excel模版下载.xlsx

    日记工具,日记软件,个人日记

    本软件起到了一个个人日记的功能。 日记记录的内容全部存放在tool\5b\artdiary.gtz下面,如果记录数量比较多的情况下,可以手工备份此文件,以免以外情况下丢失数据。 日记中的心情与天气,可以选择,也可以手工...

    记事本个人日记记事本个人日记

    记事本个人日记记事本个人日记记事本个人日记

    微信小程序 小熊的日记 (源码)

    微信小程序 小熊的日记 (源码)微信小程序 小熊的日记 (源码)微信小程序 小熊的日记 (源码)微信小程序 小熊的日记 (源码)微信小程序 小熊的日记 (源码)微信小程序 小熊的日记 (源码)微信小程序 小熊的日记 (源码)微信...

    c#初学日记c#初学日记

    c#初学日记c#初学日记c#初学日记c#初学日记c#初学日记c#初学日记c#初学日记c#初学日记

    爱日记多用户网络日记

    9、日记站后台管理目录为a,访问请直接用"域名/a",a目录可随意命名。建议后台管理目录。 10、日记后台管理分系统设置、管理员密码、用户管理、用户密码、日记管理和推荐管理几大块。 11、日记演示站 [七日记...

    (青春日记)多用户网络日记

    青春日记多用户网络日记程序是一个漂亮精致的网络日记本,它界面美观、功能丰富、使用方便,包含了用户登录注册、日记本排行、日记搜索、日记管理、留言评论等功能,还有音乐播放、时钟日历、愿望小寺等小功能。...

    [程序员实习日记大全]java程序员实习日记多篇.docx

    [程序员实习日记大全]java程序员实习日记多篇.docx[程序员实习日记大全]java程序员实习日记多篇.docx[程序员实习日记大全]java程序员实习日记多篇.docx[程序员实习日记大全]java程序员实习日记多篇.docx[程序员实习...

    Dear Diary 桫椤日记

    这是一款仿真日记,也是我个人认为最优秀的日记。(用过效能日记等日记软件,但没有一款符合我心意,惟独这款日记深得我心) 喜欢写日记的人可以尝试,相信你们也会认同我的观点并喜欢上这款日记。 这是我最爱的一...

    小程序源码 小熊的日记 (代码+截图)

    小程序源码 小熊的日记 (代码+截图)小程序源码 小熊的日记 (代码+截图)小程序源码 小熊的日记 (代码+截图)小程序源码 小熊的日记 (代码+截图)小程序源码 小熊的日记 (代码+截图)小程序源码 小熊的日记 (代码+截图)小...

    日记人asp多用户网络日记源码v3.8

    日记人多用户网络日记程序是一个漂亮精致的网络日记本,它界面美观、功能丰富、使用方便,包含了用户登录注册、日记本排行、日记搜索、日记管理、留言评论等功能,还有音乐播放、时钟日历、愿望小寺等小功能。...

    (青春日记)多用户网络日记 v3.9.rar

    青春日记多用户网络日记程序是一个漂亮精致的网络日记本,它界面美观、功能丰富、使用方便,包含了用户登录注册、日记本排行、日记搜索、日记管理、留言评论等功能,还有音乐播放、时钟日历、愿望小寺等小功能。...

Global site tag (gtag.js) - Google Analytics