✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:乐趣国学的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:一个案例学会Dao+service层对数据表的增删改查
文章目录
- 案例
- 建表
- 配置
- Animal类
- DBUtils数据库工具类
- DateUtils日期类
- AnimalDaoImpl类
- AnimalServiceImpl类
- AnimalTest测试类
案例
使用读取配置文件的形式连接数据库,(Dao层+service层)对animal表进行增删改查操作。
animal表字段如下
aid int 主键 自增长 -->宠物编号
name varchar(10) 非空 -->宠物名称
age int 非空 -->宠物年龄
birthday Date 非空
建表
CREATE TABLE IF NOT EXISTS `animal`(
`aid` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(10) NOT NULL,
`age` INT NOT NULL,
`birthday` DATE
);
配置
添加mysql-connector-java-5.1.0-bin.jar文件并使用。
添加db.properties文件
Animal类
定义一个Animal类,添加和animal表字段相同的私有变量
// 定义属性
private int aid;
private String name;
private int age;
private Date birthday;
添加一个无参构造
public Animal() {
super();
}
添加一个全部字段的有参构造
public Animal(int aid, String name, int age, Date birthday) {
super();
this.aid = aid;
this.name = name;
this.age = age;
this.birthday = birthday;
}
添加一个不带aid字段的有参构造
public Animal(String name, int age, String gender, Date birthday,
String identityCard, String phone, String address, double salary) {
super();
this.name = name;
this.age = age;
this.birthday = birthday;
}
给私有变量添加get/set方法
public int getAid() {
return aid;
}
public void setAid(int aid) {
this.aid = aid;
}
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 Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
重写ToString方法
@Override
public String toString() {
return "Animal [aid=" + aid + ", name=" + name + ", age=" + age
+ ", birthday=" + birthday + "]";
}
DBUtils数据库工具类
声明一个ThreadLocal对象,用来存储Connection连接对象;注册驱动、获取连接、然后释放资源方法。
private static final Properties PROPERTIES = new Properties();
// 声明一个ThreadLocal<Connection>对象,用来存储Connection连接对象
private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
static {
InputStream is = DBUtils.class.getResourceAsStream("/db.properties");
try {
PROPERTIES.load(is);
// 1、注册驱动
Class.forName(PROPERTIES.getProperty("driver"));
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 2、获取连接方法
public static Connection getConnection() {
Connection connection = threadLocal.get();
// 2、获取连接对象
try {
// 如果连接对象为null,创建一个连接对象
if (connection == null) {
connection = DriverManager.getConnection(
PROPERTIES.getProperty("url"),
PROPERTIES.getProperty("username"),
PROPERTIES.getProperty("password"));
threadLocal.set(connection);
}
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
// 3、释放资源方法
public static void closeAll(ResultSet resultSet, Statement statement,
Connection connection) {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
// 移除 ThreadLocal<Connection> 对象
threadLocal.remove();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
开启事务
public static void startTransaction() {
Connection connection = getConnection();
try {
connection.setAutoCommit(false);
} catch (SQLException e) {
e.printStackTrace();
}
}
提交事务
public static void commitTransaction() {
Connection connection = getConnection();
try {
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtils.closeAll(null, null, connection);
}
}
回滚事务
public static void rollbackTransaction() {
Connection connection = getConnection();
try {
connection.rollback();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtils.closeAll(null, null, connection);
}
}
DateUtils日期类
public class DateUtils {
// 声明一个SimpleDateFormat类型的静态常量
public static final SimpleDateFormat SIMPLEDATEFORMAT=new SimpleDateFormat("yyyy-MM-dd");
// 定义方法实现将字符串类型的数据转换成java.util.Date类型
public static java.util.Date strToUtilDate(String strDate){
try {
return SIMPLEDATEFORMAT.parse(strDate);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
// 定义方法实现将java.util.Date类型转换为字符串
public static String utilDateToString(java.util.Date utilDate){
return SIMPLEDATEFORMAT.format(utilDate);
}
// 定义方法实现架构java.util.Date类型转换为java.sql.Date类型
public static java.sql.Date utilDateToSqlDate(java.util.Date utilDate){
return new java.sql.Date(utilDate.getTime());
}
}
AnimalDaoImpl类
DAO层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表的增删改查,也就是说某个DAO一定是和数据库的某一张表一一对应的,其中封装了增删改查基本操作,建议DAO只做原子操作,增删改查。
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class AnimalDaoImpl {
//全局变量
PreparedStatement preS=null;
Connection connection;
//增
public int insert(Animal animal){
//获取链接
connection=DBUtils.getConnection();
String sql="insert into animal values(?,?,?,?);";
try {
preS=connection.prepareStatement(sql);
// 绑定参数
preS.setInt(1, animal.getAid());
preS.setString(2, animal.getName());
preS.setInt(3, animal.getAge());
preS.setDate(4, DateUtils.utilDateToSqlDate(animal.getBirthday()));
return preS.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBUtils.closeAll(null, preS, null);
}
return 0;
}
//删
public int delete(int aid) {
//获取链接
connection = DBUtils.getConnection();
String sql = "delete from animal where aid = ?;";
try {
preS = connection.prepareStatement(sql);
// 绑定参数
preS.setInt(1, aid);
return preS.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtils.closeAll(null, preS, null);
}
return 0;
}
//改
public int update(Animal animal) {
//获取链接
connection = DBUtils.getConnection();
String sql = "update animal set name = ?,age = ?,birthday= ? where aid=?;";
try {
preS = connection.prepareStatement(sql);
// 绑定参数
preS.setString(1, animal.getName());
preS.setInt(2, animal.getAge());
preS.setDate(3, DateUtils.utilDateToSqlDate(animal.getBirthday()));
preS.setInt(4, animal.getAid());
return preS.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtils.closeAll(null, preS, null);
}
return 0;
}
//查(单个)
public Animal select(int aid) {
ResultSet resultSet = null;
Animal animal = null;
//获取连接
connection = DBUtils.getConnection();
String sql = "select * from animal where aid = ?";
try {
preS = connection.prepareStatement(sql);
// 绑定参数
preS.setInt(1, aid);
resultSet = preS.executeQuery();
if (resultSet.next()) {
animal=new Animal(aid, resultSet.getString(2), resultSet.getInt(3), resultSet.getDate(4));
}
return animal;
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtils.closeAll(resultSet, preS, null);
}
return null;
}
//查(全部)
public List<Animal> selectAll() {
ResultSet resultSet = null;
Animal animal = null;
List<Animal> animalList = new ArrayList<Animal>();
//获取连接
connection = DBUtils.getConnection();
String sql = "select * from animal";
try {
preS = connection.prepareStatement(sql);
resultSet = preS.executeQuery();
while (resultSet.next()) {
animal=new Animal(resultSet.getInt(1), resultSet.getString(2), resultSet.getInt(3), resultSet.getDate(4));
animalList.add(animal);
}
return animalList;
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtils.closeAll(resultSet, preS, null);
}
return null;
}
}
AnimalServiceImpl类
Service层叫服务层,被称为服务,粗略的理解就是对一个或多个DAO进行的再次封装,封装成一个服务,所以这里也就不会是一个原子操作了,需要事物控制。
public class AnimalServiceImpl {
//定义AnimalDaoImpl对象
AnimalDaoImpl animalDao=new AnimalDaoImpl();
//新增信息
public boolean addNewData(Animal animal) {
int num=animalDao.insert(animal);
if(num!=0){
return true;
}else{
return false;
}
}
//删除信息
public boolean delDate(int aid){
int num=animalDao.delete(aid);
if(num!=0){
return true;
}else{
return false;
}
}
//修改信息
public boolean updateDate(Animal animal){
int num=animalDao.update(animal);
if(num!=0){
return true;
}else{
return false;
}
}
//查询信息
public boolean selectDate(int aid){
Animal animal=animalDao.select(aid);
if(animal!=null){
return true;
}else{
return false;
}
}
//查询所有信息
public void selectAllDates(){
List<Animal> animalList=animalDao.selectAll();
if(animalList.size()>0){
System.out.println("****所有动物信息****");
for (Animal animal : animalList) {
System.out.println(animal);
}
}
}
}
AnimalTest测试类
package cn.bdqn.demo02;
public class AnimalTest {
public static void main(String[] args) {
//创建AnimalServiceImpl对象
AnimalServiceImpl animalServiceImpl = new AnimalServiceImpl();
//增加三条数据
Animal animal1 = new Animal(1, "旺财", 3,DateUtils.strToUtilDate("2019-08-18"));
Animal animal2 = new Animal(2, "tom", 4,DateUtils.strToUtilDate("2018-06-25"));
Animal animal3 = new Animal(3, "佩奇", 5,DateUtils.strToUtilDate("2017-07-02"));
animalServiceImpl.addNewData(animal1);
animalServiceImpl.addNewData(animal2);
animalServiceImpl.addNewData(animal3);
//删(aid=3)的数据
animalServiceImpl.delDate(3);
//改
Animal animal4 = new Animal(1, "旺财", 4,DateUtils.strToUtilDate("2018-12-18"));
animalServiceImpl.updateDate(animal4);
//查一条(aid=2)的数据
animalServiceImpl.selectDate(2);
//查全部
animalServiceImpl.selectAllDates();
}
}