目录
2.5 经过compile之后没有出现mybatis的核心配置文件
2.7 使用mybatis的动态代理机制拿到可以操作数据库的对象
4.2 在mybatis.xml主配置文件中自定义别名输出结果
4.2.4 推荐使用全限定名称(全类名)作为resultType的值,不建议使用别名
4.3.3 结论验证:Map作为接口的返回值,sql语句的查询结果最多只能返回一行记录
4.5.1 方式一 java代码中给查询数据加上"%"(推荐)
4.5.2 方式二 在 mapper 文件 sql 语句的条件位置加上“%”
1.三层架构
在此之前,有学习过Web工程开发的三层架构模式MVC(model数据、view视图、controller控制器),MVC是一种软件架构设计思想,基于MVC架构将我们的应用软件进行分层设计和实现,例如可以分为视图层(View),控制层(Controller),模型层(Model),通过这样的分层设计让我们程序具备更好的灵活性和可可扩展性.因为这样可以将一个复杂应用程序进行简化,实现各司其职,各尽所能.比较适合一个大型应用的开发.
Spring MVC是MVC设计思想在Spring框架中的一种实现,基于这样的思想spring框架设计了一些相关对象,用于更好的基于MVC架构处理请求和响应。
1.1 三层架构
界面层: 和用户打交道的, 接收用户的请求参数, 显示处理结果的。(jsp ,html ,servlet)
业务逻辑层: 接收了界面层传递的数据,计算逻辑,调用数据库,获取数据
数据访问层: 就是访问数据库, 执行对数据的查询,修改,删除等等的。
1.2 以上的“三层”都有与之对应的“处理框架”
界面层---servlet---springmvc(框架,用来与用户进行页面交互)
业务逻辑层---service类--spring(框架,管理service类对业务逻辑进行处理)
数据访问层---dao类--mybatis(框架,代替jdbc访问数据库)
1.3 框架(Framework)
1.3.1 框架的概念
1.3.2 框架解决的问题
框架要解决的最重要的一个问题是技术整合,在 J2EE 的 框架中,有着各种各样的技术,不同的应用,系统使用不同的技术解决问题。需要从 J2EE 中选择不同的技术,而技术自身的复杂性,有导致更大的风险。企业在开发软件项目时,主要目的是解决业务问题。 即要求企业负责技术本身,又要求解决业务问题。这是大多数企业不能完成的。框架把相关的技术融合在一起,企业开发可以集中在业务领域方面。
另一个方面可以提供开发的效率。
1.4 JDBC 编程
1.4.1 使用 JDBC 编程的回顾
public void findStudent() {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
//注册 mysql 驱动
Class.forName("com.mysql.jdbc.Driver");
//连接数据的基本信息 url ,username,password
String url = "jdbc:mysql://localhost:3306/springdb";
String username = "root";
String password = "123456";
//创建连接对象
conn = DriverManager.getConnection(url, username, password);
//保存查询结果
List<Student> stuList = new ArrayList<>();
//创建 Statement, 用来执行 sql 语句
stmt = conn.createStatement();
//执行查询,创建记录集,
rs = stmt.executeQuery("select * from student");
while (rs.next()) {
Student stu = new Student();
stu.setId(rs.getInt("id"));
stu.setName(rs.getString("name"));
stu.setAge(rs.getInt("age"));
//从数据库取出数据转为 Student 对象,封装到 List 集合
stuList.add(stu);
}北京动力节点 www.bjpowernode.com
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
//关闭资源
if (rs != null) ;
{
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.4.2 使用 JDBC 的缺陷
1. 代码比较多,开发效率低
2. 需要关注 Connection ,Statement, ResultSet 对象创建和销毁
3. 对 ResultSet 查询的结果,需要自己封装为 List
4. 重复的代码比较多些
5. 业务代码和数据库的操作混在一起
1.5 MyBatis 框架概述
1.5.1 MyBatis 解决的主要问题
2. MyBatis 框架快速入门
2.1 使用 Mybatis 准备
下载 mybatis
https://github.com/mybatis/mybatis-3/releases
2.2 编写开发思路
2.3 搭建 MyBatis 开发环境
(4) 加入 maven 坐标
<dependencies>
<dependency>
<groupId>junit</groupId>北京动力节点 www.bjpowernode.com
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>
(5)加入 maven 插件
<build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>北京动力节点 www.bjpowernode.com
</build>
(6)编写 entity实体类
(7) 编写 Dao 接口 StudentDao
(8) 编写 Dao 接口 Mapper 映射文件 StudentDao.xml
要求:
1. 在 dao 包中创建文件 StudentDao.xml
2. 要 StudentDao.xml 文件名称和接口 StudentDao 一样,区分大小写的一样。
映射文件的格式可以去mybatis的官网查看使用手册中xml文件配置:
<?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 namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
<?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:必须有值,自定义的唯一字符串
推荐使用:dao 接口的全限定名称
-->
<mapper namespace="com.bjpowernode.dao.StudentDao">
<!--
<select>: 查询数据, 标签中必须是 select 语句
id: sql 语句的自定义名称,推荐使用 dao 接口中方法名称,
使用名称表示要执行的 sql 语句
resultType: 查询语句的返回结果数据类型,使用全限定类名
-->
<select id="selectStudents" resultType="com.bjpowernode.domain.Student">
<!--要执行的 sql 语句-->
select id,name,email,age from student
</select>
</mapper>
(9) 创建 MyBatis 主配置文件(mybatis.xml)(用于连接数据库及控制事务的相关配置)放到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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
项目 src/main 下创建 resources 目录,设置 resources 目录为 resources root
创建主配置文件:名称为 mybatis.xml
说明:主配置文件名称是自定义的,内容如下:
<?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>
<!--配置 mybatis 环境-->
<!--这里的default值必须和某个environment的id值一样。
告诉mybatis使用哪个数据库的连接信息。也就是访问哪个数据库
-->
<environments default="mysql">
<!--id:数据源的名称,自定义的一个唯一的值
一个environment标签对应着一个数据库环境,可以有多个environment标签和id 对应着不同数据库环
境配置
-->
<environment id="mysql">
<!--配置事务类型:使用 JDBC 事务(使用 Connection 的提交和回滚)-->
<transactionManager type="JDBC"/>
<!--数据源 dataSource:创建数据库 Connection 对象
type: POOLED 使用数据库的连接池
-->
<dataSource type="POOLED">
<!--连接数据库的四个要素-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--sql mapper(SQL映射文件)的位置-->
<mappers>
<!--一个mapper标签指定一个sql映射文件的位置。
告诉 mybatis 要执行的 sql 语句的位置
从类路径开始的路径信息:target/classes下开始(类路径)
-->
<mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
</mappers>
</configuration>
支持中文的 url
jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf-8
(10) 创建测试类 MyBatisTest
src/test/java/com/bjpowernode/ 创建 MyBatisTest.java 文件
/*
* mybatis 入门
*/
@Test
public void testStart() throws IOException {
//1.mybatis 主配置文件
String config = "mybatis-config.xml";
//2.读取配置文件
InputStream in = Resources.getResourceAsStream(config);
//3.创建 SqlSessionFactory 对象,目的是获取 SqlSession
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//4.获取 SqlSession,SqlSession 能执行 sql 语句
SqlSession session = factory.openSession();
//5.执行 SqlSession 的 selectList()
List<Student> studentList = 北京动力节点 www.bjpowernode.com
session.selectList("com.bjpowernode.dao.StudentDao.selectStudents");
//6.循环输出查询结果
studentList.forEach( student -> System.out.println(student));
//7.关闭 SqlSession,释放资源
session.close();
}
(11) 配置日志功能
mybatis.xml 文件加入日志配置,可以在控制台输出执行的 sql 语句和参数
控制mybatis全局行为
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
2.4 mybatis小结
2.5 经过compile之后没有出现mybatis的核心配置文件
核心配置文件:
一个是定义数据库及数据源的mybatis.xml,另一个是执行sql语句的方法及对应sql语句的Dao.xml
处理方式:
(1)一般都可以搞定
(2)基本能解决大多数问题
(3)清除并重启
(4)终极大招:手动将需要的这两个文件手动"CV"到对应的目录位置......
2.6.总结
2.6.1 快捷键:找接口实现类
2.6.2 mybatis执行过程中一些主要类的介绍
主要类的介绍
1) Resources: mybatis中的一个类, 负责读取主配置文件 InputStream in = Resources.getResourceAsStream("mybatis.xml");
2)SqlSessionFactoryBuilder : 创建SqlSessionFactory对象,
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
3)SqlSessionFactory : 重量级对象, 程序创建一个对象耗时比较长,使用资源比较多。 在整个项目中,有一个就够用了。
SqlSessionFactory:接口 , 接口实现类: DefaultSqlSessionFactory
SqlSessionFactory作用: 获取SqlSession对象。SqlSession sqlSession = factory.openSession();
openSession()方法说明:
1. openSession() :无参数的, 获取是非自动提交事务的SqlSession对象
2. openSession(boolean): openSession(true) 获取自动提交事务的SqlSession.
openSession(false) 非自动提交事务的SqlSession对象
4)SqlSession: SqlSession接口 :定义了操作数据的方法 例如 selectOne() ,selectList() ,insert(),update(), delete(), commit(), rollback() SqlSession接口的实现类DefaultSqlSession。
使用要求: SqlSession对象不是线程安全的,需要在方法内部使用, 在执行sql语句之前,使用openSession()获取SqlSession对象。
在执行完sql语句后,需要关闭它,执行SqlSession.close(). 这样能保证他的使用是线程安全的。
2.7 使用mybatis的动态代理机制拿到可以操作数据库的对象
3.参数传递的改造
3.1 参数传递的作用
3.1.1参数这个属性可以省略
3.1.2 用例改造输出控制台
3.2 一个简单参数
Dao 接口中方法的参数只有一个简单类型(java 基本类型和 String),占位符 #{ 任意字符 },和方
法的参数名无关。
mybatis内部创建了Connection、Preparestatement、ResultSet对象,利用#{}占位符和Preparestatement<==>规避了sql注入攻击风险
3.3 多个参数-使用@Param
3.3.1 语法
3.3.2 举例
3.4 多个参数-使用对象
3.4.1 语法
3.4.2 举例
3.5 多个参数-按位置
3.6 多个参数-使用 Map
3.6.1 定义
3.6.2 测试
3.7 #和$的区别
3.7.1 #占位符
3.7.2 $ 相当于字符串的拼接![](https://img-blog.csdnimg.cn/20210711141336630.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUyMDk1NDM4,size_16,color_FFFFFF,t_70)
3.7.3 $符替换表名或者 列名的举例
3.7.4 总结
3.8 mybatis动态代理的定义、使用方式及使用前提
3.9 传参方式总结及 “#{}”与“${}”符的区别
4.封装 MyBatis 输出结果
4.1 resultType
4.1.1 简单类型
4.1.2 对象类型
4.2 在mybatis.xml主配置文件中自定义别名输出结果
4.2.1 定义别名方式一
4.2.2 定义别名方式二
此时,包中的类名就是可以当作别名赋值给
4.2.3
注:在mybatis的主配置文件中可以使用以上两种方式定义别名,然后在mapper配置文件中用别名
4.2.4 推荐使用全限定名称(全类名)作为resultType的值,不建议使用别名
当包名不同,类名重复时就会导致别名重复,导致程序认为你的别名命名重复,会报错
4.3 返回Map
4.3.1 定义
4.3.2 举例
4.3.3 结论验证:Map作为接口的返回值,sql语句的查询结果最多只能返回一行记录
4.4 resultMap
4.4.1 定义与使用场景
补充解释说明:
4.4.2 用法
4.4.3 列名和属性名不一致案例
定义一个类并提供相关属性
定义一个方法Dao接口方法
在mapper配置中定义sql映射
定义测试类
测试结果:
4.4.4 两种处理方式
方式一:
下面标红的部分需要与对应实体类中的属性字段保持一致,因为前端传递过来的值是通过user对象进行接收,如果与user对象的属性名不一致,就无法实现自动注入。
方式二:
4.5 模糊查询 like
模糊查询的实现有两种方式, 一是 java 代码中给查询数据加上“%” ; 二是在 mapper 文件 sql 语句的条件位置加上“%”
4.5.1 方式一 java代码中给查询数据加上"%"(推荐)
4.5.2 方式二 在 mapper 文件 sql 语句的条件位置加上“%”
4.6 思维导图小结
5.MyBatis 框架动态 SQL
5.1 环境准备
5.2 动态 SQL 之<if>
5.2.1 举例
动态sql,在写接口方法时,传入的参数必须使用Java对象作为参数
5.3 动态 SQL 之<where>
5.3.1 举例
条件都不存在的情况下:
5.4 动态 SQL 之<foreach>
<foreach> 循环java中的数组,list集合的。 主要用在sql的in语句中。
5.4.1 遍历 List<简单类型>
5.4.2 遍历 List<对象类型>
5.5 动态 SQL 之代码片段
5.5.1举例
5.6 动态sql思维导图总结
6.MyBatis 配置文件
6.1 主配置文件
6.1.1 <settings> 控制mybatis全局行为
<!-- settings是 MyBatis 中全局的调整设置,它们会改变 MyBatis 的运行时行为,应谨慎设置 -->
<settings>
<!-- 该配置影响的所有映射器中配置的缓存的全局开关。默认值true -->
<setting name="cacheEnabled" value="true"/>
<!--延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。默认值false -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 是否允许单一语句返回多结果集(需要兼容驱动)。 默认值true -->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- 使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。默认值true -->
<setting name="useColumnLabel" value="true"/>
<!-- 允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 默认值false -->
<setting name="useGeneratedKeys" value="false"/>
<!-- 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。 -->
<!-- 默认值PARTIAL -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<!-- 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。默认SIMPLE -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 设置超时时间,它决定驱动等待数据库响应的秒数。 -->
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<!-- 允许在嵌套语句中使用分页(RowBounds)默认值False -->
<setting name="safeRowBoundsEnabled" value="false"/>
<!-- 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 默认false -->
<setting name="mapUnderscoreToCamelCase" value="false"/>
<!-- MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。
默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。
若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。 -->
<setting name="localCacheScope" value="SESSION"/>
<!-- 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 -->
<setting name="jdbcTypeForNull" value="OTHER"/>
<!-- 指定哪个对象的方法触发一次延迟加载。 -->
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
6.1.2 <typeAliases> <package> 这两种方式配置定义别名
6.1.3 <environments> 配置环境信息,主要用来连接数据库的
6.1.4 <transactionManager> 提交事务、回滚事务的方式
6.1.5 <dataSource> 数据源
6.1.6 数据库的属性 配置文件
6.1.7 <mappers> 配置sql映射文件的位置
一个<mapper>子标签对应一个sql mapper映射文件,一一对应的关系,这种方式适用于小型项目
6.1.8 本章节重点,是实际项目开发要经常用到的知识点
7.扩展PageHelper(分页插件)
此分页插件并不是mybatis自带的,而是国内的一个大牛为了方便分页写的一个组件!
插件官网地址:
https://github.com/pagehelper/Mybatis-PageHelper
7.1 Mybatis 通用分页插件
7.2 基于 PageHelper 分页:
第一步:maven 坐标
即 在项目的pom.xml文件里面加上该依赖的jar包
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
第二步:加入 plugin 配置
在mybatis主配置文件中的<environments>标签之前加入 下面的分页插件配置<plugins>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor" />
</plugins>
第三步:PageHelper 对象
7.3 应用举例