MyBatis
什么是SSM?
IBatis提供的持久层框架包括SQLMap和Data Access Objects(DAO)
MyBatis特性
1)MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架
2)MyBatis 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
3) MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和java的POJO (Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
4)MyBatis是一个半自动的ORM(Object Relation Mapping)框架(将数据库中的数据,映射到实体类对象,用户直接操作实体类对象即可)
MyBatis和其它持久化技术对比
JDBC
1.SQL夹杂在java代码中耦合度高,导致硬编码内伤
2.维护不易且实际开发需求中SQL有变化,频繁修改的情况多见
3.代码冗长,开发效率低
Hibernate和JPA
1.操作简单,开发效率高
2.程序中的长难复杂SQL需要绕过框架
3.内部自动生产的SQL,不容易做特殊优化
4.基于全映射的全自动框架,大量字段的POJO进行部分映射比较困难
5.反射操作太多,导致数据库性能下降
MyBatis
1.轻量级,性能出色
2.SQL和java编码分开,功能边界清晰,java代码专注业务、SQL语句专注数据
3.开发效率稍逊于Hibernate,但是完全能够接受
创建MyBatis的核心配置文件
习惯上命名为mybatis-config.xml,这个文件名仅仅是建议,并非强制要求。将来整合Spring之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴
核心配詈文件主要用于配置连接数据库的环境以及MyBatis的全同配置信息
核心配置文件存放的位置是srcimain/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>
<!--定义属性文件
resource:从类路径下面读取外部文件
url:从一个资源定位地址来读取配置文件
提供参数使用: 可以使用 ${参数名} 进行参数引用
-->
<environments default="default">
<!--环境变量-->
<environment id="default">
<!--事务管理器:由JDBC管理事务 -->
<transactionManager type="JDBC"/>
<!--数据源配置信息:POOLED 使用连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="2022"/>
</dataSource>
</environment>
</environments>
<!-- 加载其他的映射文件 -->
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
创建mapper接口
MyBatls中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要提供实现类。
创建MyBatis的映射文件
MyBatls中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要提供实现类。
创建MyBatis的映射文件
相关概念:ORM(Object Relationship Mapping)对象关系映射
.对象:java的实体类对象
.关系:关系型数据库
.映射:二者之间的对应关系映射文件的命名规则->表所对应的实体类的类名+Mapper.xml
测试添加功能
SqlSession:代表java程序和数据库之间的会话。(HttpSession是java程序和浏览器之间的会话)
SqlSessionFactory:是”生产SqlSession的”工厂。
工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个”工厂类”中,以后都使用这个工厂类来”生产”我们需要的对象
示例代码:
@Test
public void testMyBatis() throws IOException {
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//获取SqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取mapper接口对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//测试功能
int result = mapper.insertUser();
//提交事务
sqlSession.commit();
System.out.println("result:"+result);
}
需要手动提交数据的原因
优化功能
对于简单的SQL我们没必要每次都手动提交数据,因此可以把默认的手动提交,变为自动提交
加入log4j日志文件功能
第一步 加入依赖
<!--log4j日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
第二步 加入配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
%m (%F:%L) \n"/>
</layout>
</appender>
<logger name="java.sql">
<level value="debug"/>
</logger>
<logger name="org.apache.ibatis">
<level value="info"/>
</logger>
<root>
<level value="debug"/>
<appender-ref ref="STDOUT"/>
</root>
</log4j:configuration>
日志的级别
FATA(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试)
从左到右打印的内容越来越详细
MyBatis核心配置文件之environment
MyBatis核心配置文件之properties
将数据库信息写在properties里面,之后在配置文件里面引用
第一步:创建properties文件,并且编写数据库配置信息
第二步:在配置文件中引入properties文件
第三步:编写数据库连接池
MyBatis核心配置文件之typeAliases
MyBatis核心配置文件中,标签的顺序:
propertiers?,setting?,typeAliases?,typeHandlers?
objectFactory?,objectWrapperFactory?,reflectorFactory?,
plugins?,environments?,dataseIdProvider?,mappers?为了避免重复频繁的写在mapper中的resultType写全类名
所以可以在配置文件中利用typeAliases标签创建一个简短的别名
随后在mapper文件写sql语句时可以注意
不区分大小写
若不设置属性alis
则会有默认别名就是类名不区分大小写
MyBatis核心配置文件之mappers
当表的数量太多的时候,需要大量的mapper标签来引入映射文件,为此我们可以通过引入包的方式来引入映射文件以包为单位引入映射文件
要求:
1.mapper接口所在的包要和映射文件所在的包一致
2.mapper接口要和映射文件的名字一致