这部分也是所谓JDBC、网站数据源的内容,把名字弄得很高深似得,实际上只是Java中对Mysql数据库的增删改查的内容。非常简单,之前写了这么多Mysql的内容,没好好总结一下,实在是不应该。今天就实现一个Java中对Mysql数据库的增删改查,随便带点Java取出当前系统的系统名与系统时间的知识,完成一个还算有点意思的小例子。
一、基本目标
首先,在Mysql数据库中有一张名为testtable的空表,id为自增列,username,class都是文本列,但是class里面都存放数字,也就是整形,我们以后在Java中取出这一列要当作整形处理。
每次执行程序,程序都会向里面的username插入当前的系统名(不会变的)与当前系统的时分秒(会变的),毫秒、年月日就不插入了,因为超出整形的范围,这也不是什么问题,但是为了避免程序过于复杂,就不引入《【Java】自从有了BigInteger,我再也不用担心要处理的数据有多大了》(点击打开链接)的内容了。
二、制作过程
1、首先,Java要连接Mysql数据库,不像asp链接Access,c#链接SQL Server那样,都是自带好的。毕竟那是人家微软的配备,虽然我们还是经常使用windows来编程、开发,但是我们还要从网上下载一个mysql-connector-java-5.1.32.jar的东西,这个东西在Mysql的官网已经无从可考了,里面没有跨平台的版本,就一个Windows版本的msi安装文件,各位还是网上搜一下mysql-connector-java吧,版本号不重要,就没见过代码写正确还连接失败的。
2、然后,在你的工程目录下面新建一个lib文件夹,把这个mysql-connector-java-5.1.32.jar放进去,不叫这个名字也可以,但是据说业内基本都这样弄,某些公司不这样甚至还会弄给上面那个已经越来越不会写代码的经理骂的
3、之后,右击你的工程选择“属性”
4、在Java Build Path的标签页,选择Add JARs...,在lib文件夹中找到刚才放进来的mysql-connector-java-5.1.32.jar,之后点击确定就可以开始愉快地写代码了
5、首先你要在开头引入下面的东西:
import java.sql.*;
import java.text.*;
import java.util.*;
import java.util.Date;
为了能够获取当前的时间,同时下面也使用到ArrayList动态数组,这东西是什么,请翻我之前的《【Java】Java中的Collections类——Java中升级版的数据结构》(
点击打开链接),必须在文件头引入import java.util.*;,由于sql类里面同样有Date()这个类,因此必须多加一句import java.util.Date;消除歧义,import java.text.*;同样是为了之后对系统当前的时间处理的时候使用了,不然只能获取从1970年元旦到现在的毫秒数
6、之后写一个数据库链接类Dbcon
class Dbcon {
// 此处连接数据库,独立开一个类,以后操作数据库的每次连接就不用写这么多
public Connection getCon() {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver");
// 其中test是我们要链接的数据库,user是数据库用户名,password是数据库密码。
// 3306是mysql的端口号,一般是这个
// 后面那串长长的参数是为了防止乱码,免去每次都需要在任何语句都加入一条SET NAMES UTF8
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useOldAliasMetadataBehavior=true";
String user = "root";
String password = "root";
con = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
}
7、之后就是整个程序的核心如何操作数据库:
public class JavaDbTest {
public static void main(String[] args) {
//这里是数据库的链接
Connection con = new Dbcon().getCon();
String sql = null;
// 这样能够获取当前操作系统的名字
//数据库插入操作的开始,修改与查询的道理一样,就不做了,请修改下面sql字符串中的sql语句
String username = System.getProperty("os.name");
// 这样能够获取当前的时间,但必须在文件头引入import java.util.*;
// 由于sql类里面同样有Date()这个类,因此必须多加一句import java.util.Date;消除歧义
String classString = new SimpleDateFormat("hhmmss").format(
new Date(System.currentTimeMillis())).toString();
sql = "INSERT INTO testtable(username,class) VALUES ('" + username
+ "','" + classString + "') ";
// 注意:操作数据库的语句Insert into,update与查询数据库的语句select在Java的语句是不同的
// 操作数据库为con.createStatement().execute(sql);
// 查询数据库为rs=con.prepareStatement(sql).executeQuery();且查询结果必须被ResultSet对象rs接住
try {
con.createStatement().execute(sql);
// 弄完之后人走带门
con.close();
} catch (Exception e) {
e.printStackTrace();
}
sql = "select * from testtable";
ResultSet rs = null;
// 这几个存放查询结果的ArrayList一定要放在try-catch的外围,注意变量有效范围
ArrayList<Integer> idArraylist = new ArrayList<Integer>();
ArrayList<String> usernameArraylist = new ArrayList<String>();
ArrayList<Integer> classArraylist = new ArrayList<Integer>();
try {
rs = con.prepareStatement(sql).executeQuery();
// 这个循环的结果是把整个查询结构读出来
while (rs.next()) {
// 取出各个列打印出来
idArraylist.add(rs.getInt("id"));
usernameArraylist.add(rs.getString("username"));
// 纵使class一列全是数字,但是由于这一列用的是varchar来存储
// 如果要把class当作整形处理,因此不可用rs.getInt,只能先以String取出来再擦写为整形
rs.getString("class");
classArraylist.add(Integer.parseInt(rs.getString("class")));
}
// 弄完之后人走带门
con.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("id username class");
for (int i = 0; i < idArraylist.size(); i++)
System.out.println(idArraylist.get(i) + " "
+ usernameArraylist.get(i) + " " + classArraylist.get(i));
}
}
8、至此,整个程序连起来就是这样的:
package test;
import java.sql.*;
import java.text.*;
import java.util.*;
import java.util.Date;
class Dbcon {
// 此处连接数据库,独立开一个类,以后操作数据库的每次连接就不用写这么多
public Connection getCon() {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver");
// 其中test是我们要链接的数据库,user是数据库用户名,password是数据库密码。
// 3306是mysql的端口号,一般是这个
// 后面那串长长的参数是为了防止乱码,免去每次都需要在任何语句都加入一条SET NAMES UTF8
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useOldAliasMetadataBehavior=true";
String user = "root";
String password = "root";
con = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
}
public class JavaDbTest {
public static void main(String[] args) {
//这里是数据库的链接
Connection con = new Dbcon().getCon();
String sql = null;
// 这样能够获取当前操作系统的名字
//数据库插入操作的开始,修改与查询的道理一样,就不做了,请修改下面sql字符串中的sql语句
String username = System.getProperty("os.name");
// 这样能够获取当前的时间,但必须在文件头引入import java.util.*;
// 由于sql类里面同样有Date()这个类,因此必须多加一句import java.util.Date;消除歧义
String classString = new SimpleDateFormat("hhmmss").format(
new Date(System.currentTimeMillis())).toString();
sql = "INSERT INTO testtable(username,class) VALUES ('" + username
+ "','" + classString + "') ";
// 注意:操作数据库的语句Insert into,update与查询数据库的语句select在Java的语句是不同的
// 操作数据库为con.createStatement().execute(sql);
// 查询数据库为rs=con.prepareStatement(sql).executeQuery();且查询结果必须被ResultSet对象rs接住
try {
con.createStatement().execute(sql);
// 弄完之后人走带门
con.close();
} catch (Exception e) {
e.printStackTrace();
}
sql = "select * from testtable";
ResultSet rs = null;
// 这几个存放查询结果的ArrayList一定要放在try-catch的外围,注意变量有效范围
ArrayList<Integer> idArraylist = new ArrayList<Integer>();
ArrayList<String> usernameArraylist = new ArrayList<String>();
ArrayList<Integer> classArraylist = new ArrayList<Integer>();
try {
rs = con.prepareStatement(sql).executeQuery();
// 这个循环的结果是把整个查询结构读出来
while (rs.next()) {
// 取出各个列打印出来
idArraylist.add(rs.getInt("id"));
usernameArraylist.add(rs.getString("username"));
// 纵使class一列全是数字,但是由于这一列用的是varchar来存储
// 如果要把class当作整形处理,因此不可用rs.getInt,只能先以String取出来再擦写为整形
rs.getString("class");
classArraylist.add(Integer.parseInt(rs.getString("class")));
}
// 弄完之后人走带门
con.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("id username class");
for (int i = 0; i < idArraylist.size(); i++)
System.out.println(idArraylist.get(i) + " "
+ usernameArraylist.get(i) + " " + classArraylist.get(i));
}
}