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)
-
-
-
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 语句中显示的定义回滚语句,但默认失败就会回滚
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端