Joeyos's Blog Software Engineer

java使用JDBC连接mysql数据库

2018-04-29
Quan Zhang

这里java的JDK版本为1.8.0X,mysql版本为5.7。mysql的用户名为:root,密码为:zhang110。

下载JDBC驱动

下载JDBC驱动mysql-connector-java-5.1.46.zip,将其解压到java的安装目录(随便哪个路径都行,但是要记住这个路径)。

配置JDBC的环境变量,目的是让电脑任何一个地方的java程序能够调用这个jar包。

“我的电脑”->”属性”->”高级”->”环境变量”->classpath,将”解压路径\mysql-connector-java-5.1.46-bin\mysql-connector-java-5.1.46-bin.jar;”添加到classpath后。

注意:路径一定要访问到.jar文件为止。

创建数据库

用SQLyog数据库管理软件创建Database scutcs:

create database scutcs;
create table student
(
sno char(7) not null,
sname varchar(8) not null,
sex char(2) not null,
bdate date not null,
height dec(5,2) default 000.00,
primary key(sno)
);

然后插入若干数据。

java访问数据库

import java.sql.*;
public class JDBCTest 
{
  public static void main(String[] args)
  {
      // 驱动程序名
      String driver = "com.mysql.jdbc.Driver";
      // URL指向要访问的数据库名scutcs
      String url = "jdbc:mysql://127.0.0.1:3306/scutcs";
      // MySQL配置时的用户名
      String user = "root"; 
      // MySQL配置时的密码
      String password = "zhang110";
      try 
      { 
          // 加载驱动程序
          Class.forName(driver);
          // 连续数据库
          Connection conn = DriverManager.getConnection(url, user, password);
          if(!conn.isClosed()) 
              System.out.println("Succeeded connecting to the Database!");
          // statement用来执行SQL语句
          Statement statement = conn.createStatement();
          //执行SQL语句
          /*
          Statement有三种执行SQL语句的方法:
          1.execute()可执行任何SQL语句,返回一个Boolean值
            如果执行后第一个结果是resultSet,则返回true,否则返回false
          2.executeQuery()执行select语句,返回查询到的结果集
          3.executeUpdate()用于执行DML语句,返回一个整数
            代表被SQL语句影响的记录条数
          */
          // 要执行的SQL语句
          String sql = "select * from student";
          // 结果集
          ResultSet rs = statement.executeQuery(sql);
          System.out.println("-----------------");
          System.out.println("执行结果如下所示:");
          System.out.println("-----------------");
          System.out.println(" 学号" + "\t" + " 姓名");
          System.out.println("-----------------");
          String name = null;
          while(rs.next()) 
          {
              // 选择sname这列数据
              name = rs.getString("sname");
              // 首先使用ISO-8859-1字符集将name解码为字节序列并将结果存储新的字节数组中。
              // 然后使用GB2312字符集解码指定的字节数组
              //name = new String(name.getBytes("ISO-8859-1"),"GB2312");
              // 输出结果
              System.out.println(rs.getString("sno") + "\t" + name);
          }
          rs.close();
          conn.close();
      }
      catch(ClassNotFoundException e)
      {
          System.out.println("Sorry,can't find the Driver!"); 
          e.printStackTrace();
      }
      catch(SQLException e)
      {
          e.printStackTrace();
      }
      catch(Exception e)
      {
          e.printStackTrace();
      }
  }
}

编译执行JDBCTest.java文件,执行结果如下:

Succeeded connecting to the Database!

学号 姓名
201801 张三
201802 李四
201803 王红
201804 冯莉莉

java创建数据表,插入数据

 Statement有三种执行SQL语句的方法:
 1.execute()可执行任何SQL语句,返回一个Boolean值
   如果执行后第一个结果是resultSet,则返回true,否则返回false
 2.executeQuery()执行select语句,返回查询到的结果集
 3.executeUpdate()用于执行DML语句,返回一个整数
   代表被SQL语句影响的记录条数
import java.sql.*;
public class ExecuteDDL 
{
  public static void main(String[] args)
  {
      // 驱动程序名
      String driver = "com.mysql.jdbc.Driver";
      // URL指向要访问的数据库名scutcs
      String url = "jdbc:mysql://127.0.0.1:3306/scutcs";
      // MySQL配置时的用户名
      String user = "root"; 
      // MySQL配置时的密码
      String password = "zhang110";
      try 
      { 
          // 加载驱动程序
          Class.forName(driver);
          // 连续数据库
          Connection conn = DriverManager.getConnection(url, user, password);
          if(!conn.isClosed()) 
              System.out.println("Succeeded connecting to the Database!");
          // statement用来执行SQL语句
          Statement statement = conn.createStatement();
          //执行SQL语句
          /*
          Statement有三种执行SQL语句的方法:
          1.execute()可执行任何SQL语句,返回一个Boolean值
            如果执行后第一个结果是resultSet,则返回true,否则返回false
          2.executeQuery()执行select语句,返回查询到的结果集
          3.executeUpdate()用于执行DML语句,返回一个整数
            代表被SQL语句影响的记录条数
          */
          // 1.创建数据表SQL语句
          String sql_create = "create table if not exists teacher"
          		+ "(tno int auto_increment,"
				+ "tname varchar(8) not null,"
				+ "tsex char(2) not null,"
				+ "tdate date not null,"
				+ "theight dec(5,2) default 000.00,"
				+ "primary key(tno));";
          int rs_create = statement.executeUpdate(sql_create);
          //注意主键“学号”不能重复
          String sql_insert = "insert into teacher"
          		+ "\n"
				+ "values(0,'王小花','女','2018-03-01','168.80'),"
				+ "(0,'韩梅梅','女','2018-04-28','169.70'),"
				+ "(0,'李晓晓','女','2018-02-15','167.65'),"
				+ "(0,'王大锤','男','2018-04-23','178.88'),"
				+ "(0,'赵铁柱','男','2018-12-21','179.35');";
		  int rs_insert = statement.executeUpdate(sql_insert);
          // 2.查询数据表
	      String sql_select = "select * from teacher";
          ResultSet rs_select = statement.executeQuery(sql_select);
          System.out.println("-----------------------------------------------------");
          System.out.println("执行结果如下所示:");
          System.out.println("-----------------------------------------------------");
          System.out.println(" 学号" + "\t" + " 姓名" + "\t" + " 性别" + "\t" + "测试时间" + "\t" + "身高");
          System.out.println("-----------------------------------------------------");
          String tno = null;
          String tname = null;
          String tsex = null;
          String tdate = null;
          String theight = null;
          while(rs_select.next()) 
          {
              // 选择数据
              tno = rs_select.getString("tno");
              tname = rs_select.getString("tname");
              tsex = rs_select.getString("tsex");
              tdate = rs_select.getString("tdate");
              theight = rs_select.getString("theight");
              // 首先使用ISO-8859-1字符集将name解码为字节序列并将结果存储新的字节数组中。
              // 然后使用GB2312字符集解码指定的字节数组
              //name = new String(name.getBytes("ISO-8859-1"),"GB2312");
              // 输出结果
              System.out.println(tno + "\t" + tname + "\t" + tsex + "\t" + tdate + "\t" + theight);
          }
          //rs_create.close();
          rs_select.close();
          conn.close();
      }
      catch(ClassNotFoundException e)
      {
          System.out.println("Sorry,can't find the Driver!"); 
          e.printStackTrace();
      }
      catch(SQLException e)
      {
          e.printStackTrace();
      }
      catch(Exception e)
      {
          e.printStackTrace();
      }
  }
}

编译执行ExecuteDDL.java文件,执行结果如下:

学号 姓名 性别 测试时间 身高
1 王小花 2018-03-01 168.80
2 韩梅梅 2018-04-28 169.70
3 李晓晓 2018-02-15 167.65
4 王大锤 2018-04-23 178.88
5 赵铁柱 2018-12-21 179.35

PreparedStatement 和 Statement

对于两条结构基本相似的SQL语句,只是执行插入时的值不同而已,可以使用占位符(?)参数的SQL语句代替。相比Statement,PreparedStatement具有效率高、无须拼接字符串、可以防止SQL注入等优点。

有人主张:“在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement。也就是说,在任何时候都不要使用Statement。”

mysql.ini配置文件(放在工程文件下):

;mysql配置
[mysql]
;驱动程序名
driver=com.mysql.jdbc.Driver
;URL指向要访问的数据库名scutcs
url=jdbc:mysql://127.0.0.1:3306/scutcs
;用户名
user=root
;密码
password=zhang110

下面将简要比较一下两者的执行100条插入语句的时间:

import java.sql.*;
import java.util.*;//Properties
import java.io.*;//FileInputStream
public class PreparedStatementTest 
{
	/*
	1.PreparedStatement预编译SQL语句性能更好
	2.PreparedStatement无须拼接SQL语句
	3.PreparedStatement可以防止SQL注入,安全
	4.问号提供占位符,executeUpdate执行前用setXXX赋值
	eg:
		PreparedStatement Pstatement = conn.prepareStatement(
			"insert into student values(null,?,1)");
		Pstatement.setString(1,"姓名1");
		Pstatement.setString(2,"姓名2");
		...
		Pstatement.executeUpdate();
	*/
	private String driver;
	private String url;
	private String user;
	private String password;
	public void initParam(String paramFile)throws Exception
	{
		//使用Properties类来加载属性文件
		//load外部配置文件
		Properties props = new Properties();
		props.load(new FileInputStream(paramFile));
		driver = props.getProperty("driver");
		url = props.getProperty("url");
		user = props.getProperty("user");
		password = props.getProperty("password");
		//加载驱动
		Class.forName(driver);
	}
	public void insertUseStatement()throws Exception
	{
		long start = System.currentTimeMillis();
		try(
			//获取数据库连接
			Connection conn = DriverManager.getConnection(url,user,password);
			//使用Connection来创建一个Statement对象
			Statement stmt = conn.createStatement())
		{
			//需要使用100条SQL语句来插入100条记录
			for(int i=0;i<100;i++)
			{
				stmt.executeUpdate("insert into student_table values("
					+ "null,'姓名"+i+"',1)");
			}
			System.out.println("使用Statement费时:"
				+(System.currentTimeMillis()-start));
		}
	}
	public void insertUsePrepare()throws Exception
	{
		long start = System.currentTimeMillis();
		try(
			//获取数据库
			Connection conn = DriverManager.getConnection(url,user,password);
			//使用Connection来创建一个PreparedStatement对象
			PreparedStatement pstmt = conn.prepareStatement(
				"insert into student_table values(null,?,1)"))
		{
			//100次记录时间
			for(int i=0;i<100;i++)
			{
				pstmt.setString(1,"姓名"+i);
				pstmt.executeUpdate();
			}
			System.out.println("PreparedStatement费时:"
				+(System.currentTimeMillis()-start));
		}
	}
	public static void main(String[] args)throws Exception
	{
		PreparedStatementTest pt = new PreparedStatementTest();
		pt.initParam("mysql.ini");
		pt.insertUseStatement();
		pt.insertUsePrepare();
	}
}

执行的结果为:

Statement PreparedStatement
8193 5380

很明显,PreparedStatement的效率要高一些

PreparedStatement创建表并写入实时数据

获得相应位数的字符

public class GetString
{
	public static void main(String[] args)
	{
		String str = "窗前明月光,疑是地上霜。";
		int len = str.length();
		System.out.println(len);
		for(int i=0;i<len;i++)
		{
			System.out.print(str.charAt(i));

		}
		System.out.println();
		for(int i=0;i<len;i=i+2)
		{
			System.out.println(str.substring(i, i+2));
		}
	}
}

获取时间

import java.util.Date;
import java.text.SimpleDateFormat;
public class GetTime
{
	public static void main(String[] args)
	{
		Date day=new Date();    
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
		System.out.println(df.format(day));
	}
}

由于程序执行时间很快,第一列时间不设置为关键字(primary key)。

import java.sql.*;
import java.util.Date;
import java.text.SimpleDateFormat;
public class DataBasic 
{
  public static void main(String[] args)
  {
      // 驱动程序名
      String driver = "com.mysql.jdbc.Driver";
      // URL指向要访问的数据库名scutcs
      String url = "jdbc:mysql://127.0.0.1:3306/scutcs";
      // MySQL配置时的用户名
      String user = "root"; 
      // MySQL配置时的密码
      String password = "zhang110";
      try 
      { 
          // 加载驱动程序
          Class.forName(driver);
          // 连续数据库
          Connection conn = DriverManager.getConnection(url, user, password);
          if(!conn.isClosed()) 
              System.out.println("Succeeded connecting to the Database!");
          // pstatement用来执行SQL语句
          // 1.创建数据表SQL语句
          String sql_create = "create table if not exists databasic"
          		+ "(dtime varchar(19) not null,"
				+ "ddata varchar(4) not null);";
				//+ "primary key(dtime));";
          PreparedStatement pstatementCreate = conn.prepareStatement(sql_create);
          //执行SQL语句
          int rs_create = pstatementCreate.executeUpdate();
          PreparedStatement pstatement = conn.prepareStatement("insert into databasic values(?, ?)");
          String str="EFE334EF6D4A5C3D3A3B7E7EEFE334EF6D4A5C3D3A3B7E7EEFE334EF6D4A5C3D3A3B7E7EEFE334EF6D4A5C3D3A3B7E7E";
          //注意主键“时间”不能重复
          for(int i=0;i<str.length();i=i+4)
          {
				Date time=new Date();
				SimpleDateFormat tf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				//System.out.println(tf.format(time));
				pstatement.setString(1, tf.format(time));
				pstatement.setString(2, str.substring(i, i+4));
				pstatement.executeUpdate();
          }
          // 2.查询数据表
		  String sql_select = "select * from databasic";
          ResultSet rs_select = pstatement.executeQuery(sql_select);
          System.out.println("-----------------------------------------------------");
          System.out.println("执行结果如下所示:");
          System.out.println("-----------------------------------------------------");
          System.out.println(" 时间" + "\t" + "\t" + "\t" + " 数据");
          System.out.println("-----------------------------------------------------");
          String dtime = null;
          String ddata = null;
          while(rs_select.next()) 
          {
              // 选择数据
              dtime = rs_select.getString("dtime");
              ddata = rs_select.getString("ddata");
              // 输出结果
              System.out.println(dtime + "\t" + ddata);
          }
          rs_select.close();
          conn.close();
      }
      catch(ClassNotFoundException e)
      {
          System.out.println("Sorry,can't find the Driver!"); 
          e.printStackTrace();
      }
      catch(SQLException e)
      {
          e.printStackTrace();
      }
      catch(Exception e)
      {
          e.printStackTrace();
      }
  }
}

Similar Posts

Comments