一、什么是三层架构
三层架构是一种开发模式,拒户所有的公司都在使用三层架构的模式进行开发。
1)界面层:用来与客户进行数据交互,调用业务逻辑层完成业务功能,返回结果给客户端,它是一个总调度。
2)业务逻辑层:真正来事先业务功能,向上为界面提供处理结果,向下文数据访问层要数据。
3)数据访问层:主要用来与数据库进行数据交互,完成各种增删改查的功能。
三层之间的调用顺序:
界面层<--->业务逻辑层<--->数据访问层
二、三层架构的优点
1)结构清晰、耦合度低,各层分工明确
2)可维护性,可扩展性高
3)有利于标准化
4)开发人员可以只关注整个结构中的其中某一层的功能实现
5)有力量与各层逻辑的复用
三、什么是框架
它是一个软件的半成品,更有利于功能的扩展和复用。
框架是可被应用开发者定制的应用骨架、模板。
四、什么是SSM框架
1)Spring框架:它是一个容器,它是整合其他框架的框架,它的核心是IOC和AOP。它由20多个模块,在很多领域都有非常优秀的支持。
2)SpringMVC框架:它是Spring框架的一个子框架,专门为了优化控制器(Servlet)而存在的框架。它提供了简捷的数据注入,类型转换,页面跳转,数据携带等方面的优化。
3)Mybatis框架:它是专门优化JDBC访问的框架,它专注于SQL语句。它不用创建各种JDBC访问的对象。
五、什么是MyBatis框架
MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了 google code,并且改名为Mybatis。
让开发者专注于SQL的处理。
减轻使用JDBC的复杂性,不用编写重复的创建 Connection,Statement;不用编写关闭资源代码。
MyBatis 是一个优秀的基于java 的持久层框架,内部封装了jdbc,开发者只需要关注sql语句本身。
MyBatis 通过xml或注解两种方式将要执行的各种sql语句。
六、使用MyBatis框架
所有框架的使用都是: 1.添加依赖 2.添加配置文件
MyBatis框架使用步骤:
1)新建项目empty Project
2)新建模块,选择quickstart模板
3)添加可视化,建库SSM建表
4)修改目录
5)修改pom.xml文件,添加MyBatis依赖,添加mysql驱动依赖
6)添加jdbc.properties属性文件,它规定了数据库连接的基本信息
7)添加SqlMapConfig.xml核心配置文件
"https://mybatis.org/dtd/mybatis-3-config.dtd":头文档约束文件,规定可以出现哪些标签,以及子标签,以及标签中可以有哪些属性。
8)添加实体类
9)添加 表名Mapper.xml 文件,完成增删改查的所有功能
10)在SqlMapConfig.xml文件中注册 表名Mapper.xml 文件
11)添加测试类进行功能测试
七、测试类的优化
SqlSession sqlSession;
@Before //在所有的Test语句执行前执行的代码,自动执行
@After //在所有的Test语句执行完执行的代码,自动执行
八、为实体类注册别名
在SqlMapConfig.xml配置文件中,可以注册一个简单的名称访问实体类。
<typeAliases>
<!--
单个实体类别名注册
参数:
type:要注册的实体类的类型
alias:起的别名,一定要规范
-->
<!--<typeAlias type="icu.sandink.pojo.Question" alias="question"/>-->
<!--批量注册别名,注册的别名是类名的驼峰命名法-->
<package name="icu.sandink.pojo"/>
<package name="icu.sandink.mapper"/>
</typeAliases>
九、设置日志输出
设置日志输出,查看底层的sql语句实现,在SqlMapConfig.xml文件中设置
<!--设置日志输出-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
在resources内新建SqlMapConfig.xml文件
配置文件属性
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"/>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<package name="icu.sandink.pojo"/>
<package name="icu.sandink.mapper"/>
</typeAliases>
<environments default="developmentProperties">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.137.116:3306/zm"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</dataSource>
</environment>
<environment id="developmentProperties">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="MapperXML/QuestionMapper.xml"/>
<mapper resource="MapperXML/IQuestionMapper.xml"/>
</mappers>
</configuration>
十、动态代理
定义QuestionMapper接口
public interface QuestionMapper {
List<Question> findAll();
Question findById(Integer id);
List<Question> findByAnyTitle(String anyTitle);
int add(Question question);
int modify(Question question);
int removeById(Integer id);
}
创建QuestionMapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="icu.sandink.mapper.QuestionMapper">
<select id="findAll" resultType="icu.sandink.pojo.Question">
select id, title, optionA, optionB, optionC, optionD, answer from question;
</select>
<select id="findById" parameterType="int" resultType="question">
select id, title, optionA, optionB, optionC, optionD, answer
from question
where id = #{id};
</select>
<select id="findByAnyTitle" resultType="question">
select id, title, optionA, optionB, optionC, optionD, answer
from question
where title like concat('%', #{anyTitle}, '%');
</select>
<insert id="add" parameterType="question">
insert into question
values (#{id}, #{title}, #{optionA}, #{optionB}, #{optionC}, #{optionD}, #{answer});
</insert>
<update id="modify" parameterType="question">
update question
set title = #{title}
, optionA = #{optionA}
, optionB = #{optionB}
, optionC = #{optionC}
, optionD = #{optionD}
, answer = #{answer}
where id = #{id};
</update>
<delete id="removeById">
delete from question where id = #{id};
</delete>
</mapper>
在SqlMapConfig.xml文件中注册
<mappers>
<mapper resource="MapperXML/QuestionMapper.xml"/>
</mappers>
定义测试类
public class QuestionXmlTest {
SqlSession session;
QuestionMapper mapper;
@Before
public void open() {
session = BATIS.getSqlSession();
mapper = session.getMapper(QuestionMapper.class);
}
@After
public void close() {
BATIS.close();
}
@Test
public void testAdd() {
int add = mapper.add(new Question(
null
, "《龙门饭店》以下角色中谁是反派?"
, "名角"
, "警长"
, "饭店大堂经理"
, "教授"
, "D"
));
session.commit();
System.out.println(add);
}
@Test
public void testModify() {
int modify = mapper.modify(new Question(
22
, "剧本杀《龙门饭店》第一个死亡的角色是"
, "土豪"
, "跑单帮"
, "教授"
, "作家"
, "C"
));
System.out.println(modify);
}
@Test
public void testFindByAnyTitle() {
mapper.findByAnyTitle("").forEach(System.out::println);
}
}