这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天
1.mybatis简介
- 支持定制Sql,存储过程以继高级映射的优秀持久层框架
- 避免了几乎所有的jdbc代码和手动设置参数以及获取结果集
- 使用xml和注解用于配置和映射,将接口和javaPOJO进行映射记录
1.1为什么使用Mybatis
- sql和java编码分开,功能边界清晰,一个专注于业务,一个专注于数据
- mybatis是一个半自动化的持久层框架
- JDBC耦合度过高
- Hibernate和JPA导致性能降低
自动化就是不用自己写SQL,
hibernate通过对象直接映射为sql语句,实现了全自动化,这样导致很耗费性能
2.Mybatis之HelloWorld
2.1操作数据库
- 创建Mybatis全局配置文件 "mybatis-config.xml"
后面会讲解一下这个配置文件
- 创建Sql映射文件 "xxxMapper.xml"
这里记录的式Sql执行规则
- 利用SqlSessionFactoryBuilder创建一个SqlSessionFactory
- 利用SqlSessionFactory获取sqlSession对象
- 通过SqlSession根据方法id进行操作
@Test
public void testSelectStudentById() throws IOException {
// 读取配置文件,resources下的xml文件,最终会被放在类路径下
String resource = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建一个sqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlSession对象
SqlSession sqlSession = factory.openSession();
// 指定要执行sql语句的id
// sql语句的id=namespace+"."+select|等标签的id;
String sqlId="java1.dao.StudentDao.selectStudentById";
// 通过sqlSession执行sql语句
Student student= sqlSession.selectOne(sqlId,1002);
System.out.println(student);
sqlSession.close();
}
SqlSession:不是线程安全得。每次使用后都要进行关闭
2.2HelloWorld接口式编程
- 创建一个Dao接口
-
- 对应要使用一个Dao接口和一个Dao.xml
- 修改Mapper文件
public interface StudentDao {
//查询一个学生
Student selectStudentById(Integer id);
}
<?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">
<!--查询语句
id:唯一标识符,这里和接口方法绑定
resultType标识返回值类型,让框架自动为你封装
-->
<select id="selectStudentById" resultType="java1.bean.Student">
select * from student where id = #{id}
</select>
</mapper>
- 测试
SqlSession sqlSession = sqlSessionFactory.openSession();
//mapper实际是一个代理对象,交由代理对象执行方法
StudentDao mapper = sqlSession.getMapper(StudentDao.class);
Student student = mapper.selectStudentById(1001);
System.out.println(student);
// 这里的sqlSession没有进行关闭,这是一个坏习惯
3全局配置文件详解
mybatis全局配置文件,mybatis-config.xml
文件结构,详细去看文档
• configuration 配置
• properties 属性 //这个可以额外写一个文件
• settings 设置
• typeAliases 类型命名
• typeHandlers 类型处理器
• objectFactory 对象工厂
• plugins 插件
• environments 环境
• environment 环境变量
• transactionManager 事务管理器
• dataSource 数据源
• databaseIdProvider 数据库厂商标识
• mappers 映射器
3.1properties文件
将数据库链接信息写,方便进行修改,解耦等操作
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springdb?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=admin
全局文件
<?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="dbconfig.properties"> </properties>
<!-- 设置日志-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 这里是对命名规则的转换-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 这里是开启懒加载-->
<setting name="lazyLoadingEnabled" value="false"/>
<!-- 这里是将自动加载关闭,导致后来有需要的时候才进行加载-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<!--可以为java类型起别名
-->
<typeAliases>
<!--
type就是全类名
默认别名就是类名的小写
alias就是一个新的别名
-->
<typeAlias type="java1.bean.Employee" alias="emp"></typeAlias>
<!-- package可以批量起别名
name就是指定的包 (默认就是类名小写) -->
<package name="java1.bean"/>
</typeAliases>
<!--
environments环境们,标识可以匹配多个环境
-->
<!-- 这里的default标识默认使用的那个数据库的连接信息,与买你的id匹配-->
<environments default="development">
<!-- environment 表示一种环境-->
<environment id="development">
<!-- 事务管理器,type表示类型JDBC是一个缩写-->
<transactionManager type="JDBC"/>
<!-- -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<environment id="mysql">
<!-- 事务管理器,type表示类型JDBC是一个缩写-->
<transactionManager type="JDBC"/>
<!-- -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--
databaseIdProvider:支持多数据库厂商
DB_VENDOR:这是一个别名,得到数据库厂商标识,标识是驱动自带的,
-->
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
</databaseIdProvider>
<!-- 这里是找到其他的mapper文件
从target/classes开始:
这里用/做分隔符
一个mapper标签 指定一个mapper;
-->
<!-- <mappers>-->
<!-- 将sql映射注册到全局配置中
resource="用类路径下的sql映射文件"
url:师表磁盘下的sql映射文案金
class:标识接口,要求,
1.映射文件和类在同一目录下,名称相同,
2.利用注解的方式进行标识,不用映射文件,
-->
<!-- <mapper resource="java1/dao/StudentDao.xml"/>-->
<!-- </mappers>-->
<mappers>
<package name="java1.dao"/>
</mappers>
</configuration>
3.2 Settings设置
mybaits相关设置,改变mybatis运行时行为
<!-- 设置日志-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 这里是对命名规则的转换-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 这里是开启懒加载-->
<setting name="lazyLoadingEnabled" value="false"/>
<!-- 这里是将自动加载关闭,导致后来有需要的时候才进行加载-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
3.3 typeAliases别名处理器
<typeAliases>
<!--
type就是全类名
默认别名就是类名的小写
alias就是一个新的别名
-->
<typeAlias type="java1.bean.Employee" alias="emp"></typeAlias>
<!-- package可以批量起别名
name就是指定的包 (默认就是类名小写) -->
<package name="java1.bean"/>
</typeAliases>
还可以使用注解方式进行指定别名,@Alias("emp")给一个类取一个别名
注意,有很多java内酯雷默认有了别名,我们不要占用