为了掌握和牢固java数据库的知识点,在空闲之余写了这个软件,数据库使用的是Mysql小型数据库,需要安装WAMP软件。也可以使用大型数据库甲骨文数据库,不知为何,中型的SQL Serve 2012数据库我一直没有连接成功。
本软件完成所需要的材料:
数据管理系统软件可以让用户自定义需要创建的表,自定义表的字段的类型,属性,轻松插入数据,修改数据,查找数据,删除数据,利用各种统计图选择属性进行比较和走向趋势。例如管理学生信息,成绩和绩点比较,还可以将数据导出成为表格文件并利用打印机打印出来。
java连接mysql数据库需要相关的驱动,因为要连接mysql数据库,需要导入相关的封装好的类就是封装好的jar包,叫sqljdbcxx.jar,由于jdk版本不一样,所以需要不一样的xx版本对应的jar,在这里我使用的是sqljdbc42.jar,各种版本百度随便一搜就有了.
wamp状态为绿色则表示配置ok,可以正常使用sql服务,图如下
做好这些准备后我们就可以尝试连接数据库了
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
import com.microsoft.sqlserver.jdbc.SQLServerException;
import com.mysql.jdbc.PreparedStatement;
//连接数据库要导入的一些模块
Connection ct = null; //新建一个连接对象
String dbURL="jdbc:mysql://localhost:3306/"+dbURL_+"?useUnicode=true&characterEncoding=UTF8"; //定义好要连接sql的数据库和一些字符编码设置
String sql = "select * from greens;"; //等会执行的sql语句 greens是要查询数据的表
try {
//加载驱动
Class.forName("com.microsoft.mysql.jdbc.mysqlDriver").newInstance();
} catch (InstantiationException e) {
wamp.setContentText("加载驱动有错误");
}
ct = DriverManager.getConnection(dbURL,"root",""); //连接数据库 mysql phpadmin默认的管理员是root,密码为空
if(ct!=null) { //如果连接的数据库不存在或者登入失败,dbURL语法错误(端口占用等等)
try {
re = ct.createStatement().executeQuery(sql); //执行sql语句,对表greens进行查询
} catch (SQLException e) {
wamp.setContentText("sql语句执行失败");
}
}
如果没有问题(返回的ct不为空),那么将成功查询到greens中的数据
在软件中,我使用了用户输入来登入并连接数据库的输入框
登入成功后将显示连接的数据库和表
右边的表选择器有这个数据库的所有表
首先 ,我们需要知道新建数据库的java代码,如下:
sqlCommand = "Create database "+newDB; //新建数据库的名
//先连接数据库
/*..上面的代码..*/
//连接成功后执行语句,更上面一样
ct.createStatement().execute(sqlCommand); //执行了之后新建的数据库就在
//先进行连接数据库
String SQLcommand = "delete from "+tab+" where "+column1+" = "+column1Value+";";
//然后执行SQLcommand 语句
ct.createStatement().execute(SQLcommand);
一般来说,表的第一个字段就是它的id,id是每个数据的身份证,在数据库中找到它并且执行语句就可以将id符合的删除.函数返回了一个字符串用来告诉用户删除是否成功,函数代码如下:
public String deleteTableData(String user,String pass,String db,String tab,String column1,String column1Value) {
// 用户账号 密码 数据库 表 字段名 字段值
//大多数默认情况是第一列是身份证标识,不可以存在重复的数据,不然将匹配多个。
String result = "删除成功!";
String dbURL = "jdbc:mysql://localhost:3306/"+db+"?seUnicode=true&characterEncoding=UTF8";
String SQLcommand = "delete from "+tab+" where "+column1+" = "+column1Value+";"; //主要sql语句知识点
Connection ct = null;
try {
ct = DriverManager.getConnection(dbURL, user, pass);
if(ct!=null) {
ct.createStatement().execute(SQLcommand);
result = "删除完毕!";
}
} catch (SQLException e) {
result = "SQL连接失败";
}
return result;
}
建表比较复杂,它需要收集用户建立的字段数和字段属性,字段属性长度,数据判断是否合法,类型之间的关系
代码如下:
//用户的每个字段我用ArrayList来储存,长度值,字段类型同理
fullOfTabDataName = new ArrayList<>();
fullOfTabDataType = new ArrayList<>();
fullOfTabDataLength = new ArrayList<>();
//...一些方法收集用户的数据
//然后提交
public String tabCreate(String db,String user,String pass,
ArrayList<String> tabName_and_columnName,ArrayList <String> type,
ArrayList<String> length) {
//参数有(数据库 用户 密码 表的名和字段名整合的一个arraylist数组 字段类型数组 字段长度数组)
String result = "新建表成功!";
Connection ct = null;
ArrayList<String> language = new ArrayList<>();
String dbURL="jdbc:mysql://localhost:3306/"+db+"?useUnicode=true&characterEncoding=UTF8";
//尝试加载驱动
try {
ct = DriverManager.getConnection(dbURL,user,pass);
} catch (SQLException e) {
//System.out.println("连接失败:\n"+e.getMessage()+"\n"+e.getSQLState()+"\n"+e.getErrorCode()+"\n"+e.getLocalizedMessage());
result = "连接数据库时有错误,错误类型1:"+e.getMessage();
}
if(ct == null) {
result = "连接数据库"+db+"不成功。";
}
else {
//类型转高级语言码
//这里我只写了两种类型的语言转化,后面更新软件的版本会继续添加更多类型
for(int j = 0;j<type.size();j++) {
if(type.get(j).equals("文本")) {
language.add("char");
}
else if(type.get(j).equals("整数")) {
language.add("int");
}
else {
language.add("char");
}
}
}
StringBuilder sql = new StringBuilder(); //确定建表时将要执行的sql语句
sql.append("create table "+tabName_and_columnName.get(0).toString()+"(");
for (int i = 0;i<(tabName_and_columnName.size()-1);i++) {//因为 0是表名 所以-1 再-1是为了控制格式
if(i<(tabName_and_columnName.size()-1)-1)
if(language.get(i).equals("char")) {
sql.append(tabName_and_columnName.get(i+1)+" "+language.get(i)+" ("+length.get(i)+"),");
}
else
sql.append(tabName_and_columnName.get(i+1)+" "+language.get(i)+",");
else
if(language.get(i).equals("char")) {
sql.append(tabName_and_columnName.get(i+1)+" "+language.get(i)+" ("+length.get(i)+") )");
}
else
sql.append(tabName_and_columnName.get(i+1)+" "+language.get(i)+")");
}
try {
sql.append(" engine= Innodb charset=utf8;");
System.out.println(sql);
ct.createStatement().execute(sql.toString());
} catch (SQLException e) {
result = "执行语句失败,原因可能有如下等\n1.表名跟数据库里所拥有的表重复\n2.中文(表/字段)名没有加双引号\n3.执行的sql语句错误";
}
return result;
}
结果如下:
点击确定时提示建的表的所有字段
这时候我们返回到主界面查看所建立的表
新的表建好了,我们可以往这个表添加数据,java的数据库增加数据代码主要如下:
//最基本的知识点
String result = "执行成功,成功插入";
Connection ct = null;
String sqlCommand = "insert into "+tab+" values(";
for(int i = 0;i<insert_column_data.size();i++) {
if(i <insert_column_data.size()-1)
sqlCommand = sqlCommand+insert_column_data.get(i)+",";
else
sqlCommand = sqlCommand+insert_column_data.get(i)+")";
}
//sqlCommand是 将要执行的sql语句
//下面进行连接数据库 和 执行sqlCommand语句
String db_reference = "jdbc:mysql://localhost:3306/"+db+"?useUnicode=true&characterEncoding=UTF8";
try {
ct = DriverManager.getConnection(db_reference, user, pass);
if(ct!=null) {
try {
ct.createStatement().execute(sqlCommand);
}
catch(Exception error2) {
result = "执行的时候出错,请检查数据合法性";
}
}
else {
result = "数据库出差错了。";
}
}catch(Exception e) {
result = "连接数据库时出错了。";
}
return result;
}
我们使用GUI界面编程的时候怎么知道这个表有多少个字段 或者字段类型 字段长度呢?
代码如下:
ArrayList<String>wait_insert_column_eachName = new ArrayList<>();
ArrayList<String>wait_insert_column_eachType ;
ArrayList<String>wait_insert_column_eachType_size ; //大小
//下面类的三个方法 分别得到
//表的每个字段的名字
//表的每个字段类型 比如 int
//表的每个字段的类型的长度
column_eachName = SQL.getColumnName(curr_db, curr_user, curr_pass, curr_tab);
wait_insert_column_eachType= SQL.each_getColumn_type(curr_db, curr_user, curr_pass, curr_tab);
wait_insert_column_eachType_size = SQL.each_getColumn_type_size(curr_db, curr_user, curr_pass, curr_tab);
三个方法具体实现如下
public List<String>getColumnName(String dbURL_2,String name_2,String pass_2,String sql2){
//参数: 数据库 用户名 密码 表
List<String>name= new ArrayList<>(); //返回所有字段名字
Connection ct = null;
String dbURL="jdbc:mysql://localhost:3306/"+dbURL_2+"?useUnicode=true&characterEncoding=UTF8";
ResultSet re2 = null;
sql2 = "select * from "+sql2+";";
try {
try {
try {
Class.forName("com.microsoft.mysql.jdbc.mysqlDriver").newInstance();
System.out.println("连接成功、");
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
//System.out.println("加载数据库成功");
} catch (ClassNotFoundException e) {
//System.out.println("加载数据库失败了");
}
ct = DriverManager.getConnection(dbURL,name_2,pass_2);
} catch (SQLException e) {
//System.out.println("连接失败:\n"+e.getMessage()+"\n"+e.getSQLState()+"\n"+e.getErrorCode()+"\n"+e.getLocalizedMessage());
}
if(ct!=null) {
try {
re2 = ct.createStatement().executeQuery(sql2);
ResultSetMetaData data = re2.getMetaData();
for(int i = 0;i<data.getColumnCount();i++) {
name.add(data.getColumnName(i+1));
}
} catch (SQLException e) {
re2 = null;
}
try {
ct.close();
} catch (SQLException e) {
System.out.println("关闭失败");
}
}
return name;
}
public ArrayList<String>each_getColumn_type(String dbURL_2,String name_2,String pass_2,String sql2){
// 数据库 用户名 密码 表
ArrayList<String> resu = new ArrayList<>();
Connection ct = null;
String dbURL="jdbc:mysql://localhost:3306/"+dbURL_2+"?useUnicode=true&characterEncoding=UTF8";
ResultSet re2 = null;
sql2 = "select * from "+sql2+";";
try {
ct = DriverManager.getConnection(dbURL,name_2,pass_2);
} catch (SQLException e) {
System.out.println("出错");
}
if(ct!=null) {
try {
re2 = ct.createStatement().executeQuery(sql2);
ResultSetMetaData data = re2.getMetaData();
for(int i = 0;i<data.getColumnCount();i++) {
resu.add(data.getColumnTypeName(i+1));
}
} catch (SQLException e) {
re2 = null;
}
try {
ct.close();
} catch (SQLException e) {
System.out.println("关闭失败");
}
}
return resu;
}
public ArrayList<String>each_getColumn_type_size(String dbURL_2,String name_2,String pass_2,String sql2){
// 数据库 用户名 密码 表
ArrayList<String> resu = new ArrayList<>();
Connection ct = null;
String dbURL="jdbc:mysql://localhost:3306/"+dbURL_2+"?useUnicode=true&characterEncoding=UTF8";
ResultSet re2 = null;
sql2 = "select * from "+sql2+";";
try {
ct = DriverManager.getConnection(dbURL,name_2,pass_2);
} catch (SQLException e) {
System.out.println("出错");
}
if(ct!=null) {
try {
re2 = ct.createStatement().executeQuery(sql2);
ResultSetMetaData data = re2.getMetaData();
for(int i = 0;i<data.getColumnCount();i++) {
resu.add(String.format("%d",data.getColumnDisplaySize(i+1)));
// System.out.println(String.format("%d",data.getColumnDisplaySize(i+1)));
}
} catch (SQLException e) {
re2 = null;
}
try {
ct.close();
} catch (SQLException e) {
System.out.println("关闭失败");
}
}
return resu;
}
三个函数返回的都是装满了数据的arrayList<‘string’>数组,得到了就可以确定输入数据的字段数是多少了,
每个字段的类型是什么,长度限制等等
结果如下:
系统自动判断了该表有8个字段 ,每个字段的类型 ,每个字段类型的长度,下面进行添加数据
好了,数据插入成功有提示,提示 或者不提示你成功插入数据 可以在设置里改(后面有说明)
有时候需要查找并且删除详细资料,代码流程如下:
//连接数据库
//执行语句
//获取结果
结果如下: