在xml导入以下的约束,可以在mybatis文档中找到
3.根据提示完成以下配置
4 按照规范来建包,mvc模式,创建以mapper为结尾的包,建立一个实体类名+Mapper.xml,这里为了方便直接把实体类Flower放入了mapper里,正常来说是放在com.liuyi.pojo里
FlowerMapper.xml导入mybatis约束,文档内可找到
要在Mybatis.xml中加入一句话导入
5 FlowerMapper.xml中是写上需要的方法
resultType写上具体返回值类型,没有给实体类起别名的话就要写全路径,com.liyi.mapper.Flower
6 测试方法,只在单独使用mybatis时使用
package com.liuyi.mapper;
import java.io.*;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class test {
public static void main(String[] args) throws IOException {
//先通过流读取文件
InputStream is=Resources.getResourceAsStream("Mybatis.xml");
//通过工厂创建对象
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
//打开session
SqlSession session=factory.openSession();
//查询多行selectList,根据xml里面写的 id=a.b,方法名是selAll
List list=session.selectList("a.b.selAll");
for (Flower flower : list) {
System.out.println("这是多行的查询");
System.out.println(flower.toString());
}
//在xml文件里面,按之前方式定义还可以这样来查
//查询单个数单个结果的selectOne
int i=session.selectOne("a.b.selById");
System.out.println("这是单个的查询"+i);
//查询map
Map
7 多参数查询在 XXXMapper.xml中,如果方法中有参数则用到parameterType属性
使用#{}在sql语句中获取参数,多个参数时就是#{0},#{1},#{2}这样
或者#{param1},#{param2}
如果参数是对象可这样#{属性名}
如果是map,写成这样#{key}
因为现在还没有整合 Spring框架,传入多参数会很麻烦,可以使用map
int pageSize = 2;
int pageNumber = 2;
Map map = new HashMap<>();
map.put("pageSize", pageSize);
map.put("pageStart", pageSize*(pageNumber-1));
List p =session.selectList("a.b.page",map);
8 给类起别名,一般是在com.liuyi.pojo实体类起别名,直接在mybatis.xml下加入这个就行了,给类起的别名就是类名,可以减少XXXMapper.xml复杂,
以下两个相等
在mybatis中默认是不提交事务的,所以要自己来提交 session.commit();提交,也可以设置自动提交事务
session.AutoCommit(true);出现异常时用session.rollback();回滚事务
新增
insert into people values(default,#{name},#{age})
People people =new People();
people.setName("666");
people.setAge(16);
int index=session.Insert("a.b.ins",people);
if(index>0)
{
System.out.println("成功");
}else{
session.rollback();
}
session.commit();
删除
delete from people where id = #{0}
int del = session.delete("a.b
if(del>0){
System.out.println("成功")
}else{
System.out.println("失败");
}
session.commit();
修改
update people set name = #{name} where id = #{id}
People peo = new People();
peo.setId(3);
peo.setName("王五");
int index = session.update("a
if(index>0){
System.out.println("成功")
}else{
System.out.println("失败")
}
session.commit();
普通方式
接口下定义方法
List selByAccInAccout(String id,String name);
xml中这样写
采用注释方式
接口下定义方法
List selByAccInAccout(@param("id") String id,@param("name") String name);
xml中这样写,这里的#{}里面输入的是@param("")里面的内容
就是动态的sql语句,可以加上逻辑判断之类的,可以减少xml代码量
以下的写法表示按条件查询,如果没有参数id或者name的话就直接查询所有,有id和name的判断,有其中一个值就查
1 使用where时,内容最前面是and的话,把and删除
2 where中有内容才会生成where关键字,没有where就不会
1这三个要配合一起用,意思是选择,这几个标签只会有一个生效,以下为例子,如果id不为null或''的话,执行的就只有select * from people where id=?,
update people
id=#{id},
name=#{name},
where id=#{id}
prefix在前面加点东西
prefixOverrides去掉前面一点东西
suffix在后面加点东西
suffixOverrides后面删除一点东西
下面的例子中前面加了set后面去掉了逗号就是一个完整的修改了
update people
a=a,
where id=#{id}
可以给参数重新赋值,可以在前面加点东西,后面加点东西,通常用在模糊查询中
例子中接收了参数name,用bind重新赋值为%name%,就可以进行模糊查询
通常使用在select * from table where id in();
传入了一个集合,就会在里面遍历,open遍历前加东西,close遍历后加东西,separator每次循环加一个东西
形成这样的语句select * from people where id in(?,?,?,?)
对于某些需要重复使用的代码块
形成以下句子select id,name from people
学生表实体类,学生的tid是一个外键,对应教师表的id,学生实体类内放一个老师对象
教师mapper.xml内写一个根据id来查的方法
学生xml内写查询所有就行了
(接口绑定后还没整合spring这样来使用mapper接口方法)反射机制,MyBatisUtil封装了获取Session的方法吗,代码和之前一样
Service层手动遍历封装,较麻烦
StudentMapper smapper=session.getMapper(StudentMapper.class);
List list=smapper.selAll();
TeacherMapper tmapper=session.getMapper(TeacherMapper.class);
for (Student student : list) {
student.setTeacher(tmapper.selById(student.getTid()));
}
只能是多表联合查询,查出的列要与属性名相同
类的格式什么的与手动装配一样,这是学生内存放单个老师对象的n+1方式
使用resultMap标签,tid就是外键,这时候查询学生所有就会顺带有老师,
可以直接在Mapper接口方法上方写注解@select("")这样格式,mapper.xml可以不用写,可以简化xml文件,当方法很少的时候就不必去写Mapper.xml
7实现修改
延迟加载还要在xml配置文件内这样设置
通过以下这种方式才能实现延迟加载,也就是比如查询user就在accountMapper接口下定义selById的方法,user再调用,如果是使用resultmap方式,一个表外连接另一个表的就会一股脑全部查出来