在java中如何实现预编译?

就是启动tomcat服务器后,进入页面时,不用编译了,也不用在连接数据 库了,在启动服务器时,就已经进行了数据库的相关操作

可以写一个单独的jsp文件,专门负责初始化工作,然后把它设置成随服务器启动,当tomcat启动时,自动调用,可以在web工程中web.xml文件中如下设置(这里采用servlet设置,反正都差不多)

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-05-20
1.1预编译中使用like

在值的地方加%号,是这样用的
String sql = "select * from t_Content where title like ?";

ResultSet rs;
rs = null;
try {
rs = db.getResult(sql, new String[]{"%我省手机%"},0);
不是这样用的

String sql = "select * from t_Content where title like %?%";

ResultSet rs;
rs = null;
try {
rs = db.getResult(sql, new String[]{"我省手机"},0);

1.2javaSQL预编译异常

if (!isOpened()) {
openConn();
}
params[2]="aabbcc";
PreparedStatement stmt = session.connection().prepareStatement(sql);
if (params == null) {
params = new Object[0];
}
for (int i = 0; i < params.length; i++) {
Object o = params[i];
if (o != null) {
stmt.setObject(i + 1, o);
}
}
SpecialLog.sendLog.info("SQL=" + sql);
SpecialLog.sendLog.info("params0=" + ((Long)params[0]).intValue());
SpecialLog.sendLog.info("params1=" + ((Long)params[1]).intValue());
SpecialLog.sendLog.info("params2=" + params[2]);

return stmt.executeUpdate();

这个params参数中如果有null值是会报错的:
java.sql.SQLException: 索引中丢失 IN 或 OUT 参数::

1.3预编译语句支持in方式

package cn;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
DbConn conn = null;
ResultSet rs = null;
try {
conn = new DbConn();

List idLst = new ArrayList();
idLst.add(new Long(62946));
/* 如果使用
idLst.add(new Long(62946));
strIn.append("?,");

idLst.add(new Long(73967));
strIn.append("?,");

idLst.add(new Long(62952));
strIn.append("?,");

不如使用下面的这种“根据参数列表的大小生成in串”更简洁、利索、清晰、隔离性好。要时时问自己,还有更好的方法吗?

*/
idLst.add(new Long(73967));
idLst.add(new Long(62952));

//根据参数列表的大小生成in串
StringBuffer strIn = new StringBuffer();
for (int i = 0; i < idLst.size(); i++)
{
strIn.append("?,");
}
strIn.deleteCharAt(strIn.length() - 1);

System.out.println(strIn);
String sql = "select title from t_content where content_id in("+ strIn +")";
rs = conn.getResult(sql, idLst.toArray(), 0);

while (rs.next()) {
System.out.println(rs.getString(1));
}
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
if (rs!=null) {
conn.close(rs);
rs=null;
}
} catch(Exception e1) {
e1.printStackTrace();
}
if (conn!=null) {
conn.close();
conn = null;
}
}
}
}

1.4在预编译中遇到的问题

1、报“插入的值过大”的错误,
是因为预编译语句中,不需要再为字符串加引号了,如果添加了引号,就会出错了。
2、怎么创建合适的日期对错呢:
pv[20] = java.sql.Date.valueOf(consumeDateYear);
pv[21] = java.sql.Date.valueOf(sufferDateYear);

java.util.Date已过时,但是java.sql.Date还没有过时。并且java.sql.Date.valueOf非常有用:将 JDBC 日期转义形式的字符串转换成 Date 值。
3、真正的预编译不允许使用非问号的连接,例如:
sql = "SELECT * FROM (" + "SELECT A.*, ROWNUM RN FROM (" + this.sql
+ ") AWHERE ROWNUM <= ?)WHERE RN > ? order by ? ";
不能修改为
sql = "SELECT * FROM (" + "SELECT A.*, ROWNUM RN FROM (" + this.sql
+ ") AWHERE ROWNUM <= ?)WHERE RN > ? " + str; (str=order by str1 str1=某字段)
第2个回答  2013-12-02
java术语不熟悉吧? 预编译,你的描述中看出来是先编译好了,java编程过程是把源码编译成class文件的过程。按你的意思,如果是页面的话,如jsp,首次访问的时候,服务器会编译成class文件,并通过tomcat缓存起来,这样以提升性能。至于你描述的连接数据库?数据库的相关操作是程序控制的,如果没有启动服务,怎么会启动程序,入口都没有,怎么能进行操作呢?这个是不可能的。追问

我是新手,对很多专业术语并不清楚,但我所说的意思大概就是那样的,就是再编译好,服务器启动后,你点击要进入的页面时,页面 已经提前生成了,就好像是静态的页面一样,所有的要从数据库的到的数据已经有了。
我的页面是同时显示出几个饼图和曲线图

追答

你这个跟编译没有关系。。。你说的页面上的数据预处理。你可以看看ajax技术 以及缓存方面的技术。

第3个回答  2013-12-02
/*
* ProCompile.java *预处理要编译的文件,删除多余的空白,注释,换行,回车等
* Created on 2007年9月18日, 下午8:58 */ package javacompile; import java.io.*;
import java.util.regex.*;
import javax.swing.JOptionPane; /** * @com.junjian.sun public class PerCompile { File f = null;
String fileString = null;
Pattern p = null;
Matcher m = null;
String regex; //正则表达式 //初始化p
public PerCompile() {
regex ="(//.+)" + //(//.+) 对应单行注释
//"|(/\\*(.+\\n)+\\*/)"+ // 想对应多行注释... "|(\\r\\n)" + "|(\\n)"+//(\\r\\n)|(\\n)对应换行
"|(\\B\\s+)" ; // 空白符
String ss;
f = new File(new JOptionPane()
.showInputDialog("请输入文件所在路径~"));
try {
BufferedReader bf = new BufferedReader(new FileReader(f));
ss = bf.readLine()+"\n";
fileString = ss; //如果没有这两句,ss的开头会有“null”
while((ss = bf.readLine())!= null){
fileString += ss+"\n"; bf.close();
} catch (IOException ex) {
ex.printStackTrace(); p = Pattern.compile(regex);
m = p.matcher(fileString); //执行替换所有多余空行,空白符,注释
void Dels(){
System.out.println("before: "+fileString);
if(m.find()) System.out.println("find!!");
System.out.println(m.replaceAll("")); } }

-追问

这与我的问题无关呀,我的提问是如何预处理jsp页面,页面中的数据都是从数据库查询的来的

第4个回答  2013-12-02
你放进去的时候,那个包应该是编译好的了

连接数据库,你可以再tomcat设置datasource

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网