文章目录
Mybatis 的学习
0.0 idea关键坑补充
idea和eclipse中不同的是,idea使用的tomcat不会创建一个副本,而是直接采用了原先的tomcat,会采用原先的tomcat原型配置
idea修改css不起作用
右键清空缓存
本来以为是idea的问题,但是其实我已经开了热部署
而且jsp文件也可以正常修改
最后发现是浏览器的锅QAQ
0.1 JDBC连接数据库默认坑
我们需要了解JDBC的事务是自动提交的,什么是自动提交?
1)只执行任意一条DML(增删改)语句,则提交一次。JDBC默认的提交方式是自动提交,是JDBC默认的事务行为
2)在实际开发业务中,通常都是N条DML语句共同联合才能完成的,必须保证DML语句在一个事务中同时成功或者同时失败
1.1 什么是Mybatis
Mybatis其实是ssm中最后的m,其作用主要是简化了数据库的使用
官方解释: MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。
持久化:将数据持久化就是将数据存储在数据库中,换一种说法,就是将在内存中的数据转换为能够永久存储的数据,所以任何将数据永久存储的方式都是一种持久化
1.2 为什么需要MyBatis
- 简化了JDBC的操作
- 帮助程序员将数据存储到数据库中
- 不用也可以,只要会底层代码
- 因为使用的人多
1.3 MyBatis使用
思路:搭建环境----》导入MyBatis—》编写代码----》测试
1.3.1 搭建环境,导入MyBatis
idea中导入mybatis环境依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--注意此处一定要有连接数据库的jar包依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
在resource资源目录下创建mybatis-config.xml文件配置mybatis,每个标签的顺序不能轻易改变
<?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>
<properties resource="db.properties"/>
<!--配置日志-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--以下部分自己写-->
<property name="url" value="jdbc:mysql://localhost:3306/bdcstd?useUnicode=true&characterEncoding=utf-8&userSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123.com"/>
</dataSource>
</environment>
</environments>
<!--映射文件配置,非常重要-->
<mappers>
<mapper resource="com/hr/daos/UserMapper.xml" />
<!--resource属性里面要用斜杠-->
</mappers>
</configuration>
在pom.xml中添加如下代码,可以阻止资源过滤问题(MAVEN中默认将配置文件存放入src下的resource文件夹下,导出时默认导出resource文件夹下的xml文件,其他地方的xml文件不导出):
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
配置java资源路径下的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">//这个xml父接口所在的位置
//下面是相关的sql语句
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
1.3.2 编写代码
固定格式:
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream( resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build( inputStream);
//可以包装成工具类
package com.hr.utils;
import org.apache.ibatis.io.*;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static{
try {
// 如果在resource文件夹下可自动导入,无路径
String resource = "Mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 得到SqlSessionFactory对象,生产SqlSession对象,用来执行Sql语句
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
1.4 Mybatis 配置文件优化
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)不重要
- objectFactory(对象工厂)不重要
- plugins(插件)不重要
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
Mybatis默认的事务管理器就是JDBC,默认数据源管理方式(连接池):POOLED
1.4.1 属性优化(重要)
1.4.1.2 可以通过properties标签来配置属性
1.4.1.3 可以通过db.properties文件来配置属性
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/bdcstd?useUnicode=true&characterEncoding=utf-8&useSSL=true
username = root
password = 123.com
然后在Mybatis-config.xml文件中进行配置
<!--直接引入外部properties文件即可,顺序不可改变 -->
<properties resource="database.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--以下部分自己写-->
<property name="url" value="jdbc:mysql://localhost:3306/bdcstd?useUnicode=true&characterEncoding=utf-8&userSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123.com"/>
</dataSource>
</environment>
</environments>
1.4.2 别名优化(typeAliases)(重要)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
<!--第一种方式,直接给指定的实体类起一个别名,即可以在任何Mapper.xml文件中使用-->
<typeAliases>
<typeAlias type="com.hr.pojos.User" alias="User"/>
</typeAliases>
每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。
<!--第二种方式,直接指定实体类所在的包名,会自动到包下找相同的类名,即可以在任何Mapper.xml文件中使用-->
<typeAliases>
<package name="com.hr.pojos"/>
</typeAliases>
- 第一种方式可以自定义别名,第二种可以通过注解定义别名
@Alias("User01")
public class User implements Serializable {}
- 第一种适用于类的数量较少的情况,第二种适用于类较多的情况
常用别名:
别名 | 映射的类型 |
---|---|
_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 |
1.4.3 Setting 设置(重要)
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
设置名 | 描述 | 有效值 | 默认值 |
---|---|---|---|
cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 | true | false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 | true | false | false |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | 未设置 |
一个配置完整的 settings 元素的示例如下:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
Spring之后就用不到了
1.4 .4 mapper 映射器配置
使用相对于类路径的资源引用
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
使用完全限定资源定位符(URL)(已经完全淘汰)
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
使用映射器接口实现类的完全限定类名
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
注意点
- 接口和他的Mapper配置文件必须同名
- 接口和他的Mapper配置文件必须在同一个包下
将包内的映射器接口实现全部注册为映射器
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
注意点
- 接口和他的Mapper配置文件必须同名
- 接口和他的Mapper配置文件必须在同一个包下
1.4.5 其他配置
- typeHandlers(类处理器)
- objectFactory(对象工厂)
- plugins插件
- Mybatis-generator-core:自动生成mysql代码
- Mybatis-plus:能够跟深一步简化Mybatis
- 通用mapper
可以使用RowBounds进行分页开发
1.5 Mybatis注解开发
核心就是利用反射进行开发
步骤
1、只需要一个接口,不需要配套的xml文件,直接在接口上定义sql语句
package com.hr.mappers;
import com.hr.beans.Book;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface BookMapper {
@Select("select * from allbook")
public List<Book> selectAllBook();
}
2、需要在Mybatis-config中写明接口的位置
<mapper class="com.hr.mappers.BookMapper"></mapper>
3、进行测试
public void testBookMapper(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
BookMapper mapper = sqlSession.getMapper(BookMapper.class);
List<Book> books = mapper.selectAllBook();
for (Book book : books) {
System.out.println(book);
}
}
本质:反射机制
底层:动态代理
Mybatis解决数据库字段名和实体类属性名不一致的问题
Mybatis映射为javaBean的方式是根据数据库和bean中的属性字段一一对应然后通过反射进行赋值创建,所以要想成功映射,必须确保数据库中的字段名和bean中属性名相同,但是,有时也不得不进行一些配置也能完成成功的映射,下面的三种方式就是当数据库中的字段名和bean中属性名不同时进行的操作
方法一:使用别名的形式
<select id="findByTel" resultType="user">
select user_id as userId, age, sex ,address from tb_user where user_id=#{id}
</select>
方法二:使用resultMap映射实体类属性名和表的字段名一一对应关系
方法三:在核心配置文件中启用下划线与驼峰式命名规则的映射
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>