本文基于狂神说Java学习和自己所需记录的学习笔记。如果对你没有帮助请不要喷谢谢。
MyBatis项目环境搭建1.创建mybatis核心配置文件:
注意,此处设useSSL=false。因为useSSL=true这个需要证书,要向MySQL交钱的。我们自己学习练习不需要这个东西。
2.编写MyBatis工具类
//SqlSessionFactory -->SqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用Mybaties第一步:获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
// SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
public static SqlSession getSqlSession(){
// SqlSession sqlSession = sqlSessionFactory.openSession();
// return sqlSession;
return sqlSessionFactory.openSession();
}
}
3.实体类
//实体类
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + ''' +
", pwd='" + pwd + ''' +
'}';
}
}
4.Dao接口
public interface UserDao {
List getUserList();
}
5.配置sql
select * from mybatis.user
6.核心文件中注册mapper。形式如1中最下面的注册形式。
7.测试
@Test
public void test(){
//第一步:获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一:getMapper
UserDao userDao = sqlSession.getMapper(UserDao.class);
List userList = userDao.getUserList();
for (User user : userList) {
System.out.println(user);
}
//一定要记得提交事务
sqlSession.commit();
//关闭SqlSession
sqlSession.close();
}
模糊查询
建议在业务中拼接完成
ListuserList = mapper.getUserLike("%李%");
或者这样:
select * from mybatis.user where name like "%"#{value}"%"
这样容易出现sql注入
select * from mybatis.user where name like "%${value}%"
核心文件配置解析
configuration(配置) properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境配置) environment(环境变量) transactionManager(事务管理器) dataSource(数据源) databaseIdProvider(数据库厂商标识) mappers(映射器)
配置文件一共这么多内容
关于environments
可以配置多个环境,但是一个SqlSessionFactory实例只能有一个环境。
mybatis的驱动
一般有jdbc、manage。连接池用POOLED,还有其它的比如druid、c3p0等。
属性(properties)
1.通过外部properties配置文件引入:
db.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8 username=root password=123456
核心配置文件:
可以直接引入外部文件
可以在其中增加一些属性配置
如果两个文件有同一个字段,优先使用外部配置文件的!
可以直接用User
也可以指定一个包名,扫描包下所有的Bean
第一种可以DIY别名,第二种则不行,如果非要改,需要在实体上增加注解
@Alias("user")
//实体类
public class User {}
设置
三个重要的设置:
全部设置:
映射器
方式一:【推荐使用】
方式二:
注意点:
接口和它的Mapper配置文件必须同名!
接口和它的Mapper配置文件必须在同一个包下!
方式三:
注意点:
接口和它的Mapper配置文件必须同名!
接口和它的Mapper配置文件必须在同一个包下!
生命周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder:
一旦创建了 SqlSessionFactory,就不再需要它了。
局部变量
SqlSessionFactory:
说白就是可以想象为:数据库连接池。
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
SqlSessionFactory 的最佳作用域是应用作用域。
最简单的就是使用单例模式或者静态单例模式。
SqlSession:
连接到连接池的一个请求!
SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
用完后需要赶紧关闭,否则资源被占用!
select * from mybatis.user where id = #{id}
select中resultMap属性对应其resultMap标签的id,而resultMap中的type对应其需要映射的实体类,resultMap中所有的result标签,只需要映射数据库中和实体类中字段名不同的即可。
Lombok有几个常用的注解
@Data 自动生成get、set方法还有equals方法。
@AllArgConstruct 自动生成有参构造
@NoArgConstruct 自动生成无参构造
@ToString 生成toString方法
@EqualsAndHashCode 生成equals和hashcode方法。
查询嵌套处理:
按照结果嵌套
select s.id sid,s.name sname,t.name tname from student s,teacher t where s.tid = t.id;
一对多:
@Data
public class Student {
private int id;
private String name;
private int tid;
}
@Data
public class Teacher {
private int id;
private String name;
//一个老师拥有多个学生
private List students;
}
按查询结果嵌套
select s.id sid, s.name sname, t.name tname,t.id tid
from student s,teacher t
where s.tid = t.id and t.id = #{tid}
查询嵌套
select * from mybatis.teacher where id = #{tid} select * from mybatis.student where tid = #{tid}
此处备注一下:
column是给下一个子查询传递参数的。
注意:在处理组合键时,您可以使用column=“{prop1=col1,prop2=col2}”这样的语法,设置多个列名传入到嵌套查询语句。这就会把prop1和prop2设置到目标嵌套选择语句的参数对象中。
慢SQL 1s 1000s
面试高频
Mysql引擎 InnoDB底层原理 索引 索引优化!MyBatis条件查询
关于这个条件查询,最好是在所有查询后面添加where 1=1这个条件,能先保证查询出所有的东西出来,也方便后面动态sql语句的编写。
所用实体类:
@Data
public class Blog {
private int id;
private String title;
private String author;
private Date createTime;
private int views;
}
动态语句if:
select * from mybatis.blog where 1=1 and title = #{title} and author = #{author}
动态语句where:
where标签会在一个以上条件成立的情况下,添加where。否则不会添加where语句。where语句还会智能的去除and和or。
SELECT * FROM BLOG state = #{state} AND title like #{title} AND author_name like #{author.name}
动态语句choose
choose标签有when和otherwise标签,这个类似于Java中的switch语句。
select * from mybatis.blog title = #{title} and author = #{author} and views = #{views}
动态语句set:
set的用法跟where差不多。
set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。
update Author where id=#{id} username=#{username}, password=#{password}, email=#{email}, bio=#{bio}
动态语句trim:
与where等价的trim:
如果 where 元素与你期望的不太一样,你也可以通过自定义 trim 元素来定制 where 元素的功能。比如,和 where 元素等价的自定义 trim 元素为:
...
prefixOverrides 属性会忽略通过管道符分隔的文本序列(注意此例中的空格是必要的)。上述例子会移除所有 prefixOverrides 属性中指定的内容,并且插入 prefix 属性中指定的内容。
与set等价的trim:
...
动态语句sql标签:
这个标签中的所有sql都可以复用。因此,我们可以将一些公共部分抽象出来,然后写在sql标签中,方便复用。
title = #{title} and author = #{author}
需要的时候include即可
select * from mybatis.blog
但是最好不要把包含where的语句包含在sql标签中。
动态语句foreach:
select * from mybatis.blog
id = #{id}
建议:先在mybatis中写好sql,再改成动态sql。
缓存可以使用缓存的数据:经常查询但是不经常改变的数据。
一级缓存:
一级缓存是针对Sqlsession的缓存。
一般是查询先走缓存,然后无数据再查询数据库。修改、删除、添加操作时候,会重新更新缓存。
二级缓存:
一个命名空间,也就是一个xml文件对应一个二级缓存。
开启全局缓存:
这个是不基于会话的,就是SqlSession关闭后,会自动把内容保存到二级缓存中。我们可以利用它来提高查询效率。
也可以在查询标签中,显式开启或者关闭某个方法是否走二级缓存。
我们需要在用缓存的时候,实现实体类的序列化功能,否则会报错。
总结:
只要开启了二级缓存,在同一个Mapper下就有效;
所有的数据都会先放在一级缓存中;
只有当会话提交或者关闭的时候,才会提交到二级缓存中!
缓存原理:
自定义缓存:
ehcache
要在程序中使用ehcache,先要导包!
在mapper中指定使用我们的ehcache缓存实现!
目前现在用的多的缓存,是redis。



