JDBC是连接java应用程序和数据库之间的桥梁。
什么是JDBC?
Java语言访问数据库的一种规范,是一套API。
JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库。比如建立数据库连接、执行SQL语句进行数据的存取操作。
JDBC代表Java数据库连接。
JDBC库中所包含的API任务通常与数据库使用:
- 连接到数据库
- 创建SQL或MySQL语句
- 在数据库中执行SQL或MySQL查询
- 查看和修改记录
比如:
二、JDBC使用详解1、打通数据库
先新建Java 工程,将jar包导进去:
然后新建相应的数据库和表。
编写DBUtil.java
package com.study.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class DBUtil {
private static final String URL="jdbc:mysql://localhost:3306/demo_jdbc";
private static final String NAME="root";
private static final String PASSWORD="root";
public static void main(String[] args) throws Exception{
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2.获得数据库的连接
Connection conn = DriverManager.getConnection(URL, NAME, PASSWORD);
//3.通过数据库的连接操作数据库,实现增删改查
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select user_name,age from imooc_goddess");//选择import java.sql.ResultSet;
while(rs.next()){//如果对象中有数据,就会循环打印出来
System.out.println(rs.getString("user_name")+","+rs.getInt("age"));
}
}
}
2、搭建模型层
采用MVC三层架构:建议由下往上开发(DB->view,需求读懂以后,设计数据库,然后根据数据库映射模型,再写控制层,再写视图层)
- View视图层——展示数据,反馈用户行为
- Control控制层——控制数据流通过程,协调视图层和数据层
- Model模型层——与数据库建立映射,与数据进行交互(DB数据库)
先新增对应的model层:按照数据库表对应的字段编写实体类。
package com.study.model;
import java.util.Date;
public class Goddess {
private Integer id;
private String userName;
private Integer sex;
private Integer age;
private Date birthday;
private String email;
private String mobile;
private String createUser;
private Date createDate;
private String updateUser;
private Date updateDate;
private Integer isDel;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getCreateUser() {
return createUser;
}
public void setCreateUser(String createUser) {
this.createUser = createUser;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public String getUpdateUser() {
return updateUser;
}
public void setUpdateUser(String updateUser) {
this.updateUser = updateUser;
}
public Date getUpdateDate() {
return updateDate;
}
public void setUpdateDate(Date updateDate) {
this.updateDate = updateDate;
}
public Integer getIsDel() {
return isDel;
}
public void setIsDel(Integer isDel) {
this.isDel = isDel;
}
}
然后开始新增Dao层,并修改DBUtil.java
DBUtil.java代码如下:
package com.study.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil {
private static final String URL="jdbc:mysql://localhost:3306/demo_jdbc";
private static final String NAME="root";
private static final String PASSWORD="root";
private static Connection conn=null;
//静态代码块(将加载驱动、连接数据库放入静态块中)
static{
try {
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2.获得数据库的连接
conn = DriverManager.getConnection(URL, NAME, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
//对外提供一个方法来获取数据库连接
public static Connection getConnection(){
return conn;
}
public static void main(String[] args) throws Exception{
//3.通过数据库的连接操作数据库,实现增删改查
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select user_name,age from imooc_goddess");//选择import java.sql.ResultSet;
while(rs.next()){//如果对象中有数据,就会循环打印出来
System.out.println(rs.getString("user_name")+","+rs.getInt("age"));
}
}
}
goddessDao.java 代码如下:
package com.study.dao;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.study.db.DBUtil;
import com.study.model.Goddess;
public class GoddessDao {
public void addGoddess(){
}
public void updateGoddess(){
}
public void delGoddess(){
}
public List query() throws Exception{
Connection con=DBUtil.getConnection();
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("select user_name,age from imooc_goddess");
List gs=new ArrayList();
Goddess g=null;
while(rs.next()){//如果对象中有数据,就会循环打印出来
g=new Goddess();
g.setUserName(rs.getString("user_name"));
g.setAge(rs.getInt("age"));
gs.add(g);
}
return gs;
}
//查询单个女神
public Goddess get(){
return null;
}
}
新增Controller层:GoddessAction.java
package com.study.controller;
import java.util.List;
import com.study.dao.GoddessDao;
import com.study.model.Goddess;
public class GoddessAction {
public static void main(String[] args) throws Exception {
GoddessDao gd=new GoddessDao();
List gs=gd.query();
for (Goddess goddess : gs) {
System.out.println(goddess.getUserName()+","+goddess.getAge());
}
}
}
PS:CRUD:增加(Create)、读取(Retrieve)(重新得到数据-->高级应用:报表、分页)、更新(Update)和删除(Delete)
3、搭建模型层——CRUD操作
新增create操作:
//添加女神
public void addGoddess(Goddess g) throws Exception{
Connection con=DBUtil.getConnection();//首先拿到数据库的连接
String sql="" +
"insert into imooc_goddess"+
"(user_name,sex,age,birthday,email,mobile,"+
"create_user,create_date,update_user,update_date,isdel) "+
"values("+
"?,?,?,?,?,?,?,current_date(),?,current_date(),?)";//参数用?表示,相当于占位符;用mysql的日期函数current_date()来获取当前日期
//预编译sql语句
PreparedStatement psmt = con.prepareStatement(sql);
//先对应SQL语句,给SQL语句传递参数
psmt.setString(1, g.getUserName());
psmt.setInt(2, g.getSex());
psmt.setInt(3, g.getAge());
//注意:setDate()函数第二个参数需要的是java.sql.Date类型,我们传进来的是java.util.Date,类型不符,需要做一下转换
psmt.setDate(4, new Date(g.getBirthday().getTime()));
psmt.setString(5, g.getEmail());
psmt.setString(6, g.getMobile());
psmt.setString(7, g.getCreateUser());
psmt.setString(8, g.getUpdateUser());
psmt.setInt(9, g.getIsDel());
//执行SQL语句
psmt.execute();
}
测试:
package com.study.controller;
import java.util.Date;
import java.util.List;
import com.study.dao.GoddessDao;
import com.study.model.Goddess;
public class GoddessAction {
public static void main(String[] args) throws Exception {
GoddessDao gd=new GoddessDao();
Goddess g1=new Goddess();
g1.setUserName("小夏");
g1.setAge(22);
g1.setSex(1);
g1.setBirthday(new Date());
g1.setEmail("xiaoxia@qq.com");
g1.setMobile("123456789");
g1.setCreateUser("admin");
g1.setUpdateUser("admin");
g1.setIsDel(1);
//添加女神
gd.addGoddess(g1);
}
}
修改、删除、查询(根据id)操作:
//更新女神
public void updateGoddess(Goddess g) throws SQLException{
Connection con=DBUtil.getConnection();//首先拿到数据库的连接
String sql="" +
"update imooc_goddess "+
"set user_name=?,sex=?,age=?,birthday=?,email=?,mobile=?,"+
"update_user=?,update_date=current_date(),isdel=?) "+
"where id=?";//参数用?表示,相当于占位符;用mysql的日期函数current_date()来获取当前日期
//预编译sql语句
PreparedStatement psmt = con.prepareStatement(sql);
//先对应SQL语句,给SQL语句传递参数
psmt.setString(1, g.getUserName());
psmt.setInt(2, g.getSex());
psmt.setInt(3, g.getAge());
//注意:setDate()函数第二个参数需要的是java.sql.Date类型,我们传进来的是java.util.Date,类型不符,需要做一下转换
psmt.setDate(4, new Date(g.getBirthday().getTime()));
psmt.setString(5, g.getEmail());
psmt.setString(6, g.getMobile());
psmt.setString(7, g.getUpdateUser());
psmt.setInt(8, g.getIsDel());
psmt.setInt(9, g.getId());
//执行SQL语句
psmt.execute();
}
//删除女神
public void delGoddess(Integer id) throws SQLException{
Connection con=DBUtil.getConnection();//首先拿到数据库的连接
String sql="" +
"delete from imooc_goddess "+
"where id=?";//参数用?表示,相当于占位符;用mysql的日期函数current_date()来获取当前日期
//预编译sql语句
PreparedStatement psmt = con.prepareStatement(sql);
//先对应SQL语句,给SQL语句传递参数
psmt.setInt(1, id);
//执行SQL语句
psmt.execute();
}
//查询单个女神(根据id去查询)
public Goddess get(Integer id) throws SQLException{
Goddess g=null;
Connection con=DBUtil.getConnection();//首先拿到数据库的连接
String sql="" +
"select * from imooc_goddess "+
"where id=?";//参数用?表示,相当于占位符;用mysql的日期函数current_date()来获取当前日期
//预编译sql语句
PreparedStatement psmt = con.prepareStatement(sql);
//先对应SQL语句,给SQL语句传递参数
psmt.setInt(1, id);
//执行SQL语句
//execute()方法是执行更改数据库操作(包括新增、修改、删除);executeQuery()是执行查询操作
ResultSet rs = psmt.executeQuery();//返回一个结果集
//遍历结果集
while(rs.next()){
g=new Goddess();
g.setId(rs.getInt("id"));
g.setUserName(rs.getString("user_name"));
g.setAge(rs.getInt("age"));
g.setSex(rs.getInt("sex"));
//rs.getDate("birthday")获得的是java.sql.Date类型。注意:java.sql.Date类型是java.util.Date类型的子集,所以这里不需要进行转换了。
g.setBirthday(rs.getDate("birthday"));
g.setEmail(rs.getString("email"));
g.setMobile(rs.getString("mobile"));
g.setCreateUser(rs.getString("create_user"));
g.setCreateDate(rs.getDate("create_date"));
g.setUpdateUser(rs.getString("update_user"));
g.setUpdateDate(rs.getDate("update_date"));
g.setIsDel(rs.getInt("isdel"));
}
return g;
}
查询(根据namemobile等)操作
//查询单个女神(根据姓名等信息去查询) public Listget(String name,String mobile) throws SQLException{ List result=new ArrayList (); Connection con=DBUtil.getConnection();//首先拿到数据库的连接 StringBuffer sb=new StringBuffer(); sb.append("select * from imooc_goddess "); sb.append("where user_name like ? and mobile like ?"); //预编译sql语句 PreparedStatement psmt = con.prepareStatement(sb.toString()); //先对应SQL语句,给SQL语句传递参数 psmt.setString(1, "%"+name+"%"); psmt.setString(2, "%"+mobile+"%"); System.out.println(sb.toString()); //执行SQL语句 //execute()方法是执行更改数据库操作(包括新增、修改、删除);executeQuery()是执行查询操作 ResultSet rs = psmt.executeQuery();//返回一个结果集 Goddess g=null; //遍历结果集 while(rs.next()){ g=new Goddess(); g.setId(rs.getInt("id")); g.setUserName(rs.getString("user_name")); g.setAge(rs.getInt("age")); g.setSex(rs.getInt("sex")); //rs.getDate("birthday")获得的是java.sql.Date类型。注意:java.sql.Date类型是java.util.Date类型的子集,所以这里不需要进行转换了。 g.setBirthday(rs.getDate("birthday")); g.setEmail(rs.getString("email")); g.setMobile(rs.getString("mobile")); g.setCreateUser(rs.getString("create_user")); g.setCreateDate(rs.getDate("create_date")); g.setUpdateUser(rs.getString("update_user")); g.setUpdateDate(rs.getDate("update_date")); g.setIsDel(rs.getInt("isdel")); result.add(g);//将结果封装到对象中 } return result; }
测试:
package com.study.controller;
import java.util.Date;
import java.util.List;
import com.study.dao.GoddessDao;
import com.study.model.Goddess;
public class GoddessAction {
public static void main(String[] args) throws Exception {
GoddessDao gd=new GoddessDao();
Goddess g1=new Goddess();
g1.setUserName("小夏");
g1.setAge(22);
g1.setSex(1);
g1.setBirthday(new Date());
g1.setEmail("xiaoxia@qq.com");
g1.setMobile("123456789");
g1.setCreateUser("admin");
g1.setUpdateUser("admin");
g1.setIsDel(1);
//添加女神
// gd.addGoddess(g1);
//查询单个女神(根据id)
//查询单个女神(根据姓名等信息)
List list = gd.get("小溪", "139");
//遍历结果集
for(int i=0;i
运行结果:
select * from imooc_goddess where user_name like ? and mobile like ?
Goddess [id=1, userName=小溪, sex=1, age=22, birthday=2000-12-12, email=xiaoxi@163.com, mobile=13911111111, createUser=ADMIN, createDate=2015-01-08, updateUser=ADMIN, updateDate=2015-01-08, isDel=0]
查询操作的进一步完善:
//查询单个女神(根据姓名等信息去查询)----->使用Map存储条件信息;防止条件为空可加一条where 1=1
public List get(List
测试:
//查询单个女神(根据姓名等信息去查询)----->使用Map存储条件信息
List



