首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

[一百分求解答]实际的情况下java怎么操作数据库

2014-01-01 
[一百分求解答]实际的情况下java如何操作数据库?我想问问,在实际的项目中,是如何操作数据库的?谢谢我有一

[一百分求解答]实际的情况下java如何操作数据库?
我想问问,在实际的项目中,是如何操作数据库的?谢谢

我有一个零件表,38,39,不到40个字段。


是需要做个一零件的类,把所有的字段都定义上,然后setXXX,getXXX来做么?我有一个专门处理连接,执行sql语句的类,如果是通过这个零件类来保存,读取,把sql语句写在这个零件类里好,还是写在什么地方好?

这样几十个字段,写起来感觉很麻烦

不知道项目中,实际情况下,是怎么操作数据库呢?

一直没做过大一些的数据库的项目,有点迷茫,望大家指教。

谢谢

分有的是,你帮我,我就送分。



[解决办法]
来学习下,不管怎么样,sql语句还是得自己写吧?
[解决办法]
楼主在自学JAVA ing?
1.传统的原始开发模式
2.MVC开发模式:
  SSH(Spring+stauts+hibernate)/SSI(Spring+stauts+ibatis)二种主流集成框架方式: 楼主所说的通过工具生成实体bean,就是hibernate框架做的事,每张表映射生成一个实体bean,项目层次:
  分action层->service层->dao层 action是: 响应前台事件,取得前台封装过来的数据; service层:业务逻辑层; dao层:写SQL或HQL,调用数据连接类的CRUD方法和数据库交互;

PS:我写了个大概,发现要写的东西实在太多了····楼主可以通过我写的关键字去找资料了解下,比我说来的好
[解决办法]
可以使用BeanUtils将取出的数据封装到对应的javabean
[解决办法]
我们用的JDNI啊,直接改下配置文件就行了[一百分求解答]实际的情况下java怎么操作数据库
[解决办法]
我们用的是Spring+Hibernate。
[解决办法]
我们现在做的项目中,已经很少使用hibernate,就连strust都没用。
直接用springMVC+springJDBC,
用spring的jdbc就可以实现实体类的绑定,
至于实体类,楼主已经有工具生成,那就省事了,
直接用spring的JDBC即可,举一个crud的例子:
就比如实体类 Bean,,
查询(根据Id查询):


public Bean getBean(Integer id) {
StringBuilder selectBuilder = new StringBuilder();
selectBuilder.append(" SELECT * from xxx where id=?");
return new SimpleJdbcTemplate().getSimpleJdbcTemplate().queryForObject(selectBuilder.toString(), new ParameterizedRowMapper<Bean>() {

public Bean mapRow(ResultSet rs, int rowNum)
throws SQLException {
Bean bean = new Bean ();
bean.setId(rs.getInt("id"));
bean.xxx(rs.getString("xxx"));
//...设置各个需要存入实体的值
return bean;
}
}, id);
}



[解决办法]
引用:
我想了解一下,现在实际工作中是怎么进行这个操作的。

如果能给我一些例子,多给分。

帮顶的,灌水的,都只给1分



楼主可以将所有的数据库操作都封装成一个类,独立于程序之外,在对数据库操作时,直接调用就ok 了,对于数据的问题,可以重载等办法解决
[解决办法]
顶楼上 的beanUtils  apache commons jar包内 非常实用的工具  蹭个分
[解决办法]
一般用ORM框架可以减少你写sql的麻烦。

比如morphia,直接写pojo对象,对象属性设置上,调用对象的save方法即可保存到数据库。

还有你这零件的字段这么长??是否可以优化成多个表关联呢?
[解决办法]
引用:
Quote: 引用:

我们现在做的项目中,已经很少使用hibernate,就连strust都没用。
直接用springMVC+springJDBC,
用spring的jdbc就可以实现实体类的绑定,
至于实体类,楼主已经有工具生成,那就省事了,
直接用spring的JDBC即可,举一个crud的例子:
就比如实体类 Bean,,
查询(根据Id查询):

public Bean getBean(Integer id) {
StringBuilder selectBuilder = new StringBuilder();
selectBuilder.append(" SELECT * from xxx where id=?");
return new SimpleJdbcTemplate().getSimpleJdbcTemplate().queryForObject(selectBuilder.toString(), new ParameterizedRowMapper<Bean>() {

public Bean mapRow(ResultSet rs, int rowNum)
throws SQLException {
Bean bean = new Bean ();
bean.setId(rs.getInt("id"));
bean.xxx(rs.getString("xxx"));
//...设置各个需要存入实体的值
return bean;
}
}, id);
}





多谢。

1条数据,或是几条数据,可以生成一个bean。那如果一下找出来几十万条数据,也是要挨个生成bean么?

楼主,查几十万条数据那也只是交给了数据库去做,我们可以考虑加上分页,每次只找出10条,20条,或者50条等等,但是,如果是涉及到导出,可以另做一个直接用jdbc的方式进行查询,跳过bean绑定。
[解决办法]
给LZ提供一些连接吧,这些都是挺不错的!
http://blog.csdn.net/xiehuan_uestc/article/details/7969321
http://www.cnblogs.com/Caceolod/articles/1280258.html
http://blog.csdn.net/csh624366188/article/details/7305672
http://www.cnblogs.com/baiweiguo/archive/2013/02/21/2920638.html

其实这样的连接还有很多,而且总结的都挺全面的,我只是来蹭分的

[一百分求解答]实际的情况下java怎么操作数据库
[解决办法]
结贴的时候,我还不忘来拿分
[解决办法]
给楼主我的生成bean代码:



import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.jdbc.datasource.DataSourceUtils;

import com.wasion.framework.service.ServiceLocator;

/**
 * 数据库表转换成javaBean对象小工具,
 * bean属性按原始数据库字段经过去掉下划线,并大写处理首字母等等.
 *
 */
public class MyEntityUtils {
private String tablename = "";
private String[] colnames;
private String[] colTypes;
private int[] colSizes; // 列名大小
private int[] colScale; // 列名小数精度
private boolean importUtil = false; // 导入包java.util.*
private boolean importSql = false; // 包java.sql.*
private boolean importMath = false; // 包java.sql.*
private boolean useObjectType = false; // bean类中使用基本类型还是对象类型

/**
 * @param args
 */
public void tableToEntity(String tName) {
tablename = tName;
//数据连Connection获取,自己想办法就行.
DataSource ds = (DataSource) ServiceLocator.getService("dataSource");
Connection conn = DataSourceUtils.getConnection(ds); // 得到数据库连接
String strsql = "SELECT * FROM " + tablename;//+" WHERE ROWNUM=1";
try {
System.out.println(strsql);
PreparedStatement pstmt = conn.prepareStatement(strsql);
pstmt.executeQuery();
ResultSetMetaData rsmd = pstmt.getMetaData();
int size = rsmd.getColumnCount(); // 共有多少列
colnames = new String[size];
colTypes = new String[size];
colSizes = new int[size];
colScale = new int[size];
for (int i = 0; i < rsmd.getColumnCount(); i++) {
rsmd.getCatalogName(i + 1);
colnames[i] = rsmd.getColumnName(i + 1).toLowerCase();
colTypes[i] = rsmd.getColumnTypeName(i + 1).toLowerCase();
colScale[i] = rsmd.getScale(i + 1);
System.out.println(rsmd.getCatalogName(i+1));
if ("datetime".equals(colTypes[i])) {
importUtil = true;
}
if ("image".equals(colTypes[i]) 
[解决办法]
 "text".equals(colTypes[i])) {
importSql = true;
}
if(colScale[i]>0){
importMath = true;
}
colSizes[i] = rsmd.getPrecision(i + 1);
}
String content = parse(colnames, colTypes, colSizes);
try {
FileWriter fw = new FileWriter(initcap(tablename) + ".java");
PrintWriter pw = new PrintWriter(fw);
pw.println(content);
pw.flush();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DataSourceUtils.releaseConnection(conn, ds);
}
}

/**
 * 解析处理(生成实体类主体代码)
 */
private String parse(String[] colNames, String[] colTypes, int[] colSizes) {
StringBuffer sb = new StringBuffer();
sb.append("\r\nimport java.io.Serializable;\r\n");
if (importUtil) {
sb.append("import java.util.Date;\r\n");
}
if (importSql) {
sb.append("import java.sql.*;\r\n\r\n");
}
if(importMath){
sb.append("import java.math.*;\r\n\r\n");
}
//表注释
processColnames(sb);
sb.append("public class " + initcap(tablename) + " implements Serializable {\r\n");
processAllAttrs(sb);
processAllMethod(sb);
sb.append("}\r\n");
System.out.println(sb.toString());
return sb.toString();

}
/**
 * 处理列名,把空格下划线'_'去掉,同时把下划线后的首字母大写
 * 要是整个列在3个字符及以内,则去掉'_'后,不把"_"后首字母大写.
 * 同时把数据库列名,列类型写到注释中以便查看,
 * @param sb
 */
private void processColnames(StringBuffer sb) {
sb.append("\r\n/** " + tablename + "\r\n");
String colsiz="";
String colsca="";
for (int i = 0; i < colnames.length; i++) {
colsiz = colSizes[i]<=0? "" : (colScale[i]<=0? "("+colSizes[i]+")" : "("+colSizes[i]+","+colScale[i]+")");
sb.append("\t" + colnames[i].toUpperCase() +""+colTypes[i].toUpperCase()+ colsiz+"\r\n");
char[] ch = colnames[i].toCharArray();
char c ='a';
if(ch.length>3){
for(int j=0;j <ch.length; j++){


c = ch[j];
if(c == '_'){
if (ch[j+1]>= 'a' && ch[j+1] <= 'z') {
ch[j+1]=(char) (ch[j+1]-32);
}
}
}
}
String str = new String(ch);
colnames[i] = str.replaceAll("_", "");
}
sb.append("*/\r\n");
}
/**
 * 生成所有的方法
 * 
 * @param sb
 */
private void processAllMethod(StringBuffer sb) {
for (int i = 0; i < colnames.length; i++) {
sb.append("\tpublic void set" + initcap(colnames[i]) + "("
+ oracleSqlType2JavaType(colTypes[i],colScale[i],colSizes[i]) + " " + colnames[i]
+ "){\r\n");
sb.append("\t\tthis." + colnames[i] + "=" + colnames[i] + ";\r\n");
sb.append("\t}\r\n");

sb.append("\tpublic " + oracleSqlType2JavaType(colTypes[i],colScale[i],colSizes[i]) + " get"
+ initcap(colnames[i]) + "(){\r\n");
sb.append("\t\treturn " + colnames[i] + ";\r\n");
sb.append("\t}\r\n");
}
}

/**
 * 解析输出属性
 * 
 * @return
 */
private void processAllAttrs(StringBuffer sb) {
sb.append("\tprivate static final long serialVersionUID = 1L;\r\n");
for (int i = 0; i < colnames.length; i++) {
sb.append("\tprivate " + oracleSqlType2JavaType(colTypes[i],colScale[i],colSizes[i]) + " "
+ colnames[i] + ";\r\n");
}
sb.append("\r\n");
}

/**
 * 把输入字符串的首字母改成大写
 * @param str
 * @return
 */
private String initcap(String str) {
char[] ch = str.toCharArray();
if (ch[0] >= 'a' && ch[0] <= 'z') {
ch[0] = (char) (ch[0] - 32);
}
return new String(ch);
}

/**
 * Oracle
 * @param sqlType
 * @param scale
 * @return
 */
private String oracleSqlType2JavaType(String sqlType, int scale,int size) {
if (sqlType.equals("integer")) {
return "Integer";
} else if (sqlType.equals("long")) {
return "Long";
} else if (sqlType.equals("float")) {
return "BigDecimal";
} else if (sqlType.equals("double precision")) {
return "BigDecimal";
} else if (sqlType.equals("number")

[解决办法]
sqlType.equals("decimal")

[解决办法]
 sqlType.equals("numeric")

[解决办法]
 sqlType.equals("real")) {
return scale==0? (size<10? "Integer" : "Long") : "BigDecimal";
}else if (sqlType.equals("varchar")

[解决办法]
 sqlType.equals("varchar2")

[解决办法]
 sqlType.equals("char")

[解决办法]
 sqlType.equals("nvarchar")

[解决办法]
 sqlType.equals("nchar")) {
return "String";
} else if (sqlType.equals("datetime")

[解决办法]
 sqlType.equals("date")

[解决办法]
 sqlType.equals("timestamp")) {
return "Date";
}
return null;
}

/**
 * @param args
 */
public static void main(String[] args) {
MyEntityUtils t = new MyEntityUtils();
t.tableToEntity("TABLE_NAME");
}

}


[解决办法]
生成的类,在你项目的根目录,刷新一下就显示出来了.
[解决办法]
接分的节奏[一百分求解答]实际的情况下java怎么操作数据库

热点排行