spring boot使用jpa,可不可以动态生成数据库表

spring boot使用jpa,可不可以动态生成数据库表,第1张

看我的BaseModel

public class BaseModel implements Serializable {

@Id

@GeneratedValue(strategy = GenerationTypeAUTO)

@Column(name = "id")

private Long id;

protected BaseModel(){

thisid = 1L;

}

public Long getId() {

return id;

}

public void setId(Long id) {

thisid = id;

}

public boolean equals(Object other) {

if (other == null || othergetClass() != thisgetClass())

return false;

if(thisgetId() == null || ((BaseModel) other)getId() == null) return false;

return thisgetId()equals(((BaseModel) other)getId());

}

public int hashCode() {

return new HashCodeBuilder()append(getId())toHashCode();

}

}

这里的BaseModel是我的实体类的父类,我错误的原因是序列化没有重写好equals函数,因为动态生成sql语句的时候主键默认为null,无法识别这是不是一个新的对象(我的理解),所以重写的时候多了

if(thisgetId() == null || ((BaseModel) other)getId() == null) return false;

因为主键不为空,为null肯定不相等。我就这样解决了,不知道能不能帮到你了。

create or replace procedure sp_crt_tbl_from_dic(p_src_tbl varchar2,

p_tgt_tbl_name varchar2,

p_prt_flg varchar2,

p_tx_date varchar2) is

v_col varchar2(500) := '';

v_col_data_type varchar2(100) := '';

v_sql varchar2(25000) := '';

v_col_list varchar2(20000) := ' ';

v_prt_sql varchar2(2000) := '';

v_grant_sql varchar2(2000) := '';

v_crt_syn_sql varchar2(2000) := '';

v_drop_tbl_sql varchar2(2000) := '';

i_tbl_cnt number(1, 0) := 0;

v_step_no varchar2(3) := '';

begin

--step 1

v_step_no := '1';

select count(1) into i_tbl_cnt from tabs where table_name = p_src_tbl;

if (i_tbl_cnt = 0) then

sp_log('sp_crt_tbl', v_step_no, '3', p_tx_date, p_src_tbl || '不存在');

return;

end if;

--step 2

v_step_no := '2';

select count(1)

into i_tbl_cnt

from tabs

where table_name = p_tgt_tbl_name;

if (i_tbl_cnt > 0) then

v_drop_tbl_sql := 'drop table ' || p_tgt_tbl_name;

execute immediate v_drop_tbl_sql;

end if;

v_step_no := '1';

sp_log('sp_crt_tbl_from_dic',v_step_no,'1',p_tx_date,p_tgt_tbl_name || '建表开始');

v_sql := 'create table ' || p_tgt_tbl_name || '(';

v_col := '';

v_col_data_type := '';

v_col_list := '';

for cur_col_name in (

SELECT TCOLUMN_NAME col_name,

CASE WHEN TDATA_TYPE IN ('VARCHAR2', 'CHAR') THEN TDATA_TYPE || '(' || TDATA_LENGTH || ')'

WHEN TDATA_TYPE IN ('NUMBER') THEN TDATA_TYPE || '(' || TDATA_PRECISION || ',' || TDATA_SCALE || ')'

WHEN TDATA_TYPE IN ('DATE') THEN TDATA_TYPE ELSE '' END col_data_type

FROM COLS T

where TTABLE_NAME = p_src_tbl

order by to_number(TCOLUMN_ID)) loop

v_col := trim(cur_col_namecol_name);

v_col_data_type := trim(cur_col_namecol_data_type);

v_col_list := trim(v_col_list) || trim(v_col) || ' ' || trim(v_col_data_type) || ',';

end loop;

v_sql := trim(v_sql) || trim(v_col_list) || ')';

v_sql := replace(v_sql, ',)', ')');

if (p_prt_flg = '1') then

v_prt_sql := ' partition by range (part_id) (partition prt_1 values less than(2),partition prt_2 values less than(3),partition prt_3 values less than(4),partition prt_4 values less than(5))';

v_sql := v_sql || v_prt_sql;

end if;

execute immediate v_sql;

sp_log('sp_crt_tbl_from_dic',v_step_no,'2',p_tx_date,p_tgt_tbl_name || '建表开始结束');

v_step_no := '2';

sp_log('sp_crt_tbl_from_dic', v_step_no,'1',p_tx_date,p_tgt_tbl_name || '赋权限开始');

v_grant_sql := 'grant select,insert,update,delete on ' || p_tgt_tbl_name ||

' to iclientoopr,iclientomoia';

if (v_grant_sql is not null) then

execute immediate v_grant_sql;

end if;

--- 给OPERQRY赋权限

v_grant_sql := 'grant select on ' || p_tgt_tbl_name || ' to OPERQRY';

if (v_grant_sql is not null) then

execute immediate v_grant_sql;

end if;

sp_log('sp_crt_tbl_from_dic',v_step_no,'2',p_tx_date,p_tgt_tbl_name || '赋权限结束');

--创建日标同义词

--step 4

v_step_no := '3';

v_crt_syn_sql := 'create or replace public synonym ' || p_tgt_tbl_name ||

' for iclientodata' || p_tgt_tbl_name;

if (v_crt_syn_sql is not null) then

execute immediate v_crt_syn_sql;

end if;

sp_log('v_crt_syn_sql',v_step_no,'2',p_tx_date,p_tgt_tbl_name || '创建结束');

exception

when others then

sp_log('sp_crt_tbl_from_dic',v_step_no,'3',p_tx_date,p_tgt_tbl_name || '创建异常:' || SQLERRM);

end;

1这个不好做,如果说要修改hibernate的文件话也是要重启服务器的,意义就不是很大了。

2你的想法还是可以实现的,生成文件+创建表都在java中作。无非是create一个表(表列组装),一个java实体类文件,hibernate映射文件,修改hibernate配置文件,不过比较麻烦了。

3建议:不要使用hibernate,使用jdbc+自己的一个映射文件。

下面是一个简单的连接MySQL数据库,并 *** 作数据库表的例子:

import javasql;

public class TestMysql {

public static void main(String[] args) {

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

try {

//加载驱动

ClassforName("commysqljdbcDriver");

//创建连接

conn = DriverManager

getConnection("jdbc:mysql://localhost/bbsuser=用户名&password=密码");

stmt = conncreateStatement();

rs = stmtexecuteQuery("select from user");

while (rsnext()) {

String user = rsgetString(1);

String password = rsgetString(2);

Systemoutprintln("用户名:" + user + "," +" 密码:" + password );

}

} catch (ClassNotFoundException ex) {

exprintStackTrace();

} catch (SQLException ex) {

exprintStackTrace();

} finally {

try {

if (rs != null) {

rsclose();

rs = null;

}

if (stmt != null) {

stmtclose();

stmt = null;

}

if (conn != null) {

connclose();

conn = null;

}

} catch (SQLException e) {

eprintStackTrace();

}

}

}

}

当然前提是要把MySQL的连接驱动JAR文件添加到工程里

首先创建一个基于对话框的MFC应用程序ADO_Accesssln然后在stdafxh头文件末尾添加(网上有说在某个#include后面的添加的,也有说在合适位置添加的,我这里直接添加在最末尾)

#import "C:\Program Files\Common Files\System\ado\msado15dll"    no_namespace rename("EOF", "adoEOF")

添加完成后#import下面会出现红色波浪线提示错误, 然后最好是执行一次生成解决方案,会提示生成成功,但是红色波浪线依然在,之前自己被它困扰好久,网上有说不用理会的,之前没理会也确实后来就莫名其妙的不见了,现在我知道了,当生成成功后左下角仍然提示正在分析····文件,等待分析完了红色波浪线也就消失了。

第二步,在ADO_AccessDlhh 类里的public下添加 _ConnectionPtr m_pConnection;//连接access数据库的链接对象 _RecordsetPtr m_pRecordset;//结果集对象

第三步,初始化数据库连接。 在ADO_AccessDlh类的OnInitDialog()初始化成员函数里添加如下代码:

数据库连接就没问题了,剩下的就是功能模块了。

以上就是关于spring boot使用jpa,可不可以动态生成数据库表全部的内容,包括:spring boot使用jpa,可不可以动态生成数据库表、oracle 如何动态创建表、Java高手进来。。怎么动态建表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9794004.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存