9-28 三层架构 和 Mybatis框架
一、架构
架构是对大型软件系统最高级别的设计
特点:
架构是从整体到部分的最高层次的划分
架构一旦选定就难以更改
二、模式
模式是在软件实践活动中总结的有效、通用且能解决重复出现问题的解决方案。
每个模式描述了一个在某种场景下不断重复发生的问题,以及该问题解决方案的核心。
模式的关键点是源于软件实践
架构模式
架构模式(也叫架构风格)是通用的、可重用的解决方案,用于在给定的上下文的软件体系中经常出现的问题。
三、分层设计思想
分层的特点:
1.上层使用下层定义的服务;
2.下层不能使用上层定义的服务;
3.每一层对自己的上层隐藏其下层的实现细节
优点:
1.降低软件系统构件之间的耦合度,实现“低耦合,高内聚”原则
2.提升系统灵活性,可以在接口相同的情况下替换某层具体实现
3.可以增强复用度,下层可以为多个上层服务
缺点
过多的分层会影响系统性能
分层可能会带来级联修改
四、三层架构模式
表现层(UI): 直接和前端打交道(一是 接受前端ajax请求,二是返回json数据给前端)
业务逻辑层(BLL):一是 处理表现层转发过来的前端请求(也就是具体业务),二是将数据从访问层或持久层返回到表现层。
数据层访问层(DAL): 直接操作数据库(针对数据继续增添、删除、修改、查找),并将获得的数据返回给上一层(也就是业务逻辑层)。
五、jdbc流程
1.加载数据库驱动
2.获取数据库的连接
3.编写sql语句
4.执行查询
5.设计传参
6.结果集处理
7.关闭数据库连接
win键+r services.msc 打开电脑服务,查看mysql服务是否开启
jdbc的缺点
结果集的数据类型需要手动判断、列名需要手动填写
获取的字段值需要逐个手动设置到实体类中
六、Mybatis框架
MyBatis是一个三层架构中的持久层框架,它提供一种半自动的ORM实现,能够简化JDBC操作流程,帮助提升程序员的开发效率。MyBatis本质是基于JDBC进行简单的映射封装,所以运行效率(性能)低于JDBC。
ORM(Object/Relation Mapping,对象/关系数据库映射)是一种描述对象与关系数据库之间映射的规范。
ORM作用是为对象和关系数据库之间搭接桥梁,以解决对象与关系数据库之间不协调的问题。
ORM映射规则:
1.类与表相对应(基本规则)
2.类的属性(或成员变量)与表的字段相对应(基本规则)
3.类的实例与表中具体的一条记录相对应(基本规则)
4.一个类可以对应多个表,一个表可以对应多个类;
5.数据库中表可以没有主键,但类中必须有主键;
6.数据库中表与表之间的关系对应类与类之间的关系;
7.数据库中表的字段个数和名称可以和类的属性个数、名称不一样;
七、Mybatis举例
1.导入MyBatis架构包
创建初始数据库表单供查询
2.创建UserEntity类(以保存对象)
/* * * <一句话功能简述> * <用户实体类> * @Author on 2020/9/28 0028 下午 2:12 * @Param * @return **/ public class UserEntity { private int id; private String name; private String password; private int age; private int sex; private String email; public UserEntity() { } public UserEntity(int id, String name, String password, int age, int sex, String email) { this.id = id; this.name = name; this.password = password; this.age = age; this.sex = sex; this.email = email; } 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 String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "UserEntity{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + ", age=" + age + ", sex=" + sex + ", email='" + email + '\'' + '}'; } }
3.创建全局变量(配置数据库信息)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 数据库配置 --> <environments default="development"> <environment id="development"> <!-- 事务管理器,JDBC类型的事务管理器 --> <transactionManager type="JDBC" /> <!-- 数据源,池类型的数据源 --> <dataSource type="POOLED"> <!--设置数据库驱动 --> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <!--设置数据库url地址--> <property name="url" value="jdbc:mysql://localhost:3306/mybatisdb?serverTimezone=GMT"/> <!--设置数据库用户名--> <property name="username" value="root"/> <!--设置数据库密码--> <property name="password" value="root"/> </dataSource> </environment> </environments> <!--配置映射文件路径--> <mappers> <mapper resource="dao/IUserDao.xml"/> </mappers> </configuration>
4.创建接口(定义访问数据库的方法)
import entity.UserEntity; import org.apache.ibatis.annotations.Param; import java.util.List; /* * * <dao层接口> * <定义访问数据库的方法> * @Author Administrator on 2020/9/28 0028 下午 4:33 * @Param * @return **/ public interface IUserDao { // 查询用户 public List<UserEntity> selectUSerByAge(int age); // 添加 public int insertUser(UserEntity user); // 修改(注解@Param用于定义参数名) public int updateUser(@Param("name") String name,@Param("id") int id); // 删除 public int deleteUser(int id); }
5.配置映射文件(定义映射方式)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--namespace表示命名空间,填写Mapper映射器接口全路径--> <mapper namespace="dao.IUserDao"> <!-- 结果集进行映射为实体类(type是实体类路径)--> <resultMap id="userResultMap" type="entity.UserEntity"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="password" column="password"/><!-- 对象的属性名于数据库的列名对应 --> <result property="age" column="age"/> <result property="sex" column="sex"/> <result property="email" column="email"/> </resultMap> <!-- 查询语句(id 为接口方法名,resultMap设置结果集映射)--> <select id="selectUSerByAge" resultMap="userResultMap"> select * from tb_user where age > #{age} </select> <!-- insert 插入--> <insert id="insertUser"> insert into tb_user (id,name,password,age,sex,email) values (#{id},#{name} ,#{password},#{age},#{sex},#{email}) </insert> <!-- Update 修改--> <update id="updateUser"> update tb_user set name = #{name} where id =#{id} </update> <!-- delete 删除--> <delete id="deleteUser"> delete from tb_user where id=#{id} </delete> </mapper>
6.进行Mybatis测试
import dao.IUserDao; import entity.UserEntity; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionException; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; import java.util.List; /* * * <一句话功能简述> * <测试类> * @Author Administrator on 2020/9/28 0028 下午 4:18 * @Param * @return **/ public class MyBatisTest { public static void main(String[] args) throws IOException { //设置指定框架MyBatis全局配置文件 String resource = "mybatis-config.xml"; //加载全局配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建SqlSessionFactory实例 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取一个数据库连接sqlsession(相对于 jdbc connection 连接对象) SqlSession sqlSession = sqlSessionFactory.openSession(); //获取Dao接口实例 IUserDao userDao = sqlSession.getMapper(IUserDao.class); //执行查询方法 List<UserEntity> userEntities = userDao.selectUSerByAge(20); System.out.println(userEntities); //执行插入方法 UserEntity userEntity = new UserEntity(3, "小李", "5522", 23, 1, "551@qq.com"); int result = userDao.insertUser(userEntity); sqlSession.commit();//提交事务,修改数据库的时候 System.out.println(result); // 修改 int res = userDao.updateUser("大华",3); sqlSession.commit(); System.out.println(res); // 执行删除 int de = userDao.deleteUser(3); System.out.println(de); } }