JDBC连接MySQL

  java提供了一系列用于数据库编程的API--JDBC;实际上,是通过接口定义了一套访问数据库的规范,而实现这些规范的是各数据库厂商,并且将接口实现封装成.jar包;而我们程序员只需要得到数据库厂商封装的.jar包,调用JDBC API就可以连接对应的数据库.其中调用调用JDBC API这个动作是统一的.

  JDBC中常见的API :

  1.DriverManager类 - 驱动管理器

  2.Connection类 - 连接程序与数据库

  3.Statement类 - SQL语句类

  4.PrepareStatement类 - 此类是Statement类的子类

  5.ResultSet类 - 结果集,Result是结果的意思,Set是集合

  具体操作如下:

//1、加载驱动---JDK1.8可以省略这个代码
		try {
			Class.forName("com.mysql.jdbc.Driver");//反射代码---类加载
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//2、获取连接
		Connection con = null;
		String url = "jdbc:mysql://localhost:3306/test129?useSSL=true&useUnicode=true&characterEncoding=utf8";//协议://ip地址:端口号/数据库名
		String username = "root";
		String password = "root";
		try {
			con = DriverManager.getConnection(url,username,password);//连接数据库需要三个参数:url/帐号/密码
			
			//3、构建语句对象
			String sql = "";//书写sql语句
			Statement state = con.createStatement();//通过连接获取语句对象
			
			//4、语句对象执行SQL
			int r = state.executeUpdate(sql);//所有的DML语句都调用这个方法,该方法默认返回影响了多少行
			/*
			 * 新增数据时,有时候会需要得到自动生成的主键值.
			 
			int r = state.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
			ResultSet rs = state.getGeneratedKeys();
			if(rs.next()){
				int id = rs.getInt(1);			
			}
			*/
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			//5、关闭连接
			if(con != null){
				try {
					con.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

  以上是连接MySQL数据库以及对其中表格进行增/删/改(DML)操作,而要进行查询(DQL)操作只需对代码进行如下改动:

  

String sql = "select * from t_group";
			Statement state = con.createStatement();
			
			ResultSet rs = state.executeQuery(sql);//DQL语句通用这个方法
			while(rs.next()){
				GroupBean gb = new GroupBean();
				gb.setId( rs.getInt("pk_groupid"));
				gb.setGroupName(rs.getString("f_groupName"));
				gb.setGroupAddress(rs.getString("f_groupAddress"));
				gb.setGroupNum(rs.getInt("f_groupNum"));
				
				allGroup.add(gb);
			}

  连接和关闭不变,变的是sql语句,查询语句返回的数据也是不同的,是以结果集ResultSet 的形式返回ResultSet 有一个.next()方法--探查是否还有下一条信息,返回boolean值,可以利用循环将查询结果装入与数据表格对应的JavaBean对象中.

  从设计上数据库中表与表的关系和java中bean对象与bean的关系是相对应的.最常见的有三种关系:

 Bean
一对一两张表的关系是其中一张表的外键关联另一张表,外键必须有唯一约束;也可以是两张表互相外键关联,加唯一约束两个类,其中一个类has a另一个类;或者互相has
一对多一张主表,多张从表,所有的外键都是在多的那一方的

单一的一方has a多方的集合,多方has a一个单方

多对多两张(或多张)主表,一张关系表所有的外键都在关系表上两个类互相has a 对方类型的集合

  具体的关系要视业务而定;

 

  很多时候需要用用户输入内容来构建sql语句,这时就会遇到sql注入的风险,可以在此事使用PrepareStatement类代替Statement类来装sql语句,假如有一个用户表格:

  

            String sql = "select * from t_user where f_username = ? and f_password = ?";//PrepareStatement的特点,将标准的sql模版提前书写好,将未知的部分用?号代替
			PreparedStatement ps = con.prepareStatement(sql);//先将模版传入PrepareStatement构造方法产生对象
			ps.setString(1, inputUsername);//传入问号的位置,和取代?的语句,在这里第一个?的位置是1,而不是0
			ps.setString(2, inputPassword);
			ResultSet rs = ps.executeQuery();//将完整的sql语句提交	
			
			UserBean user = null;
			
			while(rs.next()){
				user = new UserBean();
				user.setId(rs.getInt("pk_id"));
				user.setUsername(rs.getString("f_username"));
				user.setPassword(rs.getString("f_password"));
			}

  事务 -- 由于某一业务,需要同时执行多条DML语句,一起成功,一起失败:

  

      	try {
		con = DriverManager.getConnection(url,username,password); 
                //1、将连接对象的自动提交设置为假
                con.setAutoCommit(false);
                //在此编写sql语句
                con.commit();//2、手动提交    
              }catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			try {
				con.rollback();//3、回滚,如果有一条失败,就好全部回到修改前的样子
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
              } finally{
			//5、关闭连接
			if(con != null){
				try {
					con.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
               }    

  

  

转载于:https://www.cnblogs.com/yutanggege/p/5903263.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值