@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 底层主要应用反射
UserMapper user = sqlSession.getMapper(UserMapper.class);
List userList = user.getUsres();
for (User user1 : userList) {
System.out.println(user1);
}
sqlSession.close();
}
本质:反射机制实现
底层:动态代理!
mybatis执行的流程
使用注解CRUD
在工具类创建的时候显示自动提交事务
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession(true);
}
编写接口,增加注解
@Select("select * from user")
List getUsres();
//方法存在多个参数,所有参数前面必须用@Param注解
@Select("select * from user where id = #{id}")
User getUserById(@Param("id") int id);
@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")
int addUser(User user);
@Update("update user set name=#{name}, pwd=#{pwd} where id=#{id}")
int updateUser(User user);
@Delete("delete from user where id=#{uid}")
int deleUser(@Param("uid") int id);
关于@Param()注解
基本类型的参数或者 String类型,需要加上
引用类型不需要加
如果只有一个基本类型的话,可以忽略,但是建议加上
在SQL中引用的就是@Param(“uid”)中设定的属性名uid
#{}和${}
#{}是预编译处理,${}是字符串替换。
Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private int id;
private String name;
private int tid;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
private int id;
private String name;
private List students;
}
按结果嵌套处理
按照查询嵌套处理
小结
关联 - association [多对一]
集合 - collection [一对多]
javaType & ofType
javaType 用来指定实体类中属性的类型
ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型!
面试高频
MySQL引擎
InnoDB底层原理
索引
索引优化
动态SQL
根据不同的条件生成不同的SQL语句
##借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。
if
choose (when, otherwise)
trim (where, set)
foreach
CREATE TABLE `blog`
(
`id` VARCHAR(50) NOT NULL COMMENT '博客id',
`title` VARCHAR(100) NOT NULL COMMENT '博客标题',
`author` VARCHAR(30) NOT NULL COMMENT '博客作者',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`views` INT(30) NOT NULL COMMENT '浏览量'
) ENGINE = INNODB
DEFAULT CHARSET = utf8;
IF
select * from blog where 1=1
and title = #{title}
and author = #{author}
Choose(when, otherwise)
select * from blog
title = #{title}
and author = #{author}
and views = #{views}
trim(where, set)
select * from blog
title = #{title}
and author = #{author}
update blog
title = #{title},
author = #{author}
where id=#{id}
trim标签
select * from user
AND name=#{name} AND gender=#{gender}
sql:select * from user where 空格 name='xx' and gender = 'xx'
prefix:前缀
prefixoverride:去掉第一个and或者是or
update user
name=#{name} , gender=#{gender} ,
sql:update user set name='xx', gender='xx' 空格 where id='x'
suffixoverride:去掉最后一个逗号
suffix:后缀
Foreach
select * from blog
id=#{id}
@Test
public void queryBlogForeach(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class);
HashMap map = new HashMap();
ArrayList ids = new ArrayList<>();
ids.add(1);
ids.add(2);
map.put("ids", ids);
List blogList = blogMapper.queryBlogForeach(map);
for (Blog blog : blogList) {
System.out.println(blog.toString());
}
sqlSession.close();
}