项目开发时,遵循的一种设计模式,分为三层
各层之间的调用顺序是固定的,不允许跨层访问
图示
什么是框架
SSM框架
mybatis框架本是apache基金会的一个开源项目,原名:ibatis
2010年这个项目由apache software foundation迁移到了google code,并改名为mybatis
2013年11月迁移到github上
总体步骤:添加依赖 + 添加配置文件
新建数据库,数据表,插入测试数据
CREATE DATABASE ssm DEFAULT CHARSET utf8; use ssm; CREATE TABLE `student` ( `id` int(11) AUTO_INCREMENT primary key , `name` varchar(255) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into student(name,email,age) values('zhansan','zhangsan@126.com',22); insert into student(name,email,age) values('lisi','lisi@126.com',21); insert into student(name,email,age) values('wangwu','wangwu@163.com',22); insert into student(name,email,age) values('zhaoliu','zhaoliun@qq.com',24); select * from student;
新建maven项目,选择quickstart模板
调整目录结构
新增缺失的目录
删除自动生成的测试类
修改pom文件
<!-- 添加mybatis依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <!-- 添加mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency>
<build> <!-- 添加资源文件的指定--> <resources> <resource> <!-- 目标目录1 --> <directory>src/main/java</directory> <includes> <!-- 被包括的文件类型 --> <include>**/*.xml</include> <include>**/*.properties</include> </includes> <filtering>false</filtering> </resource> <resource> <!-- 目标目录2 --> <directory>src/main/resources</directory> <includes> <!-- 被包括的文件类型 --> <include>**/*.xml</include> <include>**/*.properties</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
idea中添加数据库的可视化
添加jdbc.properties属性文件(数据库连接文件:添加到/src/main/resources/目录下)
jdbc.driverClassName=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://ip:3306/数据库名称?useUnicode=true&characterEncoding=utf8 jdbc.username=XXXX jdbc.password=YYYY
添加SqlMapConfig.xml文件(mybatis的核心配置文件:添加到/src/main/resources/目录下)
<?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> <!-- 读取属性文件(jdbc.properties) resource:从resources目录下找指定名称的文件加载 url:使用绝对路径加载属性文件 --> <properties resource="jdbc.properties"/> <!-- 设置数据库的环境变量(数据库连接配置) --> <environments default="develop"> <!-- 开发时在公司使用的数据库配置 id:就是提供给environments的default属性使用 根据实际情况可以有多个environment配置 --> <environment id="develop"> <!-- 配置事务管理 type:指事务管理的方式 JDBC:事务的控制交给程序员处理 MANAGED:由容器(Spring)来管理事务 --> <transactionManager type="JDBC"/> <!-- 配置数据源 type:指定不同的的配置方式 JNDI:java命名目录接口,在服务器端进行数据库连接池的管理 POOLED:使用数据库连接池 UNPOOLED:不使用数据库连接池 --> <dataSource type="POOLED"> <!-- 配置数据库连接的基本属性,用到数据库连接配置文件(jdbc.properties) --> <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> <!-- 必须在mybatis核心配置文件中注册mapper.xml文件 resource:从resources目录下找指定名称的文件加载 url:使用绝对路径加载属性文件 class:动态代理方式下的注册 --> <mappers> <mapper resource="StudentMapper.xml"/> </mappers> </configuration>
创建实体类Student,用来封装数据
添加完成学生表的增删改查功能的StudentMapper.xml文件(添加到/src/main/resources/目录下),并在mybatis的核心配置文件中注册
<!-- 映射文件的头信息 --> <?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"> <!-- mapper:是整个文件的大标签,用来开始和结束标签 属性仅1个: namespace:指定命名空间(相当于包名),用来区分不同的mapper.xml文件中相同的id属性 --> <mapper namespace="wangxun"> <!-- 完成查询全部学生的功能 原先操作:List<Student> getAll(); 现在: 通过namespace和id指定要操作的sql语句 resultType:指定返回的查询结果集的类型,如果是集合,则必须是泛型 且必须用该类型所在的具体包名来定位该类型(为了后期利用反射生成该类型的数据对象) parameterType:如果有参数,则通过他来指定参数的类型 --> <select id="getAll" resultType="com.example.pojo.Student"> select id, name, email, age from student </select> </mapper>
创建测试类,进行功能测试
package com.example.test; import com.example.pojo.Student; 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; public class TestStudent { @Test public void testStudent() throws IOException { //使用文件流获取核心配置文件SqlMapConfig.xml InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); //创建SqlSessionFactory工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //取出sqlSession对象 SqlSession sqlSession = factory.openSession(); //完成查询操作 List<Student> list = sqlSession.selectList("wangxun.getAll"); list.forEach(System.out::println); //关闭sqlSession sqlSession.close(); } } /* 输出结果: Student{id=1, name='张三', email='zhangsan@126.com', age=22} Student{id=2, name='李四', email='lisi@126.com', age=21} Student{id=3, name='王五', email='wangwu@163.com', age=22} Student{id=4, name='赵六', email='zhaoliun@qq.com', age=24} Process finished with exit code 0 */