玩转MySQL -----当java邂逅MySQL

 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;
	}
	
}

在java中操作数据时要注意的以下几点:

  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.讲一下PrepareStatement和Statement的区别和共同点

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要修复~~~

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值