Java基础学习Day5,JDBC连接Mysql

Java基础学习Day5,JDBC连接Mysql

JDBC连接Mysql步骤

1.加载驱动
2.创建连接
3.获取statement
4.执行sql
5.关闭连接

举例

这里我们先直接创建一个类,在这个类的主方法里直接完成以上5个步骤,实现JDBC连接Mysql,对数据进行调用。

public static void main(String[] args) {
	// TODO Auto-generated method stub
	
	try {
		//加载驱动,其实就是通过反射创建了对象
		Class.forName("com.mysql.cj.jdbc.Driver");
		//mysql也可是sql server或者其他数据库
		//java10是数据库的名字 localhost=127.0.0.1
		//java11是数据库的名字 
		//useSSL=false表示不需要证书 
		//serverTimezone表示时区
		String url="jdbc:mysql://localhost:3306/java11?useSSL=false&serverTimezone=Asia/Shanghai";
	    //登录数据库用户名
		String username="root";
		//登录数据库密码
		String pwd="surfece2019DB";
		//这行代码就是创建连接
		Connection conn = DriverManager.getConnection(url,username,pwd);
		//创建好连接后,就可以获取Statement,Statement里有“excute~”等方法,作用是实现sql,后文会详细讲解
		Statement st=conn.createStatement();
		ResultSet rs=st.executeQuery("select * from student");
		while(rs.next()){
			System.out.println("名字"+rs.getString("name"));
			System.out.println("分数"+rs.getString("score"));
		}
		//切记要记得关闭连接
		rs.close();
		st.close();
		conn.close();	
	} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}	
}

上面代码便是jdbc连接mysql的实现,但是从中不难发现,这段代码中有几个部分是可以重复使用的,因此,我们应该将其中的几个步骤封装起来,实现代码的复用。

代码封装

首先,分析上面的代码,我们可以看出1.加载驱动2.创建连接5.关闭连接这三个步骤都是固定不变的,在实际使用中,真正需要我们改变的是statement获取和sql语句的改变。因此,我们将1,3,5三个步骤放到一个类里面。

public class JDBCBasic {
	public static Connection getConnection() {
		Connection conn =null;
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			String url="jdbc:mysql://localhost:3306/java11?useSSL=false&serverTimezone=Asia/Shanghai";
			String username="root";
			String pwd="surfece2019DB";
			conn = DriverManager.getConnection(url,username,pwd);		
		} catch (ClassNotFoundException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
		return conn;		
	}
		
	public static void closeConn(Statement st,ResultSet rs,Connection conn) {
		if(rs!=null) {
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(st!=null) {
			try {
				st.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}	
		if( conn!=null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}		
		}
	}
}

接下来,剩下的两个步骤,因为每次调用的期望结果不同,会使用不同的sql语句,主要是增、删、改、查四种。所以我们先创建一个类,其成员属性和我们期望的输出结果对应,在输出时调用。
Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute,使用哪一个方法由 SQL 语句所产生的内容决定,具体使用方法见注释。(大多数情况:查询使用excuteQuery,删、改、增使用excuteUpdate)

public class Student {
	private int id; 
	private String sex;   
	private String cname; 
	private String mobile;
	private int score;
	private String name;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	public String getMobile() {
		return mobile;
	}
	public void setMobile(String mobile) {
		this.mobile = mobile;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", sex=" + sex + ", cname=" + cname + ", mobile=" + mobile + ", score=" + score
				+ ", name=" + name + "]";
	}
}

接下来再创建一个类,在其中写方法,以实现我们期望的功能。以下例子里放了四个方法,分别对应了增、删、改、查四种sql语句。

public class StudentService {
	//这个方法是将sql语句查询的结果放入上面创建好的类当中
	public List<Student> getAllStudent(String sql){
		List<Student> list=new ArrayList();
		Connection conn=JDBCBasic.getConnection();
		try {
			Statement st=conn.createStatement();
			//excuteQuery用于产生单个结果集的语句,例如 SELECT 语句。
			//excuteUpdate用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
			//execute 用于执行返回多个结果集、多个更新计数或二者组合的语句。多数程序员不会需要该高级功能。
			ResultSet  rs=st.executeQuery(sql);
			while(rs.next()) {
				Student student=new Student();
				student.setName(rs.getString("name"));
				student.setId(rs.getInt("id"));
				student.setScore(rs.getInt("score"));
				student.setSex(rs.getString("sex"));
				list.add(student);
			}
			//记得关闭连接
			JDBCBasic.closeConn(st, rs, conn);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return list;
	}

	//这个方法是向表中添加数据
	public Student add(Student student) {
		Connection conn=JDBCBasic.getConnection();
		try {
			Statement st=conn.createStatement();		
			Random r=new Random();
			int id=r.nextInt(1000);
			student.setId(id);
			String sql="insert into student (id,sex,score,name) values ("+id+",'"+student.getSex()+"',"+student.getScore()+",'"+student.getName()+"')";
			st.executeUpdate(sql);
			JDBCBasic.closeConn(st, null, conn);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		return student;
	}
	
	//这个方法是修改表中的数据
	public boolean updateNameById(String name,int id) {
		Connection conn=JDBCBasic.getConnection();
		boolean flag=false;
		try {
			Statement st=conn.createStatement();		
			String sql="update student set name='"+name+"' where id="+id;
			if(st.executeUpdate(sql)>0) {
				flag=true;
			};
			JDBCBasic.closeConn(st, null, conn);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
		
		return flag;
	}
	
	//删除表中数据
	public boolean deleteByName(String name) {
		Connection conn=JDBCBasic.getConnection();
		boolean flag=false;
		try {
			Statement st=conn.createStatement();
			String sql="delete from student where name='"+name+"'";
			if(st.executeUpdate(sql)>0) {
				flag=true;
			};
			JDBCBasic.closeConn(st, null, conn);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return flag;
	}
}

测试

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		StudentService ss=new StudentService();
		Student student=new Student();
		student.setName("Alex2");
		student.setScore(100);
		student.setSex("男");
		ss.add(student);
		
		ss.deleteByName("allen");
		ss.updateNameById("harry2020", 2);
		String sql="select * from student";
		List<Student> ls=ss.getAllStudent(sql);
		for(Student s:ls) {
			//打印对象,其实默认执行对象的toString方法
			//下面打印的是s.toString方法返回的结果
			System.out.println(s);
		}
	}

结果

Student [id=1, sex=, cname=null, mobile=null, score=89, name=王五]
Student [id=2, sex=, cname=null, mobile=null, score=99, name=harry2020]
Student [id=3, sex=, cname=null, mobile=null, score=79, name=张三]
Student [id=37, sex=, cname=null, mobile=null, score=100, name=Alex2]
Student [id=393, sex=, cname=null, mobile=null, score=100, name=Alex2]

参考文献:https://baike.baidu.com/item/statement/4771842?fr=aladdin#2

发布了5 篇原创文章 · 获赞 2 · 访问量 72

猜你喜欢

转载自blog.csdn.net/weixin_44270171/article/details/103937109