Java基础突击第九天0023(Java连接MySql)

21 篇文章 0 订阅

数据库与Java程序之间的交互是通过专门访问数据库的接口来完成的。

统一访问数据库的模块JDBC

JDBC有连接各种数据库的接口

数据库操作过程:

1.打开数据库服务

2.连接数据库,用户名和密码

3操作数据库

4关闭数据库

JavaDriverManager使用此类可以得到一个数据库的连接。

Connection每一个Connection对象都表示一个数据库连接

数据库操作 Statement PreparedStatement

数据库查询 ResultSet

调用存储过程 CallableStatement

连接数据库要使用链接地址。而且连接有限,应及时关闭。

数据库的驱动程序是由数据库生产商提供的。

下载好connector/j之后,在CLASSPATH中加入.;jar包地址

这里有个问题,用最新版本的有时候会出现莫名其妙的问题

执行程序会各种ClassNotFoundException

换成老版本分分钟解决战斗

用winrar打开jar包,一直到Driver.class

public static final DBDRIVER = "com.mysql.jdbc.Driver";

如果编译错误,一定是classpath出了问题。

打开关闭数据库用DriverManager提供的静态方法getConnection

方法:

public static Connection getConnection(url) throws Exception

public static Connection getConnection(url,name,password) throws Exception

连接地址由数据库生产商提供。

MySQL格式:jdbc:mysql://IP地址:端口号/数据库名称

不过有时候会出现WARNING提示

Tue Jul 10 07:49:27 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

在URL加入useSSL = true或者false即可

//报错程序Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/scott,"root", "123456");

//更改后Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/scott?useSSL=false", "root", "123456");

编写简单程序测试驱动是否可用,数据库是否连接成功

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Demo{
		public static final String DRIVER = "com.mysql.jdbc.Driver";
		public static final String DBURL = "jdbc:mysql://localhost:3306/halem?useSSL=false";
		public static final String DBUSER = "root";
		public static final String DBPASS = "bdrw2013";
		public static void main(String[] args) throws Exception{
				Connection conn = null;

				try{
						Class.forName(DRIVER);
				}catch(ClassNotFoundException e){
						e.printStackTrace();
				}
				try{
						conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
				}catch(SQLException e){
						e.printStackTrace();
				}
				System.out.println(conn);
				try{
						conn.close();
				}catch(SQLException e){
						e.printStackTrace();
				}
		}//main
}//Demo

//output:com.mysql.jdbc.JDBC4Connection@3d646c37

如果打印出conn即可说明连接数据库成功。

如果出现ClassNotFoundException则说明驱动没有配置好,在CLASSPATH中重新配置,或者改用低版本驱动

如果要在java代码中做数据操作。

需要用到Statement对象来执行sql语句

import java.sql.Statement

Statement stmt = conn.createStatement;

stmt.execute(sql);

stmt.close();

如果希望插入变量,则

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class Demo{
		public static final String DRIVER = "com.mysql.jdbc.Driver";
		public static final String DBURL = "jdbc:mysql://localhost:3306/halem?useSSL=false";
		public static final String DBUSER = "root";
		public static final String DBPASS = "bdrw2013";
		public static void main(String[] args) throws Exception{
				Connection conn = null;
				Class.forName(DRIVER);
				String name = "LiTiany";
				char gender = 'F';
				String m_phone = "1830xxxxx63";
				String msn = "87xxxx583@qq.com";
				String email = "87xxxx583@qq.com";
				String blog = "baidu.com";
				conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
				System.out.println(conn);
				Statement stmt = null;
				String sql = "INSERT INTO contacts(NAME,GENDER,M_PHONE,MSN_ID,EMAIL,BLOG_URL)"
					+"values ('"+name+"','"+gender+"','"+m_phone+"','"+msn+"','"+email+"','"+blog+"');";
				stmt = conn.createStatement();
				stmt.executeUpdate(sql);
				stmt.close();
				conn.close();
		}//main
}//Demo

为什么要关闭两次,stmt.close  conn.close

stmt.close:操作关闭

conn.close:数据库关闭

正着打开,倒着关闭

更新第四条:

int id = 4;

String sql = "UPDATE contacts SET name='"+name+"',gender='"+
gender+"',m_phone='"+m_phone+"',msn_id='"+msn+"',email='"+
email+"',blog_url='"+blog+"' WHERE id="+id;

 删除:

String sql = "DELETE FROM contacts WHERE id="+id;

查询需要使用到ResultSet,在JDBC的查询操作,数据库表中的全部查询结果保存在了ResultSet对象中

数据总量过大会出问题。

ResultSet的常用方法

boolean next() throws SQLException   指针移动到下一行

int getInt(int index) throws SQLException / int getInt(String name)throws SQLException

float getFloat/String getString

Date getDate 

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public class Demo{
		public static final String DBDRIVER = "com.mysql.jdbc.Driver";
		public static final String DBURL = "jdbc:mysql://localhost:3306/halem?useSSL=false";
		public static final String DBUSER = "root";
		public static final String DBPASSWORD = "bdrw2013";
		public static void main(String[] args) throws Exception{
				Connection conn = null;
				Statement stmt = null;
				ResultSet rs = null;
				String sql = "SELECT ID,NAME,GENDER,BLOG_URL FROM contacts";
				Class.forName(DBDRIVER);
				conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
				stmt = conn.createStatement();
				rs = stmt.executeQuery(sql);
				while(rs.next()){
						int id = rs.getInt("ID");
						String name = rs.getString("NAME");
						String gender = rs.getString("GENDER");
						String blog = rs.getString("BLOG_URL");
						System.out.print("ID:"+id+",NAME:"+name+",GENDER:"+gender+
							",BLOG:"+blog);
						System.out.println();
				}
				rs.close();
				stmt.close();
				conn.close();
		}//main
}//class Demo

不过ResultSet所有数据都可以通过getString方法取得。

getString("xxx")中xxx是对应数据库字段,记得加双引号。如果是getString(Index)index代表序号,不需要加双引号

int id = rs.getInt(1);

String name = rs.getString(2);

String gender = rs.getString(3);

第二种写起来会容易些。一般建议用第二种进行操作(数字索引)

另外java开发必须写出明确的列,别用*。


PreparedStatement也可以进行数据操作

与直接用Statement不同的是,这个是预编译语句,更快。多次执行的SQL语句经常使用PreparedStatement进行操作。

使用PreparedStatement插入数据时,数据表的指针指向最后一条数据之后,内容是(????)

道理与占座一样,我给A占座,A还没来。

SQL语句形式与Statement没什么不同,不过内容毕竟还没确定,用?占位

PreparedStatement除了继承Statement的所有操作之外,还增加了自己的许多新的操作。

方法:

int executeUpdate() throws SQLException

ResultSet executeQuery() throws SQLException

void setInt(int parameterIndex,int x) throws SQLException

void setFloat(float parameterIndex,float x)throws SQLException

setString; setDate

setDate中的Date是java.sql.Date而不是java.util.Date

使用的话记得转换(SimpleDateFormat)

用PreparedStatement插入一条信息:

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.PreparedStatement;

public class Demo{
	public static final String DBDRIVER = "com.mysql.jdbc.Driver";
	public static final String DBURL = "jdbc:mysql://localhost:3306/halem?useSSL=false";
	public static final String DBUSER = "root";
	public static final String DBPASSWORD = "bdrw2013";
	public static void main(String[] args) throws Exception{
						Connection conn = null;
						PreparedStatement pstmt = null;
						Class.forName(DBDRIVER);
						conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
						String sql = "INSERT INTO contacts(NAME,GENDER,M_PHONE,MSN_ID,EMAIL,BLOG_URL) VALUES (?,?,?,?,?,?)";
						pstmt = conn.prepareStatement(sql);
						pstmt.setString(1,"Chench");
						pstmt.setString(2, "F");
						pstmt.setString(3,"18301362263");
						pstmt.setString(4,"872567583@qq.com");
						pstmt.setString(5,"872567583@qq.com");
						pstmt.setString(6,"872567583@qq.com");
						pstmt.executeUpdate();
						pstmt.close();
						System.out.println(conn);
						conn.close();
	}//main
}

对数据库进行模糊查询

查出姓名或密码含某字的记录

select * from contacts where name like %X% or password like "%X%";

PreparedStatement使用方法

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.DriverManager;
import java.sql.ResultSet;

class Demo{
		public static final String DBDRIVER = "com.mysql.jdbc.Driver";
		public static final String DBURL = "jdbc:mysql://localhost:3306/halem?useSSL=false";
		public static final String DBUSER = "root";
		public static final String DBPASSWORD = "bdrw2013";
		public static void main(String[] args) throws Exception{
				Connection conn = null;
				PreparedStatement pstmt = null;
				ResultSet rs = null;
				String key = "Xun";
				String sql = "SELECT NAME,GENDER,M_PHONE,MSN_ID,EMAIL,BLOG_URL FROM contacts WHERE NAME LIKE ? OR GENDER LIKE ? OR MSN_ID LIKE ?";
				Class.forName(DBDRIVER);
				conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
				pstmt = conn.prepareStatement(sql);
				pstmt.setString(1,"%"+key+"%");
				pstmt.setString(2,"%"+key+"%");
				pstmt.setString(3,"%"+key+"%");
				rs=pstmt.executeQuery();
				while(rs.next()){
						int id = rs.getInt(1);
						String name = rs.getString(2);
						String mphone = rs.getString(3);
						String msnid = rs.getString(4);
						String email = rs.getString(5);
						String blog = rs.getString(6);
				}
				rs.close();
				pstmt.close();
				conn.close();
		}
}

Statement和PreparedStatement用哪个好?

开发中很少使用Statement对象进行操作。因为Statement执行的是一个完整的SQL语句,这样在程序中往往使用拼凑的SQL语句完成。而且用户自己输入数据往往会出现输入非法字符造成程序出错。所以建议PreparedStatement进行操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值