Mybatis简介
- Mybatis前身ibatis(ibatis3.x之后更名为Mybatis)
- MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
- MyBatis 避免了几乎所的 JDBC 代码和手动设置参数以及获取结果集
- Mybatis 是一个 半自动的ORM(Object Relation【关系_表】 Mapping【映射】)框架
- ORM:将对象与关系表关联映射,目的:操作对象可以影响表中的数据,从而简化代码。
为什么使用Mybatis
一 Mybatis与Jdbc对比
- Jdbc代码,sql与java代码耦合度高,不利于后期代码的维护…
- Mybatis,实现sql与java代码解耦,sql语句书写在映射文件中,便于后期代码的维护…
二 Mybatis与其他ORM框架对比(Hibernate)【ssh(spring+struts2+hibernate)】
- Hibernate全自动ORM框架,底层SQL无需我们程序员书写。(不便SQL优化)
- Mybatis半自动ORM框架,底层SQL需要程序员书写。(便于SQL优化)
Mybatis之Helloworld
一 导入mybatis核心jar包(安装)
- 必要支持jar包
- log4j.jar
- mysql-connection-java5.1-bin.jar
- log4j.xml放到类路径下
log4j.xml
<?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>
二 编写核心配置文件:mybatis-config.xml(可更改)
三 准备表&POJO
四 准备映射文件-书写SQL语句(调用相应Mapper的指定方法后,自动执行对应的SQL语句)
- 映射文件名与Mapper接口名称一致
- 完成两个绑定
- 映射文件中,mapper标签的namespace与XXXMapper接口的全类名一致
- XXXMapper接口中的方法名与select(delete|update|insert)标签的id属性值一致。
- 注意:Mapper中的方法可以重载吗?不可以,因为标签中的id属性值是唯一的。
五 使用核心对象:测试
- 通过核心配置文件,构建SqlSessionFactory
- 通过SqlSessionFactory获取SqlSession
- 通过SqlSession测试XXXMapper中的相应方法
sqlSession.selectOne();
sqlSession.getMapper();//推荐使用//1.通过核心配置文件,构建SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2.通过SqlSessionFactory获取SqlSession SqlSession session = sqlSessionFactory.openSession(); //3. 通过SqlSession测试XXXMapper中的相应方法 EmployeeMapper mapper = session.getMapper(EmployeeMapper.class); Employee emp = mapper.getEmpById(1); System.out.println("emp = " + emp);
Mybatis核心配置文件
一 作用:MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息
二 核心配置如下:
-
configuration:Mybatis核心配置文件的根标签。
-
properties:定义或引入属性文件
- 可以使用子标签定义属性
- 可以使用属性,引入外部属性文件
- resource:基于类路径下(类似src资源包下),引入外部资源属性文件
- url:基于URL(盘符|Http://…),引入外部资源属性文件
<!-- properties resource:基于类路径下,引入外部资源属性文件 url:基于URL(盘符|Http://...),引入外部资源属性文件 --> <properties resource="db.properties"> <!-- <property name="driver" value="com.mysql.jdbc.Driver"/>--> <!-- <property name="url" value="jdbc:mysql://localhost:3306/db1213"/>--> </properties>
-
settings
- 概述:这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为
- 属性
- mapUnderscoreToCamelCase:是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。
<!-- settings--> <settings> <setting name="mapUnderscoreToCamelCase" value="True"/> </settings>
- mapUnderscoreToCamelCase:是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。
-
typeAliases(类型别名)
- 概述:主要作用为POJO的全类名,定义简单的别名,便于使用。
- 语法:
<typeAliases> <!-- <typeAlias type="com.atguigu.mybatis.bean.Employee" alias="emp"></typeAlias>--> <!-- 为指定包中所有的bean,定义别名,别名默认值为:类名首字母小写(employee)--> <package name="com.atguigu.mybatis.bean"/> </typeAliases>
-
environments:设置数据源资源环境
<!-- 配置数据库环境--> <environments default="development"> <environment id="development"> <!--JDBC:mybatis事务管理器-JdbcTransactionFactory spring:声明式事务管理 --> <transactionManager type="JDBC"/> <!--mybatis底层提供数据源 POOLED:PooledDataSourceFactory UNPOOLED:UnpooledDataSourceFactory --> <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
- 概述:指定映射文件(XXXMapper.xml)的位置并加装。
- 语法:
<mappers> //方式一: <mapper resouce="基于类路径" url="基于系统路径"> <!--方式二 将指定包下的所映射文件,全部加载。 注意:一旦使用package标签一次性全部加载的方式。 必须将映射文件与Mapper接口的报名定义一致。 --> <package name="com.atguigu.mybatis.mapper"/> </mappers>
mybatis-config.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>
<!-- properties
resource:基于类路径下,引入外部资源属性文件
url:基于URL(盘符|Http://...),引入外部资源属性文件
-->
<properties resource="db.properties">
<!-- <property name="driver" value="com.mysql.jdbc.Driver"/>-->
<!-- <property name="url" value="jdbc:mysql://localhost:3306/db1213"/>-->
</properties>
<!-- settings-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="True"/>
</settings>
<!-- 类型别名-->
<typeAliases>
<!-- <typeAlias type="com.atguigu.mybatis.bean.Employee" alias="emp"></typeAlias>-->
<package name="com.atguigu.mybatis.bean"/>
</typeAliases>
<!-- 配置数据库环境-->
<environments default="development">
<environment id="development">
<!-- JDBC:mybatis事务管理器-JdbcTransactionFactory
spring:声明式事务管理
-->
<transactionManager type="JDBC"/>
<!-- mybatis底层提供数据源
POOLED:PooledDataSourceFactory
UNPOOLED:UnpooledDataSourceFactory
-->
<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="EmployeeMapper.xml"/>-->
<!-- 将指定包下的所有映射文件,全部加载。
注意:一旦使用package标签一次性全部加载的方式。
必须将映射文件与Mapper接口的报名定义一致。
-->
<package name="com.atguigu.mybatis.mapper"/>
</mappers>
</configuration>
Mybatis中映射文件
一 概述:
- MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单
- 如果拿它跟具相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码
- MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码
二 顶级标签
- 查询:
- 新增:
- 删除:
- 修改:
<!--映射文件跟标签-->
<mapper namespace="com.atguigu.mybatis.mapper.EmployeeMapper">
<insert id="saveEmp" useGeneratedKeys="true" keyProperty="id">
insert into tbl_employee(last_name, email, gender)
value (#{lastName},#{email},#{gender})
</insert>
<update id="updateEmp" useGeneratedKeys="true" keyProperty="id">
update tbl_employee
set last_name=#{lastName}, email=#{email}, gender=#{gender}
where id=#{id}
</update>
<delete id="delEmpById">
delete from tbl_employee
where id=#{id}
</delete>
<!--resultType:结果类型-->
<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
<!--占位符:#{}-->
SELECT id,last_name, email, gender
from tbl_employee
where id=#{id}
</select>
</mapper>
三 获取数据库的受影响函数
- 直接将Mapper接口方法中的返回值设置为:Integer|Boolean
/**
* 通过Id删除员工
* @param id
*/
Integer delEmpById(Integer id);
四 获取主键值
- 在insert|update标签中添加如下属性:
- useGeneratedKeys:令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键,默认值:false。需要我们手动设置为true.
- keyProperty:设置当前主键存放对象的目标属性。
<insert id="saveEmp" useGeneratedKeys="true" keyProperty="id">
insert into tbl_employee(last_name, email, gender)
value (#{lastName},#{email},#{gender})
</insert>