@Data //set和get方法以及toString方法
@NoArgsConstructor //无参构造方法
@AllArgsConstructor //所有参数的构造方法
public class User {
private int userid;
private String username;
private String realname;
}
5、 使用mybatis完成crud(查增改删)
xml:
测试:
public class Test01 {
//查询所有
@Test
public void testFindAll()throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader);
SqlSession session=factory.openSession();
List users = session.selectList("com.user.findAll");
System.out.println(users);
session.commit();//必须提交
session.close();
}
//修改
@Test
public void testUpdate()throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader);
SqlSession session=factory.openSession();
User user=new User(8,"lm","黎明");
int row = session.update("com.user.update", user);
System.out.println(row);
session.commit();//必须提交
session.close();
}
//删除
@Test
public void testDelete()throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader);
SqlSession session=factory.openSession();
int row = session.delete("com.user.delete", 1);
System.out.println(row);
session.commit();//必须提交
session.close();
}
//测试添加
@Test
public void testAdd() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader);
SqlSession session=factory.openSession();
User user=new User();
user.setUsername("xxn");
user.setRealname("小仙女");
int row = session.insert("com.user.add", user);
System.out.println(row);
session.commit();//必须提交
session.close();
}
}
public interface UserDao {
//查询所有
public List findAll();
}
(2)创建映射文件
select * from tb_user
注意: namespace必须和dao接口一样,而且标签的id必须和你接口的方法名一样
(3)测试
@Test
public void testFindAll() throws Exception{
Reader resourceAsReader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(resourceAsReader);
SqlSession session=factory.openSession();
//获取相应接口的代理对象
UserDao userDao=session.getMapper(UserDao.class);
List list = userDao.findAll();
System.out.println(list);
session.commit();
session.close();
}
7.2 安装mybatis插件
作用: 检查dao和映射文件是否匹配
8、传递多个参数
我们在dao接口中某些方法可能需要传递多个参数,例如: 登录(ame,pwd)
我们需要在参数处使用@Param()为参数起名
9、添加时如何返回递增的主键值
insert into tb_user values(null,#{name},#{pwd})
//需要返回添加数据库后的id值
10、解决列名和属性名不一致
问题: 查询时返回一个null,或者某个列没有值
可以有两种解决办法:
(1)为查询的列起别名,而别名和属性名一致
select stu_id id,stu_name name,stu_age age from tb_stu where stu_id=#{id}
第二种: 使用resultMap完成列和属性之间的映射关系
select * from tb_stu where stu_id=#{id}
如果列名和属性名有些一致的,可以在resultMap中不写映射关系
11、动态sql
11.1什么是动态sql:根据参数的值,判断sql的条件
name!=null address
select * from 表名 where name=#{name} and address=#{address}
name==null
select * from 表名.
11.2mybatis中动态sql标签有哪些
元素
作用
描述
if
条件判断
单条件判断
choose(when、otherwise)
条件选择、相当java when
多条件分支判断
where、set
辅助
处理sql语句拼接问题
foreache
循环
循环
11.3 if标签--单条件判断
//如果name不为null则按照name查询 如果为null则查询所有
public List findByCondition(@Param("name")String name,@Param("money") Double money);
select * from account where 1=1
and name=#{name}
and money=#{money}
11.4 choose标签 多条件分支判断
select * from account where 1=1
and name=#{name}
and money=#{money}
and isdeleted=0
11.5 where标签
select * from account
and name=#{name}
and money=#{money}
11.6set标签
这个配合if标签一起用,一般用在修改语句;如果传递的参数值为null,那么应该不修改该列的值
update account
name=#{name},
money=#{money},
isdeleted=#{isdeleted},
created=#{created},
updated=#{updated},
where id=#{id}
11.7foreach标签(循环标签 )
查询:
select * from account where id in
#{id}
删除:
#{id}
添加:
insert into account(name,isdeleted) values
(#{acc.name},#{acc.isdeleted})
12、mybatis映射文件处理特殊字符
#{min} and id <#{max}]]>
13、mybatis完成模糊查询
(1)使用字符串函数 完成拼接 concat
select * from account where name like concat('%',#{name},'%')
(2) 使用${}
select * from account where name like '%${name}%'
14、联表查询
多对一 : 从多的一方来查询一的一方
例如:班级表和学生表
根据学生id查询学生信息并携带班级信息
select * from tb_stu s join tb_class c on s.class_id=c.cid where stu_id=1
实体类:
学生表:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private int id;
private String name;
private int age;
private String sex;
private Integer classId;
private Clazz clazz;//学生所属的班级
}
班级表:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Clazz {
private Integer cid;
private String cname;
}
xml:
select * from tb_stu s join tb_class c on s.class_id=c.cid where stu_id=#{id}