一.初始的加载
1.操作步骤
1.定义一个接口
public interface UserMapperDao // 接口
2.给接口里面放一个类型各种不同的类型
public interface UserMapperDao { // 接口 int insertUser(); User idUserSelect(int id); User checkLoginByMap(Map
3.在自定义的类里面调用他
UserMapperDao dao = DaoXML.Dao(UserMapperDao.class); int insertUser = dao.insertUser(); //插入
2.定义MyBatis配置文件的加载代码
public static
二.对于各种不同的类型接口的定义
1.常用的名称作用
查询语句 |
||
名称 |
作用 |
|
id |
对应的接口名称 不可以随便写 |
User From(User user); |
resultType |
返回的类型 如图返回的是User |
|
select |
代表是 查询 |
|
resultMap 自定义类型 |
||
resultMap |
返回自定义类型,通过自定义的 这个元素对应的数据 |
|
这个里面放的是自定义类型的数据 里面的id代表到时查询语句"xx"对应的数据类型 |
||
type="Password" |
代表了返回的数据类型 |
|
里面有两个参数property和column 对应的是 类的属性和数据库的字段对应关系 |
||
property |
类的属性 |
|
column |
数据库字段名 |
|
property="psd.key" column="key" |
代表如果是组合的话psd里面的key属性对应的数据库的key值 |
|
自定义类型 |
||
用来给类里面属性是一个类类型的属性赋值 |
|
|
property |
对应的属性值名称(不是随便写的必须是类的属性名) |
|
javaType |
属性值的类型 |
|
select |
用来调用类里面的接口获取上一个查询语句对应的值 |
|
column |
调用类的时候类对应的参数通过 {}符号分割 里面对应的属性 id=id 前一个sql查询查询到数据库中id的值 |
|
fetchType |
eager 表示在查询主实体时,同时也会查询关联实体 fetchType="lazy"表示只有在需要使用关联实体时才会进行查询 |
|
动态SQL 第一个方法 choose when otherwise 相当于 if else if else |
||
choose |
表示一个完整的 if else if 标签 |
|
when |
后面跟着的只要有一个满足后面的就不满足了 相当于else if |
|
otherwise |
如果条件都不满足相当于else |
|
where |
相当于给每一个条件都添加where |
|
动态SQL 第二个方法 只有 if语句 |
||
prefix|suffix |
将trim 标签中内容前面或后面添加指定内容 |
|
suffixOverrides|prefixOverrides |
将trim标签中内容前面或者后面去掉指定内容 |
|
prefix |
在前面添加where |
|
suffix |
在后面添加指定内容 |
|
suffixOverrides |
在前面删除指定内容 去掉前缀内容 可以使用 and|or 这样子就可以匹配2个字符 |
|
prefixOverrides |
在后面删除指定内容 |
|
test |
判断条件 |
|
多条件删除 collection 表示名称 item 当前数组中的每一个元素 名称可以随便写 separator 分隔符 open 以什么 "(" 开始 close 以什么 ")" 结束 |
||
collection |
表示放入的属性名 |
|
item |
当前数组中的每一个元素 名称可以随便写 |
|
separator |
分隔符 用来添加每一个相隔开 |
|
open |
以什么 "(" 开始 |
|
close |
以什么 ")" 结束 |
|
parameterType |
设置传输进来的类型 |
|
用来别名设置的注解 |
||
@Param("id") |
代表了里面的数据类型到时在调用查询语句的时候可以取的名字 |
Map FromMapSSS(@Param("id") int id) select * from t_user where id=#{id}; |
防止SQL注入 # $ 两符号 |
||
#{username} |
带$号代表了他是一个写什么传输什么的,不能防止sql语句注入(不推荐) |
username=#{username} username=${username} |
${username} |
可以用来防止sql语句注入 |
|
Sql片段 sql语句片段 可以直接用来引用 使用 方法来放入 |
||
id |
如果需要引入设置的名称 |
|
sql |
sql语句片段 |
|
其他 |
||
parameterType |
是传进来的类型 |
方法参数类型。 |
resultType |
传出去的类型 |
方法的返回类型 |
2.对于基本类型
对应的接口: User From(User user); 这里面的
二级缓存
1.开启二级缓存在对应的 resources工程文件里面添加
1. 缓存的话 先查二级缓存 如果二级缓存没有的话 就去查一级 如果一级也没有就去查数据库
2. 第一级缓存相当于 SqlSession级别(不同接口不同缓存)
3. 第二及缓存相当于 SqlSessionFactory(不同接口相同同缓存)
二级缓存比上一级缓存好的地方是在于他是SqlSessionFactory(对于所有 的class文件 的 )
使用必须
1. 设置 标签
2.关闭或提交之后才有效
3. 使用接口
使用二级缓存必须实现 Serializable 接口 在对应的Modio层
public class Password implements Serializable {}
对应的二级换成代码
// 第一级缓存相当于 SqlSession级别(不同接口不同缓存) 第二及缓存相当于 SqlSessionFactory(不同接口相同同缓存) SqlSessionFactory factory = DaoXML.Dao二级缓存(); SqlSession sql = factory.openSession(true); //启动会话 可以设置是否自动提交 SqlSession sql2= factory.openSession(true); //启动会话 可以设置是否自动提交 //调用缓存接口 二级缓存 dao = sql.getMapper(二级缓存.class); 二级缓存 dao2 = sql2.getMapper(二级缓存.class); // session.clearCache(); //提交 // -------------使用第一个-------------------------- Password select = dao.Select(1); //查询模拟 缓存 System.out.println(select+"\n\n"); // sql.clearCache(); //清除缓存 sql.close(); //关闭接口 这样子才可以进行二级缓存 Password select3 = dao2.Select(1); //查询模拟 使用不同的接口的缓存测试 System.out.println(select3+"\n\n"); dao2.Update(1);//修改模拟 这样子就会让二级缓存失效 System.out.println("\n\n"); Password select2 = dao2.Select(1); //查询模拟 测试在重新插入之后发现二级缓存失效了(因为增删改会让二级缓存失效) System.out.println(select2+"\n\n"); sql2.close(); //关闭当前接口 结束生命周期
mybatis-config.xml 配置文件解析
引入配置文件
用来引入配置文件 账号密码 和连接串
开启驼峰法
开启自动开启驼峰法 用来匹配数据库的大小写用 _ 代表要大写
类型别名
以包为单位 设置类型别名 非常有用呀 !
1.但是不区分大小写所以要注意一点(如 User 和user 这2个类当成相同的)
2.在 这里面的 resultType使用
Mysql连接
< environment 配置某个具体的环境
id:表示连接数据库的环境的唯一标识 不能重复
JDBC:表示当前环境中 ,执行sql语句的是JDBC原生的事物管理方式,事物的提交和回滚需要手 动 来处理
MANAGED 被管理,比如用spring管理
type 设置数据源的类型
type="POOLED UNPOOLED JNDI"
POOLED:表示使用数据库连接池来缓存数据库连接
UNPOOLED:表示不使用数据库连接池
JNDI :使用上下文中的数据源
name="driver" 连接
name="url" 连接串
name="username" 账号
name="password" 密码
引入配置文件!!非常好用
引入name 包下面所有的配置文件 有了这个就不需要每一次写一个 接口层都要来这里添加一条了
教程:
记录一下解决循环但是里面没有值的问题
记录的是