JDBC
基本增删改:(SQL语句写死)
public static final String URL = "jdbc:mysql://localhost:3306/test";
public static final String USERNAME = "root";
public static final String PASSWORD = "root";
/**
* 插入
*/
public static void insert(){
try {
//1、加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取数据库连接
Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
//3、构造SQL语句
String sql = "insert into person(name,age,description)values('小白',18,'一个人')";
//4、构造Statement实例 (用于发送sql语句载体)
Statement state = conn.createStatement();
//5、执行sql语句
System.out.println(state.executeUpdate(sql)+"条语句被执行");
//关闭连接 释放资源
state.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 修改
*/
public static void update(){
try {
//1、加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取数据库连接
Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
//3、构造SQL语句
String sql = "update person set age =28 where id = 2";
//4、构造Statement实例 (用于发送sql语句载体)
Statement state = conn.createStatement();
//5、执行sql语句
System.out.println(state.executeUpdate(sql)+"条语句被执行");
//关闭连接 释放资源
state.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 删除
*/
public static void delete(){
try {
//1、加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取数据库连接
Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
//3、构造SQL语句
String sql = "delete from person where id = 3";
//4、构造Statement实例 (用于发送sql语句载体)
Statement state = conn.createStatement();
//5、执行sql语句
System.out.println(state.executeUpdate(sql)+"条语句被执行");
//关闭连接 释放资源
state.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
SQL语句传值
/**
* 增加
*/
public static void insert2(){
String name = "小黑";
String age = "35";
String description = "两个人";
try {
//1、加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取数据库连接
Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
//3、构造SQL语句
String sql = "insert into person(name,age,description)values('"+name+"',"+age+",'"+description+"')";
//4、构造Statement实例 (用于发送sql语句载体)
Statement state = conn.createStatement();
//5、执行sql语句
System.out.println(state.executeUpdate(sql)+"条语句被执行");
//关闭连接 释放资源
state.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
基本查询
public static final String URL = "jdbc:mysql://localhost:3306/test";
public static final String USERNAME = "root";
public static final String PASSWORD = "root";
/**
* 查询
*/
public static void query(){
try {
//1、加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取数据库连接
Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
//3、构造SQL语句
String sql = "select id,name,age,description from person";
//4、构造Statement实例 (用于发送sql语句载体)
Statement state = conn.createStatement();
//5、执行sql语句
ResultSet rs = state.executeQuery(sql);
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String description = rs.getString("description");
System.out.println("id="+id+",name="+name+"+age="+age+",description="+description);
}
//关闭连接 释放资源
rs.close();
state.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
PreparedStatement
public static final String URL = "jdbc:mysql://localhost:3306/test";
public static final String USERNAME = "root";
public static final String PASSWORD = "root";
/**
* 插入
*/
public static void insert(){
try {
//1、加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取数据库连接
Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
//3、构造SQL语句
String sql = "insert into person(name,age,description)values(?,?,?)";
//4、构造Statement实例 (用于发送sql语句载体)
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "马汉三");
ps.setInt(2, 53);
ps.setString(3, "一个人");
//5、执行sql语句
System.out.println(ps.executeUpdate()+"条语句被执行");
//关闭连接 释放资源
ps.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
事务
public static final String URL = "jdbc:mysql://localhost:3306/test";
public static final String USERNAME = "root";
public static final String PASSWORD = "root";
/**
* 事务
*/
public static void insert(){
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
conn.setAutoCommit(false); //设置手动提交
String sql1 = "insert into person(name,age,description)values(?,?,?)";
String sql2 = "update person set name=? where id=?";
PreparedStatement ps = conn.prepareStatement(sql1);
ps.setString(1, "方孟敖");
ps.setInt(2, 53);
ps.setString(3, "一个人");
ps.executeUpdate();
ps = conn.prepareStatement(sql2);
ps.setString(1, "方就停");
ps.setInt(2, 6);
ps.executeUpdate();
conn.commit(); //提交
//关闭连接 释放资源
ps.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback(); //回滚
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
封装JDBC工具类
DBUtils.java
package com.java;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtils {
//数据库链接地址
public static final String URL = "jdbc:mysql://localhost:3306/test";
//用户名
public static final String USERNAME = "root";
//密码
public static final String PASSWORD = "root";
//驱动信息
public static final String DRIVER = "com.mysql.jdbc.Driver";
//私有构造方法
private DBUtils() {
}
//使用静态代码块加载驱动
static{
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//定义一个获取数据库连接的方法
public static Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("获取数据库连接失败");
}
return conn;
}
//关闭数据库连接资源
public static void close(ResultSet rs,Statement stat,Connection conn){
try {
if(rs!=null)rs.close();
if(stat!=null)stat.close();
if(conn!=null)conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Test.javapackage com.java;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Test {
/**
* 查询方法
*/
public static void findAll(){
//通过工具类获取数据库连接
Connection conn = DBUtils.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select name,age,description from person";
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()){
String name = rs.getString("name");
int age = rs.getInt("age");
String description = rs.getString("description");
System.out.println(name+age+description);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBUtils.close(rs, ps, conn);
}
}
public static void main(String[] args) {
findAll();
}
}
DAO模式
典型到实现由以下几个组件:
- 一个DAO接口
- 一个DAO实现类
- 数据传递对象(DTO)、或也叫值对象(VO)、或领域模型(domain)
PersonDao.java
package com.java.dao;
import java.sql.SQLException;
import java.util.List;
import com.java.db.Person;
public interface PersonDao {
//添加方法
public void add(Person p)throws SQLException;
//更新方法
public void update(Person p)throws SQLException;
//删除方法
public void delete(int id)throws SQLException;
//查找方法
public Person findById(int id)throws SQLException;
//查找所有
public List<Person> findAll()throws SQLException;
}
PersonDaoImpl.java
package com.java.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.java.dao.PersonDao;
import com.java.db.DBUtils;
import com.java.db.Person;
/**
* 实现类
*/
public class PersonDaoImpl implements PersonDao{
//实现添加方法
@Override
public void add(Person p) throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
String sql = "insert into person(name,age,description)values(?,?,?)";
try {
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setString(1, "王小五");
ps.setInt(2, 50);
ps.setString(3, "小流氓");
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
DBUtils.close(null, ps, conn);
}
}
//实现删除方法
@Override
public void delete(int id) throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
String sql = "delete from person where id=?";
try {
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
DBUtils.close(null, ps, conn);
}
}
//查询所有数据
@Override
public List<Person> findAll() throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Person p = null;
List<Person> personList = new ArrayList<Person>();
String sql = "select id,name,age,description from person";
try {
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()){
p = new Person();
p.setId(rs.getInt("id"));
p.setName(rs.getString("name"));
p.setAge(rs.getInt("age"));
p.setDescription(rs.getString("description"));
personList.add(p);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
DBUtils.close(rs, ps, conn);
}
return personList;
}
//根据id查询一个对象
@Override
public Person findById(int id) throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Person p = null;
String sql = "select name,age,description from person where id=?";
try {
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
rs = ps.executeQuery();
if(rs.next()){
p = new Person();
p.setName(rs.getString("name"));
p.setAge(rs.getInt("age"));
p.setDescription(rs.getString("description"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
DBUtils.close(rs, ps, conn);
}
return p;
}
//实现修改方法
@Override
public void update(Person p) throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
String sql = "update person set name=?,age=?,description=? where id=?";
try {
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setString(1, "王大五");
ps.setInt(2, 50);
ps.setString(3, "大流氓");
ps.setInt(4, p.getId());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
DBUtils.close(null, ps, conn);
}
}
}
DBUtils.java
package com.java.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtils {
//数据库链接地址
public static final String URL = "jdbc:mysql://localhost:3306/test";
//用户名
public static final String USERNAME = "root";
//密码
public static final String PASSWORD = "root";
//驱动信息
public static final String DRIVER = "com.mysql.jdbc.Driver";
//私有构造方法
private DBUtils() {
}
//使用静态代码块加载驱动
static{
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//定义一个获取数据库连接的方法
public static Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("获取数据库连接失败");
}
return conn;
}
//关闭数据库连接资源
public static void close(ResultSet rs,Statement stat,Connection conn){
try {
if(rs!=null)rs.close();
if(stat!=null)stat.close();
if(conn!=null)conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Person.java
package com.java.db;
public class Person {
private int id;
private String name;
private int age;
private String description;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
DAO模式(增删改优化)
JdbcTemplete.java
package com.java.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.java.db.DBUtils;
public class JdbcTemplete {
/**
* 实现增删改的抽象
* @param sql
* @param args
*/
public int update(String sql,Object...args)throws SQLException{
Connection conn = null;
PreparedStatement ps = null;
try {
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
if(args != null){
for(int i=0;i<args.length;i++){
ps.setObject(i+1, args[i]);
}
}
return ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
return -1;
}finally{
DBUtils.close(null, ps, conn);
}
}
}
PersonDaoImpl.java
package com.java.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.java.dao.PersonDao;
import com.java.db.DBUtils;
import com.java.db.Person;
/**
* 实现类
*/
public class PersonDaoImpl implements PersonDao{
private JdbcTemplete jdbcTemplete;
public PersonDaoImpl() {
jdbcTemplete = new JdbcTemplete();
}
//实现添加方法
@Override
public void add(Person p) throws SQLException {
String sql = "insert into person(name,age,description)values(?,?,?)";
jdbcTemplete.update(sql, p.getName(),p.getAge(),p.getDescription());
}
//实现修改方法
@Override
public void update(Person p) throws SQLException {
String sql = "update person set name=?,age=?,description=? where id=?";
jdbcTemplete.update(sql, p.getName(),p.getAge(),p.getDescription(),p.getId());
}
//实现删除方法
@Override
public void delete(int id) throws SQLException {
String sql = "delete from person where id=?";
jdbcTemplete.update(sql,id);
}
//查询所有数据
@Override
public List<Person> findAll() throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Person p = null;
List<Person> personList = new ArrayList<Person>();
String sql = "select id,name,age,description from person";
try {
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()){
p = new Person();
p.setId(rs.getInt("id"));
p.setName(rs.getString("name"));
p.setAge(rs.getInt("age"));
p.setDescription(rs.getString("description"));
personList.add(p);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
DBUtils.close(rs, ps, conn);
}
return null;
}
//根据id查询一个对象
@Override
public Person findById(int id) throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Person p = null;
String sql = "select name,age,description from person where id=?";
try {
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
rs = ps.executeQuery();
if(rs.next()){
p = new Person();
p.setName(rs.getString("name"));
p.setAge(rs.getInt("age"));
p.setDescription(rs.getString("description"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
DBUtils.close(rs, ps, conn);
}
return null;
}
}
开源工具DbUtils的使用 (最终的)
PersonDao.java
package com.java.dao;
import java.sql.SQLException;
import java.util.List;
import com.java.domain.Person;
public interface PersonDao {
//添加方法
public void add(Person p)throws SQLException;
//更新方法
public void update(Person p)throws SQLException;
//删除方法
public void delete(int id)throws SQLException;
//查找方法
public Person findById(int id)throws SQLException;
//查找所有
public List<Person> findAll()throws SQLException;
//查询所有记录数
public Long personCount() throws SQLException;
}
PersonDaoImpl.java
package com.java.dao.impl;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import com.java.dao.PersonDao;
import com.java.domain.DBUtils;
import com.java.domain.Person;
/**
* 实现类
*/
public class PersonDaoImpl implements PersonDao{
private QueryRunner queryRunner = null; //查询运行器
public PersonDaoImpl() {
queryRunner = new QueryRunner();
}
//增加方法
@Override
public void add(Person p) throws SQLException {
String sql = "insert into person(name,age,description)values(?,?,?)";
queryRunner.update(DBUtils.getConnection(), sql, p.getName(),p.getAge(),p.getDescription());
}
// 修改方法
@Override
public void update(Person p) throws SQLException {
String sql = "update person set name=?,age=?,description=? where id=?";
queryRunner.update(DBUtils.getConnection(), sql, p.getName(),p.getAge(),p.getDescription(),p.getId());
}
//删除方法
@Override
public void delete(int id) throws SQLException {
String sql = "delete from person where id=?";
queryRunner.update(DBUtils.getConnection(), sql, id);
}
//使用BeanHandler查询一个对象
@Override
public Person findById(int id) throws SQLException {
String sql = "select name,age,description from person where id=?";
Person p = queryRunner.query(DBUtils.getConnection(), sql, new BeanHandler<Person>(Person.class),id);
return p;
}
//查询对象列表
@Override
public List<Person> findAll() throws SQLException {
String sql = "select name,age,description from person";
List<Person> ps= queryRunner.query(DBUtils.getConnection(), sql, new BeanListHandler<Person>(Person.class));
return ps;
}
//返回总数
public Long personCount() throws SQLException {
String sql = "select count(id) from person";
return queryRunner.query(DBUtils.getConnection(),sql, new ScalarHandler<Long>());
}
}
DBUtils.java
package com.java.domain;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtils {
//数据库链接地址
public static final String URL = "jdbc:mysql://localhost:3306/test";
//用户名
public static final String USERNAME = "root";
//密码
public static final String PASSWORD = "root";
//驱动信息
public static final String DRIVER = "com.mysql.jdbc.Driver";
//私有构造方法
private DBUtils() {
}
//使用静态代码块加载驱动
static{
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//定义一个获取数据库连接的方法
public static Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("获取数据库连接失败");
}
return conn;
}
//关闭数据库连接资源
public static void close(ResultSet rs,Statement stat,Connection conn){
try {
if(rs!=null)rs.close();
if(stat!=null)stat.close();
if(conn!=null)conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Person.java
package com.java.domain;
public class Person {
private int id;
private String name;
private int age;
private String description;
public Person() {}
public Person(String name, int age, String description) {
this.name = name;
this.age = age;
this.description = description;
}
public Person(int id, String name, int age, String description) {
this.id = id;
this.name = name;
this.age = age;
this.description = description;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
Test.java
package com.java.domain;
import java.sql.SQLException;
import java.util.List;
import com.java.dao.PersonDao;
import com.java.dao.impl.PersonDaoImpl;
public class Test {
public static void main(String[] args) throws SQLException {
PersonDao personDao = new PersonDaoImpl();
//添加一条信息
personDao.add(new Person("李四", 15, "小朋友"));
//修改一条数据
personDao.update(new Person(10,"老大", 15, "小朋友"));
//删除一条数据
personDao.delete(5);
//查询id为5的数据
Person p = personDao.findById(4);
System.out.println(p);
//查询所有数据
List<Person> personList= personDao.findAll();
System.out.println(personList);
//查询数据总数
Long i = personDao.personCount();
System.out.println(i);
}
}