小菜一碟
1.链接mysql数据库
package com.cnn;
import com.mysql.jdbc.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
*
* 链接数据库
*
* */
public class Connect {
public static void main(String[] args) throws Exception {
//1.加载Driver驱动进入jvm
Class.forName("com.mysql.jdbc.Driver");
//数据库链接地址 格式jdbc:mysql:数据库url/数据库名
String url = "jdbc:mysql://localhost:3306/jdbc_learn";
String user = "root";
String pwd = "123456";
Connection cnn=null;
Statement st=null;
try {
//2.获取连接对象
cnn = (Connection) DriverManager.getConnection (url, user, pwd);
//3.创建sql语句
//创建一个数据表
String sql="create table student(id int,name varchar(50),age int)";
//创建一个“连接管道”
st =cnn.createStatement ();
//4.执行sql语句
st.executeUpdate (sql);
} catch (SQLException e) {
e.printStackTrace ();
} finally {
//5.释放资源
try {
st.close();
} catch (SQLException e) {
e.printStackTrace ();
}
try {
cnn.close();
} catch (Exception e) {
e.printStackTrace ();
}
}
}
}
2.插入操作 插入修改等操作 在执行的时候用executeUpdate
package com.cnn;
import com.mysql.jdbc.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 插入数据
*
* */
public class Insert {
public static void main(String[] args) throws Exception {
//1.加载Driver驱动进入jvm
Class.forName ("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc_learn";
String user = "root";
String pwd = "123456";
Connection cnn = null;
Statement st= null;
try {
//2.获取连接对象
cnn = (Connection) DriverManager.getConnection (url, user, pwd);
//3。创建sql语句
String sql="insert into student values (1,'zc',20)";
//4.创建连接管道
st = cnn.createStatement ();
//5.执行sql语句
//返回一个行数。插入成功一行 就返回1
int row= st.executeUpdate (sql);
System.out.println (row);
} catch (SQLException e) {
e.printStackTrace ();
} finally {
if(st!=null)
try {
//释放资源 先关闭这个msqql 到msql.exe的这个通道
st.close();
} catch (SQLException e) {
e.printStackTrace ();
}
if(cnn!=null)
try {
//关闭java到mysql的通道
cnn.close();
} catch (SQLException e) {
e.printStackTrace ();
}
}
}
}
3.查询数据 查询语句执行的时候用executeQuery
package com.cnn;
import com.mysql.jdbc.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 查询获得多条数据
* */
public class DQLDatasClass {
public static void main(String[] args) throws Exception {
//1.将Driver驱动加载进jvm
Class.forName ("com.mysql.jdbc.Driver");
//数据库链接地址 格式 jdbc:mysql:数据库网址/数据库名
String url="jdbc:mysql://localhost:3306/jdbc_learn";
String user="root";
String pwd="123456";
Connection cnn=null;
Statement st = null;
try {
//2.创建链接对象
cnn= (Connection) DriverManager.getConnection (url,user,pwd);
//3。创建sql语句
String sql="select * from student";
//创建链接管道
st=cnn.createStatement ();
//4.执行sql语句
ResultSet res=st.executeQuery (sql);
//如果只想要查询返回 满足一条的数据,那么去掉while 变为if就可以
while(res.next ()){
int id=res.getInt ("id");
String name=res.getString ("name");
int age=res.getInt ("age");
System.out.println (" id= "+id+" name= "+name+" age= "+age);
}
} catch (SQLException e) {
e.printStackTrace ();
} finally {
if(st!=null){
try {
//5。释放资源 释放管道
st.close();
} catch (SQLException e) {
e.printStackTrace ();
}
}
if(cnn!=null){
try {
//5.释放资源 释放连接器
cnn.close();
} catch (Exception e) {
e.printStackTrace ();
}
}
}
}
}
主菜
jdbc数据库开发例子:
一些概念与规范:
概念:
1.DAO思想 (DATA Access Object)数据存取对象 里面封装了一些操作数据库的方法。比如插入数据,获得查询数据,修改数据等方法
2.对象ORM对象关系映射
面向对象概念 | 面向关系概念 |
---|---|
类 | 表 |
对象 | 一条记录 |
属性 | 字段 |
3.domain 类
作用:用户于数据库的中转站
里面放着一些数据的set和get方法
规范:总的来说要见名知意
1.包的命名规范
域名倒写.模块名称.组件名称
damain包 com.zc.jdbc.domain
dao接口包 com.zc.jdbc.dao
实现包:com.zc.jdbc.impl
测试包 com.zc.jdbc.test
2.类命名规范
以一个学生表为例子
domain类 那么取名Student
dao接口类 StudentDao
dao接口实现类 StudentDaoImpl
测试方法 StudentTest
4.jdbc 数据库开发正确操作步骤:
- 数据库中创建表
- 建立domain包domian类
- 建立Dao包和dao接口类
- 建立dao.impl包和dao接口实现类
- 创建测试类
- 实现类中编写dao接口中声明的方法
- 每次实现一个dao接口方法,就测试一次
jdbc整个代码流程
- 加载驱动Driver进入jvm
- 创建连接对象
- 创建sql语句
- 执行sql语句
- 释放资源 先释放ResultSet结果资源 Statement资源 最后释放Connection连接资源
java通过 jdbc连接mysql示意图
[外链图片转存失败(img-XcdkAhLj-1562594842681)(C:\Users\MI\Pictures\java\jdbc.png)]
实际演练
分为几个模块 Dao接口模块 dao Dao接口实现模块impl 工具类模块jdbcutil domain模块 Test模块。
因为你每对一次数据库进行操作 就会重复很多代码,连接msql,登陆用户密码,释放资源等都是重复的,因此将它们封装成工具类,减小代码耦合性,增加弹性。
注意:由于每对数据库操作一次都重复了 驱动器加载的步骤 Class.forName(“com.jdbc.mysql.Driver”);因此将它放入了static静态模块里,就可以只加载一次。
工程结构图
代码:
dao接口代码
package databasedao.jdbc.dao;
import com.dao.Student;
import java.sql.SQLException;
import java.util.List;
/**
* Stduent 表的Dao操作接口
*
* */
public interface iStudentDao {
//1.保存数据
void save(Student stu) throws Exception;
//2.获取指定学生
Student get(int id);
//3.删除学生
void delete(int id);
List<Student> getAll() ;
//5.修改指定学生信息
void upDate(int id,Student stu);
}
domain模块代码
package databasedao.jdbc.domain;
public class Student {
private String name;
private Integer id;
private 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;
}
}
实现类impl模块代码
package databasedao.jdbc.impl;
import com.dao.Student;
import databasedao.jdbc.dao.iStudentDao;
import databasedao.jdbc.jdbcutil.JdbcUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class StudentDaoImpls implements iStudentDao {
Connection cnn = null;
Statement st = null;
ResultSet res = null;
@Override
public void save(Student stu) {
try {
//返回连接对象
JdbcUtil.getConnection ();
st = cnn.createStatement ();
Integer id = stu.getId ();
String name = stu.getName ();
Integer age = stu.getAge ();
String sql = "insert into student(id,name,age)values (" + id + ",'" + name + "'," + age + ")";
System.out.println (sql);
//4.执行sql语句
//insert插入操作用executeUpdate执行 获得REsultSet对象
int res = st.executeUpdate (sql);
} catch (SQLException e) {
e.printStackTrace ();
} catch (Exception e) {
e.printStackTrace ();
} finally {
JdbcUtil.close (res, st, cnn);
}
}
@Override
public Student get ( int id){
try {
cnn = DriverManager.getConnection (JdbcUtil.url, JdbcUtil.user, JdbcUtil.pwd);
//3。创建sql语句
//创建连接管道
st = cnn.createStatement ();
String sql = "select * from student where id =" + id + "";
System.out.println (sql);
//4.执行sql语句
//查询操作用executeQuery执行 获得REsultSet对象
res = st.executeQuery (sql);
while (res.next ()) {
Student stu = new Student ();
stu.setAge (res.getInt ("id"));
stu.setName (res.getString ("name"));
stu.setAge (res.getInt ("age"));
return stu;
}
} catch (Exception e) {
e.printStackTrace ();
} finally {
JdbcUtil.close (res,st,cnn);
}
return null;
}
@Override
public void delete(int id) {
try {
cnn = DriverManager.getConnection (JdbcUtil.url, JdbcUtil.user, JdbcUtil.pwd);
//3。创建sql语句
//创建连接管道
st = cnn.createStatement ();
String sql = "delete from student where id=" + id + "";
System.out.println (sql);
//4.执行sql语句
//insert插入操作用executeUpdate执行 获得ResultSet对象
int res = st.executeUpdate (sql);
} catch (SQLException e) {
e.printStackTrace ();
} catch (Exception e) {
e.printStackTrace ();
} finally {
JdbcUtil.close (res, st, cnn);
}
}
@Override
public List<Student>getAll(){
try {
//1,加载驱动
Class.forName (JdbcUtil.driverName);
cnn = DriverManager.getConnection (JdbcUtil.url, JdbcUtil.user, JdbcUtil.pwd);
//3。创建sql语句
//创建连接管道
st = cnn.createStatement ();
String sql = "select * from student";
System.out.println (sql);
//4.执行sql语句
//查询操作用executeQuery执行 获得ResultSet对象
ResultSet res = st.executeQuery (sql);
Student s = new Student ();
List<Student> stu = new ArrayList<> ();
while (res.next ()) {
s.setId (res.getInt ("id"));
s.setName (res.getString ("name"));
s.setAge (res.getInt ("age"));
stu.add (s);
} return stu;
} catch (Exception e) {
e.printStackTrace ();
} finally {
JdbcUtil.close (res,st,cnn);
}
return null;
}
@Override
public void upDate ( int id, Student stu) {
try {
cnn = DriverManager.getConnection (JdbcUtil.url, JdbcUtil.user, JdbcUtil.pwd);
//3.建sql语句
//创建连接管道
st = cnn.createStatement ();
String sql = "update student set name='" + stu.getName () + "',age=" + stu.getAge () + " where id=" + id + "";
System.out.println (sql);
//4.执行sql语句
//insert插入操作用executeUpdate执行 获得REsultSet对象
int res = st.executeUpdate (sql);
} catch (Exception e) {
e.printStackTrace ();
} finally {
JdbcUtil.close (res, st, cnn);
}
}
}
工具类jdbcutil模块
知识点 static关键字使用
package databasedao.jdbc.jdbcutil;
import com.cnn.Connect;
import java.sql.*;
import java.util.Collection;
public class JdbcUtil {
public static String url = "jdbc:mysql://localhost:3306/jdbc_learn";
public static String user = "root";
public static String pwd = "123456";
public static String driverName = "com.mysql.jdbc.Driver";
static{
//1,加载驱动
try {
Class.forName (JdbcUtil.driverName);
} catch (ClassNotFoundException e) {
e.printStackTrace ();
}
}
//获取连接对象
public static Connection getConnection() {
Connection cnn=null;
try {
cnn = DriverManager.getConnection (JdbcUtil.url, JdbcUtil.user, JdbcUtil.pwd);
} catch (Exception e) {
e.printStackTrace ();
}
return cnn;
}
/***
* 释放资源
* 1.结果资源 2.Statement通道资源 3.Connection java与mysql数据库之间得连接资源
*/
public static void close(ResultSet res, Statement st,Connection cnn){
if (res!= null) {
try {
res.close ();
} catch (SQLException e) {
e.printStackTrace ();
} finally {
if (st != null)
try {
st.close ();
} catch (SQLException e) {
e.printStackTrace ();
}if(cnn!=null){
try {
cnn.close();
} catch (SQLException e) {
e.printStackTrace ();
}
}
}
}
}
}
测试模块
@Test 注解实现单元测试
package databasedao.jdbc.test;
import databasedao.jdbc.dao.iStudentDao;
import com.dao.Student;
import databasedao.jdbc.impl.StudentDaoImpls;
import org.junit.jupiter.api.Test;
import java.util.List;
public class StudentTest {
public static void main(String[] args) throws Exception {
Student stu=new Student ();
stu.setId (1);
stu.setName ("zc");
stu.setAge (20);
iStudentDao stuDao=new StudentDaoImpls ();
stuDao.save (stu);
}
//单元测试
@Test
public void save() throws Exception {
Student stu=new Student ();
stu.setId (1);
stu.setName ("zc");
stu.setAge (20);
iStudentDao stuDao=new StudentDaoImpls ();
stuDao.save (stu);
}
@Test
public void upDate() throws Exception {
Student stu=new Student();
stu.setName ("dasdsadasdasdsadsa");
stu.setAge (200);
iStudentDao dao=new StudentDaoImpls ();
dao.upDate (2,stu);
}
@Test
public void delete(){
iStudentDao dao=new StudentDaoImpls ();
dao.delete (1);
}
@Test
public void get(){
iStudentDao dao=new StudentDaoImpls ();
System.out.println (dao.get (2).toString ());
}
@Test
public void getAll() throws Exception {
iStudentDao dao=new StudentDaoImpls ();
List list=dao.getAll ();
for(int i=0;i<list.size ();i++){
Object obj=list.get (i);
System.out.println (obj);
}
}
}
注意: 拼接方法
当不是字符串时: “+ 拼接值+”
是字符串的时候 ‘ “ + 拼接值+” ’