mysql===JDBC

版权声明:转载请指明出处 https://blog.csdn.net/weixin_42321963/article/details/82053187
.net
	ado.net
	ado
	odbc

php 
	pdo

java 
	jdbc

java JDBC是什么?
	Java DataBase Connectivity,java数据库连接  java 操作数据库的API

	1)下载 mysql 的 jdbc驱动包  mysql.jar 
		https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java-8.0.11.zip

		mysql-connector-java-8.0.11.zip
		解压  打开  mysql-connector-java-8.0.11.jar
	

	2)eclipse 建立java项目 复制mysql-connector-java-8.0.11.jar 建立classpath

	3)测试代码
		package com;

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

		public class Demo {
			public static void main(String[] args) {
				try {
					//加载mysql8.0.11 官方jdbc 驱动jar文件
					Class.forName("com.mysql.cj.jdbc.Driver");
					
					//建立数据库连接
					String url = "jdbc:mysql://localhost:3306/db?user=root&serverTimezone=PRC&useSSL=false";
					Connection conn = DriverManager.getConnection(url);
					
					//建立预处理语句对象
					PreparedStatement pst = conn.prepareStatement("select id,name,score from student");
					ResultSet rs = pst.executeQuery();
					while(rs.next()) {
						System.out.printf("学号:%d,姓名:%s,成绩:%d分。\n",rs.getInt("id"),rs.getString("name"),rs.getInt(3));
					}
					rs.close();
					pst.close();
					conn.close();
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}



JDBC java API
	DriverManager 驱动管理器类
	
	Connection 接口

	Statement 接口 基本语句对象,简单快速,但没有参数替换功能,不能防SQL注入,建立不使用
			Statement st = conn.createStatement();
			ResultSet rs = st.executeQuery("select count(*) from stu");// select

			double money = 2000;
			int id = 201604;
			String name = "李强";
			String sql = "update stu set name='" + name + "', money=" + money + " where id=" + id;
			System.out.println(sql);
			st.executeUpdate(sql);
			//st.executeUpdate("delete from stu where false");
			// st.execute(sql) ddl
			// st.executeUpdate(sql) insert delete update
			// while(rs.next()) {
			// System.out.println(rs.getString("name"));
			// }
			// rs.last();
			// System.out.println(rs.getRow()); //返回记录总数

			// System.out.println(rs.isFirst()); //false
			// System.out.println(rs.isBeforeFirst());//true
			// System.out.println(rs.isLast());//false
			// System.out.println(rs.isAfterLast());//false

			// if(rs.isBeforeFirst()) {
			// System.out.println("有查询结果");
			// }

			// if(rs.isBeforeFirst()) {
			// rs.next();
			// System.out.println(rs.getInt(1));
			// }

			// rs.next();
			// rs.next();
			// rs.next();
			// rs.last(); //游标调到最后
			// rs.previous();//游标上移一条
			// rs.absolute(3);//游标绝对定位到第三行
			// rs.first();//游标移第一条
			// rs.next();//游标下移一条

			// 判断位置,返回boolean 类型
			// rs.isAfterLast(); //判断游标是不是在最后一条记录之后
			// rs.isBeforeFirst();//第一条之前
			// rs.isFirst();//是不是第一条位置
			// rs.isLast();//是不是后一条位置
			// System.out.println(rs.getString("name"));
			// System.out.println(rs.getInt("id"));			
			st.execute("create table tttt555(t int)");
			rs.close();

	PreparedStatement 接口	预处理语句对象,可以参数替换,有效防止SQL注入  执行sql语句
			//String sql = "select count(*) from stu";
			//PreparedStatement pst = conn.prepareStatement(sql);
			//ResultSet rs = pst.executeQuery();
			//rs = pst.executeQuery("select * from stu");
			//if(rs.next()) {
			//	System.out.println(rs.getInt(1));
			//}
			//while(rs.next()) {
			//	System.out.println(rs.getString("name"));
			//}
			//rs.close();
			//pst.close();
			
			//String sql = "update stu set money=money+?";
			//PreparedStatement pst = conn.prepareStatement(sql);
			//pst.setString(1,"李四四");
			//pst.setDouble(2, 6000d);
			//pst.setInt(3,201607);
			
			//pst.setDouble(1,10d);
			//int r = pst.executeUpdate(); //插入或修改 或删除影响的行数
			//System.out.println(r);
			
			String sql = "insert into stu values(null,?,?,?,?,?)";//位置从1开始
			PreparedStatement pst = conn.prepareStatement(sql);
			pst.setInt(2,99);
			pst.setString(1,"赵五");
			//pst.setString(3, "1985-10-20");  //对日期操作,可以当成字符串
			//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			//Date dd = new Date(sdf.parse("1985-1-1 08:30:20").getTime());
			//pst.setDate(3, dd);
			//Timestamp t = new Timestamp(System.currentTimeMillis());
			//pst.setTimestamp(3, t);
			//setTimestamp()  时间戳 
			//setDate() 不包含时分秒
			//pst.setTimestamp(3,new Timestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("1985-2-3 10:20:30").getTime()));
			
			//pst.setString(3,"1988-3-5 10:50:30");
			java.util.Date ddd = new java.util.Date();
			//pst.setString(3,new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(ddd));
			pst.setTimestamp(3,new Timestamp(ddd.getTime()));
			pst.setString(5,"英语");
			pst.setBigDecimal(4, new BigDecimal(5000));
			System.out.println(pst.executeUpdate());

		实现插入数据,取得自增id值?
		localhost
		root
		123
		3308
		db
		book 
		mysql> desc book;
		+-----------+------------------+------+-----+---------+----------------+
		| Field     | Type             | Null | Key | Default | Extra          |
		+-----------+------------------+------+-----+---------+----------------+
		| id        | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
		| name      | varchar(50)      | YES  |     | NULL    |                |
		| price     | decimal(6,1)     | YES  |     | NULL    |                |
		| pdatetime | datetime         | YES  |     | NULL    |                |
		| intro     | text             | YES  |     | NULL    |                |
		+-----------+------------------+------+-----+---------+----------------+
		5 rows in set (0.01 sec)
	
		package com;

		import java.math.BigDecimal;
		import java.sql.Connection;
		import java.sql.DriverManager;
		import java.sql.PreparedStatement;
		import java.sql.ResultSet;
		import java.sql.Timestamp;

		public class Demo {
			public static void main(String[] args) {
				String driver = "com.mysql.jdbc.Driver";
				String url = "jdbc:mysql://localhost:3308/db?useUnicode=true&characterEncoding=utf8&useSSL=false";
				String user = "root";
				String password = "123";
				try {
					Class.forName(driver);
					Connection conn = DriverManager.getConnection(url, user, password);
					String sql = "insert into book values(null,?,?,?,?)";
					PreparedStatement pst = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);// 返回获取自增主键的方式
					pst.setString(1, "《mysql实战技术》");
					pst.setString(4, "这是一个SQL入门的书籍...");
					pst.setBigDecimal(2, new BigDecimal(120));
					pst.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
					int i = pst.executeUpdate();
					System.out.println(i);
					System.out.println("--------------------------------------");
					ResultSet rs = pst.getGeneratedKeys();
					rs.next();
					int kv = rs.getInt(1); // 就是返回生成主键的值
					System.out.println(kv);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}

	CallableStatement 接口 操作存储过程  来调用关系数据库的存储过程

		delimiter $$
		create procedure sss()
		begin
			select id,name,ifnull(score,0) score from student order by score desc;
		end $$
		delimiter ;

		call sss;
		call sss();


		delimiter $$
		create procedure querybyid(in sid int,out sname varchar(30),out sscore int)
		begin
			select name,score into sname,sscore from student where id = sid;
		end $$
		delimiter ;

		-- sqlyog 调用测试存储过程
		call querybyid(5,@sn,@ss);
		select @sn,@ss;

		`information_schema`

		use db;
		show create database db;
		select version();
		select user();
		show tables;
		desc student;
		show create table student;
		show full columns from student;



		DbUtil du = new DbUtil();
		Connection conn = du.getConn();
		//CallableStatement cst = conn.prepareCall("{call sss()}");
		// CallableStatement cst = conn.prepareCall("{call sss}");
		// CallableStatement cst = conn.prepareCall("call sss");
		//ResultSet rs = cst.executeQuery();
		//while (rs.next()) {
		//	System.out.printf("id=%d,name=%s,score=%d \n", rs.getInt(1), rs.getString("name"), rs.getInt("score"));
		//}
		//rs.close();
		//cst.close();
		
		
		CallableStatement cst = conn.prepareCall("{call querybyid(?,?,?)}");
		cst.setInt(1, 5);
		cst.registerOutParameter(2, Types.VARCHAR);// 注册输入参数位置及类型
		cst.registerOutParameter(3, Types.INTEGER);
		cst.execute();
		/*
		 * 建立存储sql代码
		 * delimiter $$ create procedure querybyid(in sid int,out sname varchar(30),out
		 * sscore int) begin select name,score into sname,sscore from student where id =
		 * sid; end $$ delimiter ;
		 */
		String name = cst.getString("sname"); // 过程 out参数名称
		System.out.println(name);
		int score = cst.getInt("sscore");
		System.out.println(score);
		System.out.println(cst.getString(2));// 第二个? 调用 {call querybyid(?,?,?)} 第一个? 是in
		System.out.println(cst.getInt(3));// 第三个?
		conn.close();		

	DatabaseMetaData
		DbUtil du = new DbUtil();
		Connection conn = du.getConn();
		DatabaseMetaData dbmd = conn.getMetaData();
		System.out.println(dbmd.getDatabaseProductName());
		System.out.println(dbmd.getDatabaseProductVersion());
		System.out.println(dbmd.getDriverName());
		System.out.println(dbmd.getDriverVersion());
		System.out.println(dbmd.getURL());
		System.out.println(dbmd.getUserName()); // root@localhost
		System.out.println(dbmd.getDriverMajorVersion());// 8
		System.out.println(dbmd.getDriverMinorVersion());// 0

		
		// 取得数据库中的表名
		//ResultSet rs = conn.prepareStatement("show tables").executeQuery();
		//while (rs.next()) {
			// System.out.println(rs.getString(1));
			//System.out.println(rs.getString("tables_in_db"));
		//}
		
		//show create database db;
		//select version();
		//select user();
		//show tables;
		//desc student;
		//show create table student;
		//show full columns from student;

		
		//取得数据库db中的所有
		ResultSet rs = dbmd.getTables("db", "",null,null);
		while(rs.next()) {
			String tn = rs.getString(3);//表名
			System.out.println("表名:"+tn);
			
			//取得主键
			ResultSet rk = dbmd.getPrimaryKeys(null,"",tn);
			if(rk.next()) {
				System.out.println("主键="+rk.getString(4));
			}
			//取得表结构字段名称
			ResultSet rt = dbmd.getColumns(null, "", tn, null);
			while(rt.next()) {
				System.out.println("\t 字段:"+rt.getString(4));
			}
		}
		


	ResultSet 接口 处理结果集(查询结果)  处理查询的结果集

	ResultSetMetaData 
		public static void main(String[] args) throws SQLException {
			DbUtil du = new DbUtil();
			Connection conn = du.getConn();
			PreparedStatement pst = conn.prepareStatement("select id sid,name sname,score from student");
			ResultSet rs = pst.executeQuery();
			ResultSetMetaData rsmd = rs.getMetaData();
			System.out.println(rsmd.getColumnCount());
			
			rs.next();
			System.out.println(rs.getString("sid"));
			System.out.println(rs.getString(1));
			for(int i=1;i<=rsmd.getColumnCount();i++) {
				System.out.println(rsmd.getColumnLabel(i));//查询语句时的别名
				System.out.println(rsmd.getColumnName(i)); //列名,表中的字段名称
				System.out.println(rsmd.getColumnDisplaySize(i));
				System.out.println(rsmd.getColumnTypeName(i));
			}
			
			//Types.VARCHAR  12
			//Types.INTEGER 4
			//Types.TINYINT -6

		}


	Class.forName("");
	DriverManager.getConnection(url,user,password);
	Connection 
	DatabaseMetaData

	Statement
	PrepareStatement
	CallableStatement
	ResultSet
	ResultSetMetaData

实现功能:
	1)批量语句执行
		DbUtil du = new DbUtil();
		Connection conn = du.getConn();
		Statement stmt = conn.createStatement();
		BufferedReader br = new BufferedReader(new FileReader("c:/dddd.sql"));
		StringBuilder ss = new StringBuilder();
		while (br.ready()) {
			String temp = br.readLine();
			ss.append(temp);
		}
		String[] sqls = ss.toString().split(";");
		for (String sql : sqls) {
			stmt.addBatch(sql);
			//System.out.println(sql);
		}
		stmt.executeBatch();
		stmt.close();
		br.close();
		conn.close();
	2)数据分页
		DbUtil du = new DbUtil();
		Connection conn = du.getConn();
		// 先统计总数
		String sql = "select count(*) from stu where 1=1";
		PreparedStatement pst = conn.prepareStatement(sql);
		ResultSet rs = pst.executeQuery();
		rs.next();
		int recordcount = rs.getInt(1);// 总记录数
		int pagesize = 5;// 每页多少条
		int pagecount = recordcount % pagesize == 0 ? recordcount / pagesize : recordcount / pagesize + 1;//总页数
		int currpage = 3;// 显示第几页
		if(currpage<1) currpage = 1;
		if(currpage>pagecount) currpage= pagecount;
		System.out.printf("[第%d页/共%d页][每页%d条,共%d条]",currpage,pagecount,pagesize,recordcount);
		System.out.println();
		sql = "select id,name,score from stu limit ?,?";
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setInt(1, currpage * pagesize - pagesize);
		ps.setInt(2, pagesize);
		rs = ps.executeQuery();
		while (rs.next()) {
			System.out.printf("id=%d,name=%s,score=%d\r\n", rs.getInt(1), rs.getString("name"), rs.getInt(3));
		}
		rs.close();
		pst.close();
		ps.close();

		select * from student limit m,n;
		select * from student limit m,n;
		select * from student limit m,n;

猜你喜欢

转载自blog.csdn.net/weixin_42321963/article/details/82053187