1.Mybatis概念
1.Mybatis特点
1.属于持久层框架 持久化(将内存中的对象数据转移到数据库的过程称为持久化)
Mybatis Hibernate Spring-Data-Jpa
2.半自动化 ORM 框架
ORM:对象关系映射思想
面向对象OOP 关系型数据库
类(User) t_user
成员变量 字段
类对象 记录
半自动化 VS 自动化
Mybatis-半自动化:
1.表需要手动进行设计
主表 从表
2.应用程序提供sql -基本功(以查询为主
单表查询-(条件过滤 排序 分组 子查询 聚合查询-聚合函数)
多表连接查询
)
3.依赖数据库平台
优点:上手简单(基于原生的JDBC封装) 优化比较灵活 适合做互联网项目
Hibernate-自动化ORM 框架
1.表可以通过框架自动化创建
2.省掉基本的sql (基本的添加 查询 更新 删除)
3.不依赖数据库平台
缺陷:学习成本较高 优化难度较大 适用于传统的软件( OA | 图书馆管理系统 | ERP。。 ) 不适合大型的互联网项目(电商 金融项目)
2.什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1.支持定制化sql (程序员编写sql)
2.支持存储过程调用(数据库端脚本)
3.映射处理(结果映射)
屏蔽原生的jdbc 代码( Connection PS ResultSet 资源关闭 )
XML 配置 | 注解配置
2.Mybatis环境搭建
目录图:
表的结构图:
1.构建Maven普通工程:maven-archetype-quickstart
2.pom.xml 添加依赖坐标
<!-- mybatis jar 包依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<!-- log4j 日志打印 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<build>
<!--
Maven 项目
如果源代码(src/main/java)存在xml properties tld 等文件 maven 默认不会自动编译该文件到输出目录
如果要编译源代码中xml properties tld 等文件 需要显式配置resources 标签
-->
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
3.resources文件夹中添加日志文件 log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t]-%m%n
4.resources文件夹中添加配置文件 jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
jdbc.user=root
jdbc.password=root
5.数据库表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) NOT NULL,
`user_pwd` varchar(255) DEFAULT NULL,
`flag` varchar(255) DEFAULT NULL,
`create_time` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8;
6.添加User对象实体类
public class User {
private Integer id;
private String userName;
private String userPwd;
private String flag;
private Date createtime;
}
7.在 java目录下新建一个 mappers 包添加Sql映射文件 UserMapper.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">
<!--
1.命名空间配置 namespace: 值全局唯一 包名+文件名(不包含后缀如:.xml),格式:com.mage.mappers.UserMapper
2.配置 Mapped Statement
3.查询标签:select 又称为statement statement 配置
id 值声明 statement 唯一标识,同一命名空间(同一文件)下不可重复
parameterType 输入参数即占位符的数据类型 类型可以是 基本数据类型,字符串,javabean ,map,list,数组 等
resultType 输出结果 类型可以是基本数据类型,字符串,javabean,map等
标签体:statement 描述 即待执行的 sql语句
#{id} 占位符 变量名为 id/value 均可 ${value} 变量名必须为 value 如果是字符串拼接形式 无法避免sql注入
-->
<mapper namespace="com.mage.mappers.UserMapper">
<select id="queryUserById" parameterType="int" resultType="com.mage.vo.User">
select id,user_name as userName,user_pwd as userPwd from user where id=#{id}
</select>
</mapper>
8.resources文件夹中添加全局配置文件mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!-- mybatis 框架头文件声明,类似 spring 环境,均需要加入头文件 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 添加数据库连接相关配置信息 -->
<configuration>
<!--引入外部配置文件-->
<properties resource="jdbc.properties"/>
<environments default="development">
<environment id="development">
<!-- 加入事务控制 -->
<transactionManager type="jdbc" />
<!-- 配置数据库连接信息 -->
<dataSource type="pooled">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- mapper 加载指定Sql映射配置文件 文件数量可配置多个-->
<mappers>
<!--resource:包路径 格式:xxx/xxx/xxx/xxxMapper.xml-->
<mapper resource="com/mage/mappers/UserMapper.xml" />
</mappers>
</configuration>
9.添加测试代码
@Test
public void test01() throws IOException {
/*步骤:
* 1.加载全局配置文件 构建sqlSessionFactory
* 2.获取会话sqlSession
* 3.调用方法执行查询
* 4.关闭查询
*/
/*加载配置到内存 注意:org.apache.ibatis.io.Resources*/
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
/*
*创建SqlSessionFactory对象hibernate也是如此,必须先获取SqlSessionFactory实例化对象
*/
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
/*
*打开会话
*/
SqlSession sqlSession = sqlSessionFactory.openSession();
/**获取session以便操作数据库
* 参数一:指定UserMapper.xml映射文件id必须加入命名空间
* 参数二:指定输入参数
* 参数statment对应:namespace.statementId
*/
User user = sqlSession.selectOne("com.mage.mappers.UserMapper.queryUserById", 75);
System.out.println(user);
/*
*操作完数据库关闭session
*/
sqlSession.close();
}
10.启动测试
3.mybatis中的Mapper.xml中sql入参,结果参数配置
- 入参: 基本类型(包装类型)、String、Date、JavaBean、Map、List、数组
- 结果参数:基本类型(4类8种) String Date JavaBean List Map List
1.Mybatis映射sql 入参配置
基本类型
<!--使用sql标签,将sql语句中频繁使用的字段统一管理和使用,直接通过id属性来调用-->
<sql id="user_columns">
id,user_name as userName,user_pwd as userPwd,flag,create_time as createTime
</sql>
<select id="queryUserById" parameterType="int" resultType="com.mage.vo.User">
select <include refid="user_columns"/>
from user
where id=#{userId}
</select>
String 类型
<select id="queryUserByUserName" parameterType="string" resultType="com.mage.vo.User">
select <include refid="user_columns"/>
from user
where user_name=#{userName}
</select>
JavaBean 类型
<select id="queryUserByUserNameAndUserPwd" parameterType="com.mage.query.UserQuery" resultType="com.mage.vo.User">
<!--
userName,userPwd 为 UserQuery 类成员变量名
-->
select <include refid="user_columns"/>
from user
where user_name=#{userName} and user_pwd=#{userPwd}
</select>
Map 类型
<select id="queryUserByUserNameAndUserPwdMap" parameterType="map" resultType="com.mage.vo.User">
<!--
uname map 中key 的名称
password map 中key 的名称
-->
select <include refid="user_columns"/>
from user
where user_name=#{uname} and user_pwd =#{password}
</select>
数组类型
<!--
collection 值 array|list 当数组放在map 中传入时collection值此时为key的名称!!!
-->
<update id="updateUserPasswordByIds" >
update user set user_pwd="111111" where id in
<foreach collection="array" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</update>
2.Mybatis映射sql 结果参数配置
结果参数:基本类型(4类8种) String Date JavaBean List Map List<Map>
resultType:String Date JavaBean map
resultMap:属于一个标签id 值 为另一个resultMap 标签的id
基本类型
<select id="countUser" resultType="int">
select count(1)
from user
</select>
日期类型
<select id="queryUserCreateTimeByUserId" parameterType="int" resultType="date">
select create_time
from user
where id=#{userId}
</select>
JavaBean
<sql id="user_columns">
id,user_name as userName,user_pwd as userPwd,flag,create_time as createTime
</sql>
<select id="queryUserByUserName" parameterType="string" resultType="com.mgae.vo.User">
select <include refid="user_columns"/>
from user
where user_name=#{userName}
</select>
Map
<select id="queryUsersByUserNameLikeMap" parameterType="string" resultType="map">
select <include refid="user_columns"/>
from user
where user_name like concat('%',#{userName},'%')
</select>
List
<select id="queryUsersByUserNameLike" parameterType="int" resultType="com.mgae.vo.User">
select <include refid="user_columns"/>
from user
where user_name like concat('%',#{userName},'%')
</select>
ResultMap 接收结果
<!--
当前文件 id 唯一且不可重复
-->
<resultMap id="user_map" type="User">
<!--
column:返回的列名
property:User 对象成员变量
-->
<result column="id" property="id"></result>
<result column="user_name" property="userName"></result>
<result column="user_pwd" property="userPwd"></result>
<result column="flag" property="flag"></result>
<result column="create_time" property="createTime"></result>
</resultMap>
<select id="queryUserById02" parameterType="int" resultMap="user_map">
select id, user_name, user_pwd, flag, create_time
from user
where id=#{userId}
</select>
4.Mybatis的xml配置文件中常见元素配置
(properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)
1.properties标签
1.给某些外部属性赋值且可以动态替换
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
2.加载外部配置文件
<!--引入外部配置文件-->
<properties resource="jdbc.properties"/>
2.typeAlias标签
1.类型别名是为 Java 类型设置一个短的名字,它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余,书写方便
<typeAliases>
<!--配置1:指定具体类取别名-->
<typeAlias type="com.mage.vo.User" alias="user"/>
<typeAlias type="com.mage.query.UserQuery" alias="userquery"/>
<!--配置2:指定某个包路径下的所有类取别名,别名默认是类名(推荐使用)-->
<package name="com.mage.vo"/>
<package name="com.mage.query"/>
</typeAliases>
对应mybatis项目中的java目录下的Mapper.xml映射文件中sql入参和结果参数配置可以做出相应的书写改变
<!--使用sql标签,将sql语句中频繁使用的字段统一管理和使用,直接通过id属性来调用-->
<sql id="user_columns">
id,user_name as userName,user_pwd as userPwd,flag,create_time as createTime
</sql>
<!--在mybatis.xml中添加别名标签,sql映射文件中入参和结果参数可以用类名代替,不必写包名+类名-->
<select id="queryUserById" parameterType="int" resultType="User">
select <include refid="user_columns"/>
from user
where id=#{userId}
</select>
<select id="queryUserByUserNameAndUserPwd" parameterType="UserQuery" resultType="User">
<!--
userName,userPwd 为 UserQuery 类成员变量名
-->
select <include refid="user_columns"/>
from user
where user_name=#{userName} and user_pwd=#{userPwd}
</select>
3.mappers标签
mappers 映射器(四种配置):精确定位我们配置的sql映射文件的所在位置,进行后续的CRUD操作!
<!— sqlmapper 配置文件路径 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!—url 绝对路径形式-->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!—接口 列表配置形式 注解 sql-->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!—映射包下所有接口-->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
4.settings标签
<settings>
<!--
数据库字段(带有_字符的字段) 自动转换为驼峰命名
-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
本次分享就到这里,如果文章有小问题,欢迎评论区留言,如果文章对你有帮助,请各位收藏并给我点个赞,如果你想学习更多,请关注我!谢谢!