熬过无人问津的日子才会有诗和远方。
什么是框架?
三层架构和SSM框架的关系
三层架构:数据访问层、业务逻辑层和表示层(web层),区分层次的目的即为了高内聚低耦合的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。
MVC:模型(model)、视图(view)、控制器(controller。
SSM:Spring Framework、Spring MVC、MyBatis(扩展MyBatis-Plus)。
SSH:Spring、Struts、Hibernate(扩展JPA)。
JavaSE => JDBC => Servlet+JSP => SSM =>SpringBoot(分布式) => SpringCould(微服务)
MyBatis缺点
软件设计:(open-close开闭原则)尽量不修改源代码,对程序进行扩展。
如何使用MyBatis?
1、使用 MyBatis, 只需将 mybatis-x.x.x.jar
文件置于类路径(classpath)中即可。
2、如果使用 Maven 来构建项目,则需将下面的依赖引入 pom.xml 文件中:
org.mybatis mybatis x.x.x
通过本节可以初步了解MyBatis的使用以及logback的配置
1、创建一个普通的Maven项目
2、引入依赖坐标
org.mybatis mybatis 3.5.5
mysql mysql-connector-java 5.1.46
junit junit 4.12 test
org.slf4j slf4j-api 1.7.20
ch.qos.logback logback-classic 1.2.3
ch.qos.logback logback-core 1.2.3
3、导入SQL脚本
-- 创建数据库
drop database if exists `mybatis`;
create database `mybatis` character set = utf8;use mybatis;-- 创建数据表
create table `user`(`id` int auto_increment primary key comment '编号',`name` varchar(20) unique comment '姓名', -- 唯一约束`pwd` varchar(20) comment '密码',`gender` char(1) comment '性别',`addr` varchar(30) comment '家庭住址'
)engine=innodb default charset=utf8;-- 插入数据
insert into user(name,pwd,gender,addr) values
("张三","123456",'男',"北京"),
("李四","123456",'女',"南京"),
("王五","777777",'男',"杭州"),
("赵六","123456",'女',"温州"),
("陈七","666666",'男',"黑河");
4、编写实体类
package com.baidou.pojo;/*** 用户实体类** @author 白豆五* @version 2022/11/30 11:07* @since JDK8*/
public class User {private Integer id; // 编号private String name; // 姓名private String pwd; // 密码private char gender; // 性别private String addr; // 家庭住址// 满参构造方法public User(Integer id, String name, String pwd, char gender, String addr) {this.id = id;this.name = name;this.pwd = pwd;this.gender = gender;this.addr = addr;}// 无参构造方法public User() {}// set/get方法public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr = addr;}// 重写Object类的toString方法,返回对象里的内容// Object类的toString方法返回的是对象的地址值,即: "类的全限定名@十六进制的哈希码"@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", pwd='" + pwd + '\'' +", gender=" + gender +", addr='" + addr + '\'' +'}';}
}
5、编写mapper接口
package com.baidou.mapper;import com.baidou.pojo.User;import java.util.List;/*** 基于MyBatis实现用户接口* mapper、dao都是对数据库进行持久化操作的(crud)*/
public interface UserMapper {// 查询所有用户List selectAll();
}
6、编写UserMapper.xml(SQL映射文件)
参考MyBatis官网的入门案例:https://mybatis.org/mybatis-3/zh/getting-started.html
7、编写MyBatis核心配置文件
参考MyBatis官网的入门案例:https://mybatis.org/mybatis-3/zh/getting-started.html
8、编写logback.xml日志配置文件
[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg%n
9、编写测试
import com.baidou.mapper.UserMapper;
import com.baidou.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;/*** mybatis快速入门* @author 白豆五* @version 2022/11/30 12:55* @since JDK8*/
public class MyTest {/*** 方式一: 使用qlSession.selectList()查询所有用户(旧版mybatis的API,不推荐使用)* @throws IOException*/@Testpublic void test1() throws IOException {// 1、加载mybatis核心配置文件,获取SqlSessionFactory对象String resource = "mybatis-config.xml";InputStream is = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);// 2、获取对应的SqlSession对象,用来执行sql语句SqlSession sqlSession = sqlSessionFactory.openSession();// 3、执行sql语句, selectList()方法的参数是一个字符串,该字符串必须是映射配置文件的 namespace.idList list = sqlSession.selectList("com.baidou.mapper.UserMapper.selectAll");// 输出结果for (User user :list) {System.out.println(user);}// 4、释放资源sqlSession.close();}/*** 使用Mapper代理开发,查询所有用户* @throws IOException*/@Testpublic void test2() throws IOException {// 1、加载Mybatis核心配置文件,获取SqlSessionFactory对象InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2、获取对应的SqlSession对象,用来执行sql语句SqlSession sqlSession = sqlSessionFactory.openSession();// 3、获取mapper,来调用mapper中的方法UserMapper mapper = sqlSession.getMapper(UserMapper.class);List users = mapper.selectAll();users.forEach(System.out::println);// 4、关闭SqlSessionsqlSession.close();}
}
test1()方法执行结果:
test2()方法执行结果:
sqlSession.selectList()
需要传入映射文件的名称空间和查询语句的id(即 "namespace.id"
),然后它每次返回的类型都是Object,会存在类型转换问题,导致不太安全。sqlSession.getMapper()
,更灵活的使用方法,不依赖上述的字符串字面值而且安全,只需传参UserMapper.class
,返回的是mapper
接口的代理对象,然后通过mapper调用对应方法完成sql的执行。官网解释:
MyBatis核心配置文件:mybatis-config.xml
MyBatis映射配置文件:XxxMapper.xml
后期在使用MyBatis框架做数据库操作(持久化操作)会经常使用这两个配置文件。
当然我们也可以在这个XML的dtd约束文件中查看相应的配置:
核心配置文件(mybatis-config.xml)的层级结构如下:
注:配置每个标签时,需要遵守前后顺序!
configuration表示核心配置文件的根标签。
1、编写db.properties配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8
username=root
password=123456
2、在mybatis-config.xml中引用db.properties
在公司做项目的时候,如果开发阶段连接开发环境的数据库,那么数据库的配置要管运维或者DBA的同事要。
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写;
使用场景:1、给实体类起别名(跟map挺像,K-V键值对)
使用场景:2、扫描实体类的包,它的的默认别名为类名,首字母小写
在实体类比较少的时候使用第一种方式,如果实体类比较多建议使用第二种方式!
区别:第一种可以自定义别名,第二种它就不行(如果非要改 需要在实体类上增加@Alias注解)。
下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
在MyBatis全局配置文件中通过
标签控制MyBatis全局开关。
MyBatis的设置:https://mybatis.org/mybatis-3/zh/configuration.html#settings
示例:在mybatis-config.xml配置日志输出
mappers(映射器)的作用是告诉 MyBatis 到哪里去找映射文件;
使用场景:1. 使用相对于类路径的资源引用(推荐使用)
使用场景:2. 使用映射器接口实现类绑定注册
使用场景:3. 使用包扫描进行注入绑定
注:接口和它的配置文件必须同名,接口和它的映射文件必须在同级包下(SQL映射文件可以放在src目录中,也可以放在resources目录中 );
MyBatis 真正强大之处在于它的语句映射,这是它的魔力所在。由于它的功能强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于写SQL代码😥。
SQL 映射配置文件标签结构如下:
mapper
– 作为映射配置文件的根标签,namespace属性值就是绑定mapper接口的全限定名(包名.接口名)。 cache
– 该命名空间的缓存配置。cache-ref
– 引用其它命名空间的缓存配置。resultMap
– 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。parameterMap
– 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。sql
– 可被其它语句引用的可重用语句块。select
– 映射查询语句,resultType – SQL语句执行的返回值;parameterType – 参数类型;insert
– 映射插入语句。update
– 映射更新语句。delete
– 映射删除语句。在mapper接口中定义方法,方法名就是该SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致;