秒鲨后端之MyBatis【1】环境的搭建和核心配置文件详解
别忘了请点个赞+收藏+关注支持一下博主喵!!!! ! !
Mybatis简介
MyBatis历史
- MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github
- iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
MyBatis特性
- MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
- MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
- MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架
MyBatis下载
- MyBatis下载地址
和其它持久化层技术对比
- JDBC
- SQL 夹杂在Java代码中耦合度高,导致硬编码内伤
- 维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见
- 代码冗长,开发效率低
- Hibernate 和 JPA
- 操作简便,开发效率高
- 程序中的长难复杂 SQL 需要绕过框架
- 内部自动生产的 SQL,不容易做特殊优化
- 基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。
- 反射操作太多,导致数据库性能下降
- MyBatis
- 轻量级,性能出色
- SQL 和 Java 编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据
- 开发效率稍逊于HIbernate,但是完全能够接受
搭建MyBatis
开发环境
- IDE:idea 2019.2
- 构建工具:maven 3.5.4
- MySQL版本:MySQL 5.7
- MyBatis版本:MyBatis 3.5.7
创建maven工程
-
打包方式:jar
-
引入依赖
<dependencies><!-- Mybatis核心 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><!-- junit测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.3</version></dependency> </dependencies>
创建MyBatis的核心配置文件
习惯上命名为
mybatis-config.xml
,这个文件名仅仅只是建议,并非强制要求。将来整合Spring之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。
核心配置文件主要用于配置连接数据库的环境以及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> <!--设置连接数据库的环境, localhost后填表名--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="org.postgresql.Driver"/><property name="url" value="jdbc:postgresql://localhost:5432/postgres"/><property name="username" value="postgres"/><property name="password" value="aaa53557860"/></dataSource> </environment> </environments> <!--引入映射文件--> <mappers> <!--java是以包的形式,故全类名为.而resources是目录的形式,故全类名为路径/--><mapper resource="mappers/UserMapper.xml"/> </mappers>
</configuration>
创建mapper接口
MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要提供实现类
package com.atguigu.mybatis.mapper; public interface UserMapper { /*MyBatis面向接口编程的两个一致:1. 映射文件的namespace要和mapper接口的全类名保持一致2. 映射文件中SQL语句的id要和mapper接口中的方法名一致即:表--实体类--mapper接口--映射文件*//*在这里声明各类sql功能函数,再到UserMapper.xml文件写sql语句*//*添加用户信息*/ int insertUser();
}
创建MyBatis的映射文件
- 相关概念:ORM(Object Relationship Mapping)对象关系映射。
- 对象:Java的实体类对象
- 关系:关系型数据库
- 映射:二者之间的对应关系
Java概念 | 数据库概念 |
---|---|
类 | 表 |
属性 | 字段/列 |
对象 | 记录/行 |
- 映射文件的命名规则
- 表所对应的实体类的类名+Mapper.xml
- 例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml
- 因此一个映射文件对应一个实体类,对应一张表的操作
- MyBatis映射文件用于编写SQL,访问以及操作表中的数据
- MyBatis映射文件存放的位置是src/main/resources/mappers目录下
- MyBatis中可以面向接口操作数据,要保证两个一致
- mapper接口的全类名和映射文件的命名空间(namespace)保持一致
- mapper接口中方法的方法名和映射文件中编写SQL的标签的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">
<!--namespace:名称空间,指定为接口的全类名-->
<mapper namespace="com.atguigu.mybatis.mapper.UserMapper"> <!--SQL语句写在xml映射文件中--><!--int insertUser()--><!--这样调用mapper接口中的方法就可以根据mapper接口的全类名去匹配到这个xml映射文件,然后再根据我们调用的方法名来匹配到咱们的SQL语句--><!--输入<可以看到sql的各种关键字如select,insert等等-->
<!--int insertUser()
!注意标签为要执行的关键字操作,如下是insert快捷方式为输入<insert后enter,写上函数方法名后,再在末尾加上>后自动补全标签,同时光标自动置于中间位置,供输入sql语句
--> <insert id="insertUser"><!--这里要遵循不同的SQL语法--> insert into t_user (username,password,email) values ('admin','123456','admin@atguigu.com')</insert>
</mapper>
通过junit测试功能
- SqlSession:代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的会话)
- SqlSessionFactory:是“生产”SqlSession的“工厂”
- 工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象
public class UserMapperTest {@Testpublic void testInsertUser() throws IOException {//读取MyBatis的核心配置文件InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//获取SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);//获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务//SqlSession sqlSession = sqlSessionFactory.openSession();//创建SqlSession对象,设置参数为true,此时通过SqlSession对象所操作的sql都会自动提交 SqlSession sqlSession = sqlSessionFactory.openSession(true);//通过代理模式创建UserMapper接口的代理实现类对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句int result = userMapper.insertUser();//提交事务,没设置true的话要如下手动提交事务//sqlSession.commit();System.out.println("result:" + result);}
}
- 此时需要手动提交事务,如果要自动提交事务,则在获取sqlSession对象时,使用
SqlSession sqlSession = sqlSessionFactory.openSession(true);
,传入一个Boolean类型的参数,值为true,这样就可以自动提交 - 注意,以上是insert方法的测试函数testInsertUser(),如果要写(测试)其他的方法,要照着上面重新写一遍,注意一些函数名改一下即可。
加入log4j日志功能
-
加入依赖
<!-- log4j日志 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
-
加入log4j的配置文件
- log4j的配置文件名(固定的,大多数日志的配置文件名字都是固定的)为log4j.xml,存放的位置是src/main/resources目录下
- 日志的级别:FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试) 从左到右打印的内容越来越详细,当为日志配置级别如时,及设置打印等级大于等于debug级别的日志即DEBUG,INFO,WARN,ERROR,FATAL。
<?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>
运行之前的juint-test测试java文件:打印了我们设置的三个日志
核心配置文件详解
MyBatis核心配置文件中的标签必须按照固定的顺序(有的标签可以不写,但顺序一定不能乱):
properties、settings、typeAliases、typeHandlers、objectFactory、objectWrapperFactory、reflectorFactory、plugins、environments、databaseIdProvider、mappers自己创建的(resources下)properties文件长这样:(为了区分当引入多个properties的键的重名问题,可以加上jdbc-properties方法.driver如jdbc.driver这样来区分)可以通过下面的方式直接引入,而无需按照之前的方式填driver,url,username,password,只需要按照接下来的如${jdbc.driver}一样填即可
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//MyBatis.org//DTD Config 3.0//EN""http://MyBatis.org/dtd/MyBatis-3-config.dtd">
<configuration><!--引入properties文件,此时就可以${属性名}的方式访问属性值--><properties resource="jdbc.properties"></properties><settings><!--将表中字段的下划线自动转换为驼峰--><setting name="mapUnderscoreToCamelCase" value="true"/><!--开启延迟加载--><setting name="lazyLoadingEnabled" value="true"/></settings><typeAliases><!--typeAlias:设置某个具体的类型的别名属性:type:需要设置别名的类型的全类名alias:设置此类型的别名,且别名不区分大小写。若不设置此属性,该类型拥有默认的别名,即类名如下面就为User以下就是以com.atguigu.mybatis.pojo。User数据库类--><!--<typeAlias type="com.atguigu.mybatis.pojo.User"></typeAlias>--><!--这里就实现了以类名[称为类型别名]User代替冗长的全类名com.atguigu.mybatis.pojo.User(虽然可以不设置,默认就可以为User--><!--<typeAlias type="com.atguigu.mybatis.pojo.User" alias="User"></typeAlias>--><!--以包为单位,设置改包下所有的类型都拥有默认的别名(通常用这个),即类名且不区分大小写--><packagename="com.atguigu.mybatis.pojo"/></typeAliases><!--environments:设置多个连接数据库的环境,就是在这个标签内可以设置多个environment(标签),里面可以各不相同属性:default:设置默认使用的环境的id--><environments default="mysql_test"><!--environment:设置具体的连接数据库的环境信息属性:id:表示连接数据库的环境的唯一标识,不能重复,可通过environments标签中的default设置某一个环境的id,表示默认使用的环境--><environment id="mysql_test"><!--transactionManager:设置事务管理方式属性:type:设置事务管理方式,type="JDBC|MANAGED"type="JDBC":设置当前环境的事务管理都必须手动处理(执行SQL时)type="MANAGED":设置事务被管理,例如spring中的AOP(执行SQL时)--><transactionManager type="JDBC"/><!--dataSource:设置数据源属性:type:设置数据源的类型,type="POOLED|UNPOOLED|JNDI"type="POOLED":使用数据库连接池,即会将创建的连接进行缓存,下次使用可以从缓存中直接获取,不需要重新创建type="UNPOOLED":不使用数据库连接池,即每次使用连接都需要重新创建type="JNDI":调用上下文中的数据源--><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><!--引入映射文件--><mappers><!-- <mapper resource="UserMapper.xml"/> --><!--以包为单位,将包下所有的映射文件引入核心配置文件注意:1. 此方式必须保证mapper接口和mapper映射文件必须在相同的包下2. mapper接口要和mapper映射文件的名字一致--><package name="com.atguigu.mybatis.mapper"/></mappers>
</configuration>
package包:类似于一层一层的目录的形式。
例如在resources下创建package:
新建目录,1.如果是这样创建:com.atguigu.mybatis,生成的是一个com.atguigu.mybatis.xml的文件,看着像包,然而右键用资源管理器点开,发现长这样:
只有一个目录,并不是包
而2.如果是com/atguigu/mybatis/xml,生成的也是一个com.atguigu.mybatis.xml的文件,但是长这样:
这才是真正的package的样子
别忘了请点个赞+收藏+关注支持一下博主喵!!!! ! !