目录
1.多表查询
1.1多对一
(1)第一种方式 通过链表查询。
(2)第二种方式 通过嵌套查询。----两次查询。
1.2 一对多
2.动态SQL
(1)if和where一起用
(2)[choose when otherwise] 和where
(3)set标签---修改部分字段
(4) foreach 批量处理
1.多表查询
1.1多对一 例子: 根据学生id查询学生信息与班级信息
(1)第一种方式 通过链表查询。
1. 创建两张具有逻辑外键或物理外键的数据表
班级表:
文章图片
文章图片
学生表:
文章图片
文章图片
2. 常见数据表对应的实体类
班级实体类:
public class Cls {
private Integer id;
private String cname;
public Cls() {
}public Cls(Integer id, String cname) {
this.id = id;
this.cname = cname;
}public Integer getId() {
return id;
}public void setId(Integer id) {
this.id = id;
}public String getCname() {
return cname;
}public void setCname(String cname) {
this.cname = cname;
}@Override
public String toString() {
return "Cls{" +
"id=" + id +
", cname='" + cname + '\'' +
'}';
}
}
学生实体类:
public class Stu {
private Integer id;
private String name;
private String classid;
//学生类里面需要创建一个班级类的实体类!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
private Cls cls;
public Stu() {
}public Stu(Integer id, String name, String classid, Cls cls) {
this.id = id;
this.name = name;
this.classid = classid;
this.cls = cls;
}public Integer getId() {
return id;
}public void setId(Integer id) {
this.id = id;
}public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public String getClassid() {
return classid;
}public void setClassid(String classid) {
this.classid = classid;
}public Cls getCls() {
return cls;
}public void setCls(Cls cls) {
this.cls = cls;
}@Override
public String toString() {
return "Stu{" +
"id=" + id +
", name='" + name + '\'' +
", classid='" + classid + '\'' +
", cls=" + cls +
'}';
}
}
3.创建学生dao层接口并定义方法
public interface StuDao {
Stu selectstuandclassbystuid(int id);
}
4.在映射文件中写对应的dao接口方法中的sql语句
select * from stu s join class c on s.uclassid=c.id where s.id = #{id}
5.在配置文件中注册映射文件并测试
注册:
测试:
@Test
public void test01() throws IOException {
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
StuDao stuDao = session.getMapper(StuDao.class);
Stu stu = stuDao.selectstuandclassbystuid(1001);
System.out.println(stu);
}
结果:
文章图片
(2)第二种方式 通过嵌套查询。----两次查询。
1.在学生映射文件中写对应的dao接口方法中的sql语句
select * fromstu where stu.id=#{id}
2.在班级映射文件中写根据班级id查找班级信息的sql语句
select id id,classname cname from class where id=#{id}
3.在配置文件中注册两张表的映射文件 并测试
注册:
测试:
@Test
public void test01()throws IOException {Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
StuDao stuDao = session.getMapper(StuDao.class);
Stu stu = stuDao.selectstuandclassbystuid(1001);
System.out.println(stu);
}
测试结果:
文章图片
文章图片
1.2 一对多 例:根据班级id查找班级信息以及班级内所有学生
1. 使用上例多对一的数据表
2.创建数据表对应的实体类
学生类:
public class Stu {
private Integer id;
private String name;
private String classid;
public Stu() {
}public Stu(Integer id, String name, String classid) {
this.id = id;
this.name = name;
this.classid = classid;
}public Integer getId() {
return id;
}public void setId(Integer id) {
this.id = id;
}public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public String getClassid() {
return classid;
}public void setClassid(String classid) {
this.classid = classid;
}@Override
public String toString() {
return "Stu{" +
"id=" + id +
", name='" + name + '\'' +
", classid='" + classid + '\'' +
'}';
}
}
班级类:
public class Cls {
private Integer id;
private String cname;
//班级中有很多学生 所以需要创建一个学生类的集合
private List stus;
public Cls() {
}public Cls(Integer id, String cname, List stus) {
this.id = id;
this.cname = cname;
this.stus = stus;
}public Integer getId() {
return id;
}public void setId(Integer id) {
this.id = id;
}public String getCname() {
return cname;
}public void setCname(String cname) {
this.cname = cname;
}public List getStus() {
return stus;
}public void setStus(List stus) {
this.stus = stus;
}@Override
public String toString() {
return "Cls{" +
"id=" + id +
", cname='" + cname + '\'' +
", stus=" + stus +
'}';
}
}
3.创建班级dao接口
public interface ClsDao {
Cls selectclassandstubyclassid(int id);
}
4.在班级表的映射文件中写dao接口方法的对应sql
select c.*,s.id sid,s.uname name,s.uclassid classid from class c join stu s on c.id = s.uclassid where c.id=#{id}
5.测试
@Test
public void test02()throws IOException{Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
ClsDao clsDao = session.getMapper(ClsDao.class);
Cls cls = clsDao.selectclassandstubyclassid(1);
System.out.println(cls);
}
测试结果:
文章图片
上述为第一种链表查询第二种嵌套查询与多对一第二种相同 略
2.动态SQL 所谓动态sql 便是sql语句根据条件而发生改变。 一般用到的方法为:
元素 | 作用 | 描述 |
if | 条件判断 | 但条件判断 |
choos(when、otherwise) | 条件选择,相当Java when | 多条件分支判断 |
where、set | 辅助 | 处理sql语句拼接问题 |
foreache | 循环 | 循环 |
首先创建一个数据表 并存入数据
文章图片
创建对应实体类与dao接口 并创建sql方法
文章图片
文章图片
(1)if和where一起用 根据 name 和sex来查询数据。如果 name 为空,那么将只根据 sex 来查询;如果 sex 也为空 则查询所有
select * from student
and s_name=#{sname}
ands_sex=#{ssex}
测试:
@Test
public void test03()throws IOException{Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
StudentDao studentDao = session.getMapper(StudentDao.class);
Map map = new HashMap();
//从网页中得到参数值 并且封装到map对象中。
map.put("sname","李云");
map.put("ssex","男");
List list = studentDao.selectbysome(map);
System.out.println(list);
}
文章图片
(2)[choose when otherwise] 和where 根据 name和 sex 来查询数据 若name有数据则之按照name查询 若name没数据 则按照sex查询 若sex也没数据则查询id为1的学生
select * from student
and s_name=#{name}
and s_sex=#{sex}
s_id=1
测试:
@Test
public void test05()throws IOException{Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
StudentDao studentDao = session.getMapper(StudentDao.class);
Map map = new HashMap();
//从网页中得到参数值 并且封装到map对象中。
map.put("sex","男");
List list = studentDao.selectbysexorname(map);
System.out.println(list);
}
文章图片
(3)set标签---修改部分字段 在 UPDATE更新列中使用if标签 有时候我们不希望更新所有的字段, 只更新有变化的字段
update student
s_name=#{name},
s_birth=#{birth}
s_sex=#{sex}
where s_id = #{id}
测试:
@Test
public void test04()throws IOException{Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
StudentDao studentDao = session.getMapper(StudentDao.class);
Map map = new HashMap();
//从网页中得到参数值 并且封装到map对象中。
map.put("id","05");
map.put("name","哈哈");
map.put("sex","男");
int i = studentDao.updateall(map);
System.out.println("受影响的行数:"+i);
session.commit();
}
文章图片
(4) foreach 批量处理 查询id=01,02,03,04的学生。
select * from student where s_id in
#{tid}
测试:
@Test
public void test06()throws IOException{Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
StudentDao studentDao = session.getMapper(StudentDao.class);
int[] ids = {1,3,4};
List list = studentDao.selectbysomeid(ids);
for(Student s:list){
System.out.println(s);
}
}
文章图片
【sql|MyBatis框架----多表查询与动态sql】最后,mybatis框架的基本使用到此结束,感谢浏览 ^_^
推荐阅读
- 数据库的分组数据
- mysql|SQL(面试实战05)
- mysql|SQL(面试实战03)
- spring+mybatis启动NoClassDefFoundError异常分析三部曲之二(定位错误)
- 编程选择|Java结构化数据处理开源库SPL
- spring+mybatis启动NoClassDefFoundError异常分析三部曲之一(稳定重现问题)
- Java|史上最全Java学习内容
- Windows下搭建SVN服务器并配置eclipse和idea
- 读书笔记|读书笔记 之《软件架构设计: 大型网站技术架构与业务架构融合之道》