2022.4.29 ORM与实体类 DAO Service业务逻辑层 三层架构 事务

ORM与实体类

创建mybatis数据库

复制代码
 1  CREATE DATABASE `mybatis`
 2  USE `mybatis`
 3  4  CREATE TABLE `user`(
 5   `id` INT(20) NOT NULL,
 6   `name` VARCHAR(30) NOT NULL,
 7   `pwd` VARCHAR(30) NOT NULL,
 8   PRIMARY KEY(`id`)
 9  )ENGINE=INNODB DEFAULT CHARSET=utf8;
10 11  INSERT
12  INTO `user`(`id`,`name`,`pwd`) 
13  VALUES(1,'小明','123456'),(2,'小红','123456'),(3,'小蓝','123457')
复制代码

将配置文件数据库名切换为mybatis

1  driver=com.mysql.jdbc.Driver
2  url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=true
3  username = root
4  password = 123456

User.java

复制代码
 1 package com.xing.pojo;
 2  3 import lombok.AllArgsConstructor;
 4 import lombok.Data;
 5 import lombok.NoArgsConstructor;
 6 
 7 // 实体类
 8 @Data
 9 @NoArgsConstructor
10 @AllArgsConstructor
11 public class User {
12     private int id;
13     private String name;
14     private String pwd;
15 }
复制代码

Test.Select

复制代码
 1  package com.xing.JDBC;
 2  3  import com.xing.JDBC.utils.JdbcUtils;
 4  import com.xing.pojo.User;
 5  6  import java.sql.*;
 7  import java.util.ArrayList;
 8  import java.util.List;
 9 10  import java.sql.Connection;
11          import java.sql.PreparedStatement;
12          import java.sql.ResultSet;
13          import java.sql.SQLException;
14 15  public class TestSelect {
16      public static void main(String[] args) {
17          Connection conn = null;
18          PreparedStatement st = null;
19          ResultSet rs = null;
20 21          List<User> list = new ArrayList<>();
22          try {
23              conn = JdbcUtils.getConnection();
24 25              String sql = "select * from user";
26 27              st = conn.prepareStatement(sql);//预编译  先写sql 然后不执行
28 29              //执行  不用传参
30              rs = st.executeQuery();
31              while(rs.next()){
32 33                  String name = rs.getString("name");
34                  int id = rs.getInt("id");
35 36                  //创建对象,封装查询到的零散资源
37                  User user = new User();
38                  user.setId(id);
39                  user.setName(name);
40                  //每遍历一次得到对象,存放到集合中,方便后续使用
41                  list.add(user);
42              }
43 44              //遍历集合
45              for (User user : list) {
46                  System.out.println(user);
47              }
48 49          } catch (SQLException e) {
50              e.printStackTrace();
51          }finally {
52              JdbcUtils.release(conn,st,rs);
53          }
54      }
55  }
复制代码

DAO数据请问对象(Data Access Object)

DAQ实现了业务逻辑(用户登录等操作)与数据库访问(从数据库获得连接开始到关闭连接)相分离。

  • 对同一张表的所有操作封装在XxxDaolmpl对象中

  • 根据增删改查的不同功能实现具体的方法(insert、update、delete、select、selectAll)

UserDaoImpl.java

复制代码
  1  package com.xing.JDBC;
  2   3  import com.xing.JDBC.utils.JdbcUtils;
  4  import com.xing.pojo.User;
  5   6  import java.sql.Connection;
  7  import java.sql.PreparedStatement;
  8  import java.sql.ResultSet;
  9  import java.sql.SQLException;
 10  import java.util.ArrayList;
 11  import java.util.List;
 12  13  public class UserDaoImpl {
 14      //新增
 15      public int insert(User user){
 16          Connection conn = null;
 17          PreparedStatement st = null;
 18  19          String sql = "insert into user(id,name,pwd) value(?,?,?)";
 20          try {
 21              conn = JdbcUtils.getConnection();
 22              st = conn.prepareStatement(sql);
 23              st.setInt(1,user.getId());
 24              st.setString(2,user.getName());
 25              st.setString(3,user.getPwd());
 26              //返回受影响行数
 27              int result = st.executeUpdate();
 28              return result;
 29          } catch (SQLException e) {
 30              e.printStackTrace();
 31          }finally {
 32              JdbcUtils.release(conn,st,null);
 33          }
 34          return 0;
 35      }
 36      //修改
 37      public int update(User user){
 38          Connection conn = null;
 39          PreparedStatement st = null;
 40  41          String sql = "update user set name = ?,pwd = ? where id = ?";
 42          try {
 43              conn = JdbcUtils.getConnection();
 44              st = conn.prepareStatement(sql);
 45              st.setString(1,user.getName());
 46              st.setString(2,user.getPwd());
 47              st.setInt(3,user.getId());
 48  49              //返回受影响行数
 50              int result = st.executeUpdate();
 51              return result;
 52          } catch (SQLException e) {
 53              e.printStackTrace();
 54          }finally {
 55              JdbcUtils.release(conn,st,null);
 56          }
 57          return 0;
 58      }
 59      //删除
 60      public int delete(int id){
 61          Connection conn = null;
 62          PreparedStatement st = null;
 63  64          String sql = "delete from user where id = ?";
 65          try {
 66              conn = JdbcUtils.getConnection();
 67              st = conn.prepareStatement(sql);
 68              st.setInt(1,id);
 69  70              //返回受影响行数
 71              int result = st.executeUpdate();
 72              return result;
 73          } catch (SQLException e) {
 74              e.printStackTrace();
 75          }finally {
 76              JdbcUtils.release(conn,st,null);
 77          }
 78          return 0;
 79      }
 80      //查单个
 81      public User select(int id){
 82          Connection conn = null;
 83          PreparedStatement st = null;
 84          ResultSet rs = null;
 85  86          User user = null;
 87  88          String sql = "select * from user where id = ?";
 89          try {
 90              conn = JdbcUtils.getConnection();
 91              st = conn.prepareStatement(sql);
 92              st.setInt(1,id);
 93              rs = st.executeQuery();
 94  95              if (rs.next()) {//查的某一行,不用while
 96                  user = new User();
 97  98                  int pid = rs.getInt("id");
 99                  String name = rs.getString("name");
100                  String pwd = rs.getString("pwd");
101 102                  user.setId(pid);
103                  user.setName(name);
104                  user.setPwd(pwd);
105              }
106              return user;
107 108          } catch (SQLException e) {
109              e.printStackTrace();
110          }finally {
111              JdbcUtils.release(conn,st,rs);
112          }
113          return null;
114      }
115      //查所有
116      public List<User> selectAll(){
117          Connection conn = null;
118          PreparedStatement st = null;
119          ResultSet rs = null;
120 121          User user = null;
122          List<User> userList = new ArrayList<>();
123          String sql = "select * from user";
124          try {
125              conn = JdbcUtils.getConnection();
126              st = conn.prepareStatement(sql);
127              rs = st.executeQuery();
128 129             while (rs.next()) { 
130                 int pid = rs.getInt("id"); 
131                 String name = rs.getString("name"); 
132                 String pwd = rs.getString("pwd"); 
133 134                 user = new User(pid,name,pwd); 
135                 userList.add(user); 
136             } 
137             return userList; 
138 139         } catch (SQLException e) { 
140             e.printStackTrace(); 
141         }finally { 
142             JdbcUtils.release(conn,st,rs); 
143         } 
144         return null; 
145     } 
146 147 } 
复制代码

插入测试

复制代码
 1  package com.xing.JDBC;
 2  3  import com.xing.pojo.User;
 4  5  public class TestUserInsert {
 6      public static void main(String[] args) {
 7          UserDaoImpl userDao = new UserDaoImpl();
 8          User user = new User(4, "小白", "123456");
 9          int result = userDao.insert(user);//插入
10 11          if (result == 1) {
12              System.out.println("插入成功");
13          } else {
14              System.out.println("插入失败");
15          }
16      }
17  }
复制代码

更新测试

复制代码
 1  package com.xing.JDBC;
 2  3  import com.xing.pojo.User;
 4  5  public class TestUserUpdate {
 6      public static void main(String[] args) {
 7          UserDaoImpl userDao = new UserDaoImpl();
 8          User user = new User(4, "大黄", "123789");
 9          int result = userDao.update(user);//插入
10 11          if (result == 1) {
12              System.out.println("修改成功");
13          } else {
14              System.out.println("修改失败");
15          }
16      }
17  }
复制代码

删除测试

复制代码
 1  package com.xing.JDBC;
 2  3  public class TestUserDelete {
 4      public static void main(String[] args) {
 5          UserDaoImpl userDao = new UserDaoImpl();
 6          int result = userDao.delete(4);
 7          if (result == 1) {
 8              System.out.println("删除成功");
 9          } else {
10              System.out.println("删除失败");
11          }
12      }
13  }
复制代码

查询单个测试

复制代码
 1  package com.xing.JDBC;
 2  3  import com.xing.pojo.User;
 4  5  public class TestUserSelect {
 6      public static void main(String[] args) {
 7          UserDaoImpl userDao = new UserDaoImpl();
 8          User user = userDao.select(1);
 9          if (user != null) {
10              System.out.println(user);
11          } else {
12              System.out.println("没有查询到此信息");
13          } 
14          
15      }
16  }
复制代码

查询所有

复制代码
 1  package com.xing.JDBC;
 2  3  import com.xing.pojo.User;
 4  5  import java.util.List;
 6  7  public class TestUserSelectAll {
 8      public static void main(String[] args) {
 9          UserDaoImpl userDao = new UserDaoImpl();
10          List<User> userList = userDao.selectAll();
11 12          for (User user : userList) {
13              System.out.println(user);
14          }
15      }
16  }
复制代码

Service业务逻辑层

代表用户完成的一个业务功能,可以由一个或多个DAo的调用组成。(软件所提供的一个功能都叫业务)

复制代码
 1  package com.xing.JDBC;
 2  3  import com.xing.pojo.User;
 4  5  public class UserServiceImpl {
 6      //注册!一个业务功能由多个dao的访问操作组成
 7      public void register(User user) {
 8          UserDaoImpl userDao = new UserDaoImpl();
 9          //1.查询用户是否存在 可以重载此方法,使其按照name查询
10          User users = userDao.select(user.getId());
11          //2.不存在,新增
12          if (users == null) {
13              userDao.insert(user);
14              System.out.println("注册成功!");
15          } else {
16              System.out.println("该用户已存在!");
17          }
18      }
19  }
复制代码

复制代码
 1  package com.xing.JDBC;
 2  3  import com.xing.pojo.User;
 4  5  public class TestService {
 6      public static void main(String[] args) {
 7          UserServiceImpl userService = new UserServiceImpl();
 8          User user = new User(1, "小紫", "123456");
 9          userService.register(user);
10      }
11  }
复制代码

三层架构

  • 表示层:命名:XXXView

    • 职责:收集用户的数据和需求展示数据。

  • 业务逻辑层:命名:XXXServicelmpl

    • 职责:数据加工处理、调用DAO完成业务实现、控制事务。

  • 数据访问层:命名:XXXDaolmpl

    • 职责:向业务层提供数据,将业务层加工后的数据同步到数据库。

三层架构项目搭建(按开发步骤)

  • utils 存放工具类(DBUtils)

  • entity存放实体类(User)

  • dao存放DAO接口(UserDao)

    • impl存放DAO接口实现类(UserDaolmpl)

  • service存放service接口(UserService)

    • impl存放service接口实现类(UserServicelmpl)

  • view存放程序启动类(main)

事务

要么都成功,要么都失败

ACID原则

  • 原子性:要么全部完成,要么都不完成

  • 一致性: 总数不变

  • 隔离性:多个进程互不干扰

  • 持久性:一旦提交不可逆,持久化到数据库了

隔离性的问题:

  • 脏读: 一个事务读取了另一个没有提交的事务

  • 不可重复读:在同一个事务内,重复读取表中的数据,表数据发生了改变

  • 虚读(幻读) :在一个事务内,读取到了别人插入的数据,导致前后读出来结果不- -致

测试银行事务

复制代码
 1  package com.xing.lesson04;
 2  3  import com.xing.lesson02.utils.JdbcUtils;
 4  5  import java.sql.Connection;
 6  import java.sql.PreparedStatement;
 7  import java.sql.ResultSet;
 8  import java.sql.SQLException;
 9 10  public class TestTransaction {
11      public static void main(String[] args) {
12          Connection conn = null;
13          PreparedStatement st = null;
14          ResultSet rs = null;
15 16          try {
17              conn = JdbcUtils.getConnection();
18              //关闭数据库的自动提交  自动开始事务
19              conn.setAutoCommit(false);
20 21              String sql1 = "update account set money = money-100 where name = 'A'";
22              st = conn.prepareStatement(sql1);
23              st.executeUpdate();
24 25              String sql2 = "update account set money = money+100 where name = 'B'";
26              st = conn.prepareStatement(sql2);
27              st.executeUpdate();
28 29              //业务完毕 提交事务
30              conn.commit();
31              System.out.println("成功");
32 33          } catch (SQLException e) {
34              //可以不写  失败默认回滚
35  //            try {
36  //                conn.rollback();//失败回滚  捕获catch异常
37  //            } catch (SQLException ex) {
38  //                ex.printStackTrace();
39  //            }
40              e.printStackTrace();
41          }finally {
42              JdbcUtils.release(conn,st,rs);
43          }
44      }
45  }
复制代码

1、开启事务conn. setAutoCommit(false);

2、一组业务执行完毕,提交事务

3、可以在catch 语句中显示的定义回滚语句,但默认失败就会回滚

posted @   暴躁C语言  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示