A- java连接mysql(断点)

9 篇文章 0 订阅
package jdbk;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Conn {

//	数据库地址url
//jdbc连接mysql的协议,类似http://www.baidu.com
//	localhost:3306   主机端口号
//	?参数名=参数值&参数名2=参数值2
//	连接mydb数据库
//	字符编码utf8,可处理中文
//	serverTimezone设置时间区,和数据库时间相匹配
//	serverTimezone时间区只有mysql8需要设置
//	useSSL
//	SSl安全套接字协议,TLS与SSL在传输层(TCP)与应用层(HTTP)之间对网络连接进行加密

//	数据库账户名密码
	
//java.sql在jdk里面
//	com.mysql.cj.jdbk.driver在mysql jar包里
//	连接初始化
//	Class.forName()-->反射获取连接驱动类,根据包路径加载链接驱动类
//	使用url、user、PASSWORD建立连接
//	String sql = "sql语句"
//	try-catch捕获异常
//	prepareStatement预编译
//	rs.getTYPE("column_name")
	
//	executeUpdate()---执行增删改---返回执行sql影响的行数
//	executeQuery()---执行查询语句---返回查询结果集
//  数据库地址URL
//	private static final String URL = "jdbc:mysql://loalhost:3306/mydb?"
//			+"useUnicode = true&characterEncoding = utf8" 
//			+"&serverTimezone=Asia/Shanghai&useSSL=false";
	
	
package jdbc;

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


public class con_test {

	private static final String URL = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false";
	private static final String USER = "root";
	private static final String PASS = "123456";
//	建立连接只需要一次,一旦建立连接,就一直存在
	static Connection conn = null;	
	static PreparedStatement ps = null;

//	1.建立连接
	public static void init() {
		if(conn == null) {
			try {
				Class.forName("com.mysql.cj.jdbc.Driver");
				conn = DriverManager.getConnection(URL, USER, PASS);
			}catch(Exception e) {
				e.printStackTrace();
				System.out.println("build conncetion failed");
			}
			System.out.println("build success");
		}
		else {
			System.out.println("success");
		}
	}
//	2.查询
	public static void query(String sql) {
		con_test.init();

		try {
			ps = conn.prepareStatement(sql);
			ResultSet rs = ps.executeQuery(sql);
			while(rs.next()) {//遍历结果集,向下读一行数据
				System.out.println(rs.getInt("id")+rs.getString("stu_name"));
			}
		}catch(Exception e) {
			e.printStackTrace();
			System.out.println("sql failed");
		}
	}
//	3.更新
	public static void update(String sql) {
		con_test.init();

		try {
			ps = conn.prepareStatement(sql);
			int rs = ps.executeUpdate();
		}catch(Exception e) {
			e.printStackTrace();
			System.out.println("sql failed");
		}

	}
//	4.占位符?插入
//	execute()执行任何类型的sql语句,返回boolean类型
	public static boolean add(String name,int sex) {
		con_test.init();

		String sql = "insert into stu_info(stu_name,sex) values(?,?)";
		try {
			ps = conn.prepareStatement(sql);
			ps.setString(1,name);
			ps.setInt(2, sex);
			return ps.execute();
		}catch(Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	
//	5.批量插入
	public static int dealBatch(String[] sqls) {
		con_test.init();
		try {
//          设置事务自动提交,jdbc默认为true
			conn.setAutoCommit(false);
			Statement st = conn.createStatement();
			for(int i = 0; i<sqls.length;i++) {
				st.addBatch(sqls[i]);
			}
			st.executeBatch();
//			commit,提交事务
			conn.commit();
			return 1;
			
		}catch(Exception e) {
			e.printStackTrace();
			return 0;
		}

	}
//	6.插入的同时返回新插入数据的主键
	public static Integer addReturnPrimaryKey(String sql) {

		con_test.init();
		try {
			
			ps = conn.prepareStatement(sql, ps.RETURN_GENERATED_KEYS);
			int re = ps.executeUpdate();
			if(re == 0) {
				return 0;
			}
//			获取新插入记录的主键
			ResultSet rs2 = ps.getGeneratedKeys();
			Integer id = null;
			if(rs2.next()) {//遍历结果集,向下读一行数据
//				获取第一个字段的值,下标从1开始
				id = rs2.getInt(1);
			}
			return id;
		}catch(SQLException e) {
			e.printStackTrace();
			System.out.println("失败");
			return null;	
		}
	}
	
//  7.关闭连接(开始时,先连接,再编译,再生成结果集)
	public static  void close() {
		if(ps != null) ps = null;
		if(conn != null) conn = null;
    
	}
	
	public static void main(String[] args) {
//      如果出错,事务回滚
		String[] sqls = new String[3];
		sqls[0] = "insert into stu_info(id,stu_name) values(29,'侠客')";
		sqls[1] = "update stu_info set stu_name = '管老八' where id = 5";
		sqls[2] = "delete from stu_info where id = 57";
//		int code = dealBatch(sqls);
//		System.out.println(code);
//		con_test.query("select * from stu_info");
//		add("迪丽热巴",0);
		String sql = "insert into stu_info(id,stu_name) values(77,'李大明')";
		Integer key = addReturnPrimaryKey(sql);
		System.out.println(key);
		
	}

}

//使用泛式
package jdbc;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import model.Student;


public class Conn2 {
	/*
	 * 泛型:
	 * <T>声明此方法持有一个类型T,也可以理解为此方法是一个泛型方法
	 * List<T>声明该方法的返回值类型为List集合,且集合中的元素都是T类型
	 * Class<T> cls知名泛型T的具体类型
	 * Object params是占位符问题
	 * public static <T> List<T> queryAll(String sql,Class<T> cls,Object ... params)
	 * 
	 */
查询之后返回的每一行数据封装成Class<T>
建立连接
检索此ResultSet对象的列数、类型和字段--getMetaData
列名从1开始
getDeclaredField可以访问到私有属性
驼峰命名法userNamePerson??
java命名规则----不能有_吗
Student.class-->获取Student类的类对象
双击--debug as--f6向下走一行--f8跳过(到下一个断点,或者程序结束)
f5进入方法,f7跳出方法
	
	private static final String URL = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false";
	private static final String USER = "root";
	private static final String PASS = "123456";
	static Connection conn = null;
	static PreparedStatement ps = null;
	static ResultSet re = null;
//	1.建立连接
	public static void init() {
		if(conn == null) {
			try {
				Class.forName("com.mysql.cj.jdbc.Driver");
				conn = DriverManager.getConnection(URL, USER, PASS);
			}catch(Exception e) {
				e.printStackTrace();
				System.out.println("build conncetion failed");
			}
			System.out.println("build success");
		}
		else {
			System.out.println("success");
		}
	}
//	2.数据库字段(下划线命名)转变量(驼峰命名法)
	public static String getParam(String column) {
		String[] arr = column.split("_");
		StringBuffer sf = new StringBuffer(arr[0]);
		for(int i = 1;i<arr.length;i++) {
			sf.append(arr[i].substring(0,1).toUpperCase()+arr[i].substring(1));
		}
		return sf.toString();
	}
//	3.泛式方法
	public static <T> List<T> queryAll(String sql,Class<T> cls,Object ... params){
//		建立连接
		Conn2.init();
		try {
			ps = conn.prepareStatement(sql);
			if(params != null) {//params应该指的是占位符的个数
				for(int i = 0;i<params.length;i++) {
					//替换指定位置的占位符。列名从1开始
					ps.setObject(i+1, params[i]);
				}
			}
			re = ps.executeQuery();
//			检索结果集的列数、类型和字段--getmataData()
			ResultSetMetaData rmd = re.getMetaData();
//			动态数组list
			List<T> list = new ArrayList<T>();
			while(re.next()) {//查询到一条记录
//				实例化泛型对象
				T t = cls.newInstance();
//				getColumnCount-->结果集中的列数
				for(int i = 0;i<rmd.getColumnCount();i++) {
					try {
//						获取指定列列名的别名,如果sql没有指定别名,则返回值与getColumnName()方法相同
//						getColumnLabel(i+1)-->返回i+1列的标签
						String column = rmd.getColumnLabel(i+1);
//						类似:String name = re.getString("stu_name")
						Object value = re.getObject(column);
//						通过反射获取Field对象
						Field field = cls.getDeclaredField(column);
//						开启允许访问私有变量的权限
						field.setAccessible(true);
//						给变量赋值
						field.set(t, value);
					}catch(Exception e) {
//						e.printStackTrace();
					}
					
				}
				list.add(t);
			}
			return list;
		}catch(Exception e) {
			e.printStackTrace();
			return null;
		}finally {
			if(conn != null) {
				conn = null;
			}
			if(ps != null) {
				ps = null;
			}
			if(re != null) {
				re = null;
			}
		}
	}
	
	public static void main(String[] args) {
		
		String sql = "select * from stu_info where id = ? and stu_name = ?";
		List<Student> list = queryAll(sql, Student.class,11,"谢大脚");
		for(Student stu : list) {
			stu.print();
		}		
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值