1.连接Mysql
1.1.添加驱动
在项目当中创建一个文件夹为lib
把Mysql驱动包复制到该文件夹下
.builder path 编译路径
1.2.创建连接
查看驱动相关api:ctrl+shift+t 查找drive,点进去后, 要求关联源码,把驱动压缩包直接关联
.加载驱动:把com.mysql.jdbc.Driver这份字节码加载进JVM,当一份字节码被加载到JVM时,就会执行该字节码中的静态代码块
.获取连接对象:连接时要求传入数据库地址,用户名,密码
package myJDBCstudy;
import java.sql.DriverManager;
import java.sql.Connection;
public class ConnectionClass {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//1.加载驱动
//把com.mysql.jdbc.Driver这份字节码加载进JVM
//当一份字节码被加载到JVM时,就会执行该字节码中的静态代码块
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
//2.1数据库地址
String url = "jdbc:mysql://localhost:3306/jdbc";
//2.2用户名
String user = "root";
//2.3密码
String password = "123456";
Connection conn = DriverManager.getConnection(url,user,password);
//打印是否连接成功
System.out.println(conn);
}
}
2.创建Mysql表
2.1.创建要执行的sql语句
Statement接口,用来执行静态SQL语句对象
把SQL语句发送到数据库中去执行。并返回执行的结果
executeUpate(String)(执行DML和DDL语句);
2.2.释放资源
Connection连接就相当于Java和到Mysql之间建立管道
连接只连接到数据,Statement 就相当于从数据库又接了一个管道连接Mysql的执行程序
把管道给撤了
package com.createTable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class CreateTable {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
String url = "jdbc:mysql://localhost:3306/jdbc";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url,user,password);
//3.编写sql语句
String sql = "create table stu(id int,name varchar(50),age int)";
Statement st = conn.createStatement();
//4.执行sql
int row = st.executeUpdate(sql); //row 的值就是表中被更改的行数
System.out.println(row);
//5.释放资源
st.close();
conn.close();
}
}
3.JDBC执行DML(insert,delete,update)操作
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class InsertClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn=null;
Statement st=null;
try {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
String url = "jdbc:mysql://localhost:3306/jdbc";
String user = "root";
String password = "123456";
conn = DriverManager.getConnection(url,user,password);
//3.编写sql
String sql = "insert into stu values (1,'zs',20)";
st = conn.createStatement();
//4.执行sql
int row = st.executeUpdate(sql);
System.out.println(row);
} catch (Exception e) {
e.printStackTrace();
}finally {
//5.释放资源
if(st!=null) {
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (Exception e2) {
// TODO: handle exception
}finally {
}
}
}
}
}
4.执行DQL(Query)操作
ResultSet:执行DML操作和执行DDL操作是一样,只有sql语句发生了变量
常用方法:
# boolean next():判断是否有下一行数据,若有,则向下移动一行指针.
# getXxx(String columnName):获取当前行中的,指定列名的列的值.columnName是列名/列的别名
# 若列的类型是VARCHAR/CHAR/TEXT,都使用getString来获取列的值.
# 若列的类型是int/integer/–>getInt来获取列的值.
执行sql:
# executeQuery(Sql)会得到一个结果集,(多行数据)
//查询所有*,获得结果集
void test1() throws Exception{
//1.获取连接对象
String url = "jdbc:mysql://localhost:3306/jdbc";
String user = "root";
String password = "123456";
//2.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//3.连接数据库
Connection conn = DriverManager.getConnection(url,user,password);
//4.编写sql语句
String sql = "SELECT * FROM stu";
Statement st = conn.createStatement();
//5.执行sql语句,返回结果存于结果集
ResultSet res = st.executeQuery(sql);
//6.打印结果
while(res.next()) {
System.out.println("id:"+res.getInt("id")+"-----"+"name:"+res.getString("name"));
}
//7.释放资源
st.close();
conn.close();
}
# 获了一个数据
//获取一个数据
static void test2() throws Exception{
//1.获取连接对象
String url = "jdbc:mysql://localhost:3306/jdbc";
String user = "root";
String password = "123456";
//2.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//3.连接数据库
Connection conn = DriverManager.getConnection(url,user,password);
//4.编写sql语句
String sql = "SELECT * FROM stu where name= 'zs'";
Statement st = conn.createStatement();
//5.执行sql语句,返回结果存于结果集
ResultSet res = st.executeQuery(sql);
//6.打印结果
if(res.next()) {
System.out.println("id:"+res.getInt("id")+"-----"+"name:"+res.getString("name"));
}
//7.释放资源
st.close();
conn.close();
}
5.DAO思想养成计划
什么是DAO?看图
为什么要使用DAO
Data Access Object(数据存取对象)
位于业务逻辑和持久化数据之间
实现对持久化数据的访问
不使用DAO的话?
多个地方都要都同时做CRUD操作时,重复的代码就会很多,如图所示
接下来就是怎么做的问题了,设计规范
别找了,上图就是粉图
没有实际操作演示下总觉得不行,好,开干起来
根据粉图,创建相应的包和类,,如图所示
domian包中的Student类就是一个domain类,(什么是domain类?封装成getter和setter的就是)
package com.study.jdbc.domain;
public class Student {
String name;
Integer id;
Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
而dao包下的Istudent是一个接口(这也是面向接口编程的思想)
package com.study.jdbc.dao;
import java.util.List;
import com.study.jdbc.domain.Student;
public interface IStudent {
/**
* 保存一个学生
*/
public void save(Student stu);
/**
* 删除学生
*/
public void delete(int id);
/**
* 更新一个学生信息
*/
public void update(int id,Student stu);
/**
* 获取指定学生
*/
public Student get(int id);
/**
* 获取所有的学生
*/
public List<Student> getAll();
}
也许看到这里,你就明白了,StudentImpl是Istudent的一个实例,用来实现接口的具体方法,而StudentTest则是用来做单元测试的,测试某个方法是否准确无误。
没错,可以看下
StudentImpl
package com.study.jdbc.impl;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.List;
import com.study.jdbc.dao.IStudent;
import com.study.jdbc.domain.Student;
public class StudentImpl implements IStudent{
@Override
public void save(Student stu) throws Exception {
//1.获取连接对象
String url = "jdbc:mysql://localhost:3306/jdbc";
String user = "root";
String password = "123456";
//2.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//3.连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
@Override
public void delete(int id) {
// TODO Auto-generated method stub
}
@Override
public void update(int id, Student stu) {
// TODO Auto-generated method stub
}
@Override
public Student get(int id) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Student> getAll() {
// TODO Auto-generated method stub
return null;
}
}
接下来在SttudentTest里做单元测试,测试StudentImpl中的方法是否生效
StudentTest
package com.study.jdbc.test;
import org.junit.Test;
import com.study.jdbc.dao.IStudent;
import com.study.jdbc.domain.Student;
import com.study.jdbc.impl.StudentImpl;
public class StudentTest {
public static void main(String[] args) {
}
@Test
public void save() throws Exception {
Student student = new Student();
student.setName("pg");
student.setAge(30);
IStudent dao = new StudentImpl();
dao.save(student);
}
}