https://dev.mysql.com/downloads/file/?id=480090 这是jar包,找到并下载好。
并导入MyEclipse中自己项目的lib文件夹下:
然后就可以开始快乐的玩耍了~
java连接数据库 版本1:
package cn.hncu;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import org.junit.Test;
//注意,下面的Connection、DriverManager、Statement和ResultSet都是导的java.sql中的类(或接口),面向java(标准),不是面向具体的数据库实现(公司),否则无法实现跨平台(数据库)
public class DBhello {
@Test
public void demo() throws Exception {
// 1 加载驱动(连接器)
Class.forName("com.mysql.jdbc.Driver");
// 2声明连接串---目的地(哪台机器的哪个数据库,同时可指定编码
String url = "jdbc:mysql://127.0.0.1:3306/abc?useUnicode=true&characterEncoding=utf-8";
// 3(用连接串)建立连接 ※※※※※※
Connection con = DriverManager.getConnection(url, "root", "5959");// 指定用户名和密码
// 4(用连接)创建语句对象(客户端),用该对象执行sql操作
Statement st = con.createStatement();
// 增删改:st.execute(sql)
// st.execute(" insert into stud values('1013','Java',26,'Sun公司') ");
// st.execute(" delete from stud where sno='1013' ");
// st.execute("update stud set age=age*1.1 where age>25");
// 查: st.executeQuery(sql)
ResultSet rs = st.executeQuery("select * from stud");
while (rs.next()) {
String id = rs.getString("sno");
// String name = rs.getString("sname"); 与一行等价
String name = rs.getString(2); // 序号从1开始
Integer age = rs.getInt("age");
String addr = rs.getString("saddress");
System.out.println(id + "," + name + "," + age + "," + addr);
}
con.close();//关流
}
}
java连接数据库 版本1:
结果;
正规的方法是写一个JDBC的工具类,以后通过类名.方法直接调用,欢快而愉悦:
版本2:
package cn.hncu.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* 建立连接
* @author
* version 1.0 2018-5-22 下午3:50:31
*/
public class jdbcUtils {
private static final String driver="com.mysql.jdbc.Driver";//驱动
private static final String Url="jdbc:mysql://localhost:3306/student";//url
private static final String User="root";//数据库用户名
private static final String passWord="****";//登录密码
private static Connection con=null;//初始化Connection
static{//静态块,此处存放加载数据库内容,在类模板就初始化,且只执行一次
try {
//加载类的驱动
Class.forName(driver);
//获得数据库的连接
con=DriverManager.getConnection(Url, User, passWord);
} catch (ClassNotFoundException e) {
System.out.println("找不到数据库!");
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
if(con!=null){
try {
con.close();
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(),e);
}
}
}
}
public static Connection getConnection()
{
return con;
}
}
JDBC的工具类可以用porperties配置文件进行配置,下面是最初始的也是还有许多能改进的版本
版本0:
package cn.hncu.pub;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
//把数据库访问时的"创建连接部分"做成工具,以后项目开发都这么做
public class ConnUtils {
private static Connection conn;
static{
try {
//读取资源文件 properties
Properties p = new Properties();
//当资源文件和当前类存放位置相同时,访问方式: "当前类".class.getResourceAsStream("资源文件名")
//p.load(ConnUtils.class.getResourceAsStream("jdbc.properties"));
//当资源文件放在classpath下 ----用类加载器读
p.load(ConnUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"));
String driver = p.getProperty("driver");
String url = p.getProperty("url");
String user = p.getProperty("username");
String pwd = p.getProperty("password");
Class.forName(driver);
conn = DriverManager.getConnection(url, user, pwd);
//System.out.println("创建一个连接con:"+conn);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
public static Connection getConn(){
return conn;
}
}
1.跨库时表名要写成: 数据库名.表名 ,若是当前库则可省略"数据库名."
@Test
// 演示 跨库查询
public void demo1() throws Exception {
Connection con = ConnUtils.getConn();
Statement st = con.createStatement();
// 跨库时表名要写成: 数据库名.表名 ,若是当前库则可省略"数据库名."
String sql = "select * from abc.person2";
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
String id = rs.getString(1);
String name = rs.getString(2);
String sex = rs.getString(3);
sex = sex.trim().equals("1") ? "男" : "女";
Integer age = rs.getInt(4);
System.out.println(id + "," + name + "," + sex + "," + age);
}
con.close();
}
2.演示st.getXXX()方法:
参数可以使用字段名
参数也可以使用字段的序号 ---注意第一个字段是1
rs中有各种数据类型的get方法
日期时间型数据的获取--读两次
@Test
// 演示 st.getXXX()方法
public void demo2() throws Exception {
Connection con = ConnUtils.getConn();
Statement st = con.createStatement();
String sql = "select * from book";
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
int id = rs.getInt("id"); // 参数可以使用字段名
String name = rs.getString(2); // 参数也可以使用字段的序号 ---注意第一个字段是1
Double price = rs.getDouble("price"); // rs中有各种数据类型的get方法
// 日期时间型数据的获取--读两次
Date d = rs.getDate("birth");// 读取日期
Time t = rs.getTime("birth");// 读取时间
String birth = d + " " + t;
System.out.println(id + "," + name + "," + price + "," + birth);
}
con.close();
}
3.演示StateMent中的几个exeuteXXX()方法:
1)executeQuery(sql)方法:只能执行select语句,且直接返回一个查询结果集ResultSet
2)executeUpdate(sql)方法:不能执行select语句,但可以执行:insert,delete,update。返回值为影响的记录行数
3)execute(sql)方法: 可执行任意sql语句(包括"use abc;"这样的语句), 该方法若执行非select语句时返回false;
执行select语句时返回true且st对象会缓存查询结果直到我们使用为止, 可通过st.getResultSet()来读取
@Test
// 演示 Statement中的三个executeXXX()方法
public void demo3_1() throws Exception {
Connection con = ConnUtils.getConn();
Statement st = con.createStatement();
// 增
// String sql =
// "insert into book values( 3,'XML文档技术',28.88,'2018-07-12 19:42:32')";
// 删
// String sql = "delete from book where id=3";
// 改
// String sql = "update book set price=price/1.1";
// 查
String sql = "select * from book";
boolean boo = st.execute(sql);
if (boo) {// 是查询
ResultSet rs = st.getResultSet();
while (rs.next()) {
int id = rs.getInt("id"); // 参数可以使用字段名
String name = rs.getString(2); // 参数也可以使用字段的序号 ---注意第一个字段是1
Double price = rs.getDouble("price"); // rs中有各种数据类型的get方法
// 日期时间型数据的获取--读两次
Date d = rs.getDate("birth");// 读取日期
Time t = rs.getTime("birth");// 读取时间
String birth = d + " " + t;
System.out.println(id + "," + name + "," + price + "," + birth);
}
}
con.close();
}
@Test
public void demo3_2() throws Exception {
Connection con = ConnUtils.getConn();
Statement st = con.createStatement();
// 增
//String sql = "insert into book(name,price,birth) values('JavaEE',68.88,'2018-09-17 19:42:32')";
// 删
// String sql = "delete from book where id=4";
// 改
String sql = "update book set price=price*1.1";
// 查
//String sql = "select * from book";
int n = st.executeUpdate(sql); //返回影响的行数, 只能执行:insert,update,delete, 不能执行select
System.out.println("n:"+n);
/*
ResultSet rs = st.executeQuery(sql); //只能执行select
while (rs.next()) {
int id = rs.getInt("id"); // 参数可以使用字段名
String name = rs.getString(2); // 参数也可以使用字段的序号 ---注意第一个字段是1
Double price = rs.getDouble("price"); // rs中有各种数据类型的get方法
// 日期时间型数据的获取--读两次
Date d = rs.getDate("birth");// 读取日期
Time t = rs.getTime("birth");// 读取时间
String birth = d + " " + t;
System.out.println(id + "," + name + "," + price + "," + birth);
}
*/
con.close();
}
4.以后凡是有用户输入数据构建sql的,必须使用PrepareStatement
4.1String sql = "insert into stud(sno,sname) values(?,?)"; // 活的 // ---把以后需要用户输入的数据用"占位符"代替
4.2给第一个占位符设置参数 pst.setInt(1,id)
4.3int n = pst.executeUpdate(); // 注意,这里用空参
// ////////以后凡是有用户输入数据构建sql的,必须使用PrepareStatement////////////
@Test
// 能防黑: aa'DD
public void regDemo2() throws Exception {
Connection con = ConnUtils.getConn();
// String sql = "insert into stud(id,name) values('P001','Tom')"; //死的
String sql = "insert into stud(sno,sname) values(?,?)"; // 活的
// ---把以后需要用户输入的数据用"占位符"代替
PreparedStatement pst = con.prepareStatement(sql);
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户id:");
String id = sc.nextLine();
System.out.println("请输入用户名:");
String name = sc.nextLine();
pst.setString(1, id);// 给第一个占位符设置参数 pst.setInt(1,id)
pst.setString(2, name); // 给第二个占位符设置参数
int n = pst.executeUpdate(); // 注意,这里用空参
if (n > 0) {
System.out.println("注册成功!");
}
con.close();
}
5.1、PreparedStatement继承自Statement,都是接口
5.2、PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高
5.3、PreparedStatement:表示预编译的 SQL 语句的对象。PrepareStatement是预编译的sql语句对象,sql语句被预编译并
保存在对象中。被封装的sql语句代表某一类操作,语句中可以包含动态参数“?”,在执行时可以为“?”动态设置参数值。
5.4 、使用PrepareStatement对象执行sql时,sql被数据库进行解析和编译,然后被放到命令缓冲区,每当执行同一个
PrepareStatement对象时,它就会被解析一次,但不会被再次编译。在缓冲区可以发现预编译的命令,并且可以重用。
PrepareStatement可以减少编译次数提高数据库性能。
5.5、statement用于执行静态sql语句,在执行时,必须指定一个事先准备好的sql语句。
后续还有有JDBC工具类的更新~~~还有很多bug要修复~~~