ORM
面向对象的方式操作数据库
Hibernate 纯ORM框架
Mybatis概要
apache下的开元的项目 Ibatis
- 半自动的ORM框架
- 持久化
为什么要学习Mybatis
- 传统的JDBC操作需要建立连接释放资源
- SQL语句写在Java代码里,mybatis语句统一管理(xml文件中)
- SQL语句参数问题 ,
- 结果集处理 ,自动生成对象
优缺点
- 易于上手
- 灵活,耦合度低(sql语句跟java代码分离)
缺点
- 移植性比较差
基础使用
- 导入依赖
- 全局配置文件
- 编写Mapper接口
- 创建 mapper.xml文件
- 创建持久化对象
- 编写测试文件
创建Maven工程
导入依赖
<properties>
<mybatis.version>3.5.6</mybatis.version>
</properties>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
创建配置文件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>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis_test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
新建一个mapper的包(dao)
一个mapper接口对应一个表的操作
public interface UserMapper {
//使用注解的方式进行传参
int insert(@Param("user") User user);
User selectById(@Param("userId") int userId);
}
在resources下新建mapper/XxxMapper.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">
<mapper namespace="com.smart.mybatis.mapper.UserMapper">
<!--hibernate 注解的方式-->
<!--mybatis里 resultMap来映射 PO -->
<resultMap id="BaseResultMapper" type="com.smart.mybatis.entity.User">
<!-- 对应数据的ID-->
<id column="user_id" property="userId"/>
<!-- 普通字段-->
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="status" property="status"/>
</resultMap>
<!--结果集-->
<insert id="insert">
<!-- 接口中的参数如何在xml中使用 -->
insert into user (username, password)
values (#{user.username}, #{user.password})
</insert>
<select id="selectById" resultMap="BaseResultMapper">
select user_id, username, password, status
from user
where status = 0;
</select>
</mapper>
测试代码
public class TestMain {
public static void main(String[] args) {
//工厂模式
// 构建者模式
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(
TestMain.class.getClassLoader().getResourceAsStream("mybatis-config.xml")
);
// 原生mybatis 默认为 false //
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// User user = new User();
// user.setUsername("admin");
// user.setPassword("123456");
// int insert = mapper.insert(user);
// System.out.println(insert);
User user = mapper.selectById(2);
System.out.println(user);
}
}
SQL语句
create table user
(
user_id int auto_increment comment '主键'
primary key,
username varchar(64) not null comment '用户名',
password varchar(128) not null comment '密码',
status tinyint default 0 null comment '状态 0表示未删除 1 表示删除',
constraint username
unique (username)
)
comment '用户表';
多对多一定要有第三张中间表
#用户对多角色 多角色对多权限
#角色表
create table roles(
role_id int auto_increment primary key,
role_name varchar(64) not null unique comment '角色名字',
decs varchar(128),
is_del int(10) default 0 comment '0表示未删除1表示删除'
)comment '角色表';
#权限表
create table privilege(
privilege_id int auto_increment primary key ,
name varchar(128) not null comment '权限名',
decs varchar(128) comment '权限的说明',
is_del int default 0 comment '0表示未删除1表示删除'
);
# 中间表
create table roles_privilege_relation(
id int auto_increment primary key ,
privilege_id int references privilege(privilege_id),
role_id int references roles(role_id)
);
Mybatis 的使用步骤:
- 引入Mybatis 包依赖,创建Mybatis 的 config.xml 的配置文件链接数据库
- 创建数据库表,设置外键等依赖
- 反射生成实体类
- 实现对应的接口,通过mapper.xml 实现(namespace=“接口”)使用@Param传参
- 实现类mapper.xml中 设置resultMap 配置对应列名
- 实现对应功能
总结 Mybatis:
mapper接口:
- 方法命名 一般SQL关键字命名,与实体类一致
- 返回的类型 查询返回单个对象或者集合 增删改返回影响的行数
- 参数 @Param(“value”)
mapper.xml:
- mapper namespace=“对应的接口完整地址+类名”
resultMap
- 属性指向对象(不一定非要指定持久化对象entity)
- entity 持久化 实现序列化接口 属性使用包装类型 提供getter和 setter方法 提供无参的构造方法
- 子元素
id对应的逐渐
result对应普通字段
- 公共属性:column property (解决列名不一致)
association 一对一的映射关系
- 属性 :property 对应对象中的属性(如ID)
- resultMap 执行另一个resultMap
collection 一对多
- 属性 :property 对应对象中的属性(如ID)
- resultMap 执行另一个resultMap
select
属性 | ||
---|---|---|
id 重点 | 指向接口的方法的名称 | |
resultMap 重点 | 返回结果集 | |
resultType | 返回一个指定的对象 | |
paramterType | 指定参数的类型(@Param()注解代替) | |
flushCache | 清空二级缓存 | |
userCache | 执行查询语句使用你二级缓存 默认开始 |
insert
属性 | 说明 | |
---|---|---|
id | 对象接口的方法名 | |
keyproperty | 指定返回自增ID的赋值属性 | |
userGeneratedKeys | 获取数据库的自增ID 默认fales | |
映射关系
一对一 一对多 多对多
多表查询 使用外连接 普通多表查询() < 子查询()< 外连接()
动态sql (在数据入口处对数据进行校验)
-
if
-
<if text="只做简单的逻辑判断 比如是否为null">
-
trim
-
<trim prefix="WHERE 或者 SET" prefixOverrides="AND 或者 OR" >
-
foreach
-
<foreach item="" collection="集合 |数组 |map " open="(" close=")" index="索引"> separator="分隔符" >