在mybatis中可以使用SqlSession封装的一些方法可以完成crud操作,但是SqlSession封装的方法,传递的参数statement, 传递占位符的参数只能传递一个。而且他的方法名称都是固定。而真实在开发环境下我们不使用SqlSession封装的方法,而是习惯自己定义方法,自己调用自己的方法。
并且mybatis可以将查询出来的数据,按照对应的属性名字,封装到定义好的实现类中,更加方便的完成查询操作。
一、如何实现: 1、创建实现类:@Data //lomkox注释 get set方法以及toString 等方法
@AllArgsConstructor //所有属性的构造方法
@NoArgsConstructor //无参数的构造方法
public class User {
private int id;
private String name;
private String email;
}
2、创建对应的dao接口
public interface UserDao {
public List findAll();
}
3、编写对应的xml文件
mapper的namespace属性必须是dao接口的文件位置,必须和到相同,这样才能将自己编写的dao接口在xml中完成配置,一致下面的sql操作是自己的dao接口中的方法。
各操作标签中的id属性值,必须是和dao接口中的方法名一致,不然找不到方法名,就相当于没有实现接口中的方法,在使用是会报错。
4、在全局的xml文件中注册映射文件select * from tb_user
5、测试方法
@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();
}
总结:这种使用mybatis的方法,更加符合在企业开发中的应用,应为在实际应用中,不可能每个方法他的参数都是一个,并且在多个值时,不可能每次都封装成一个对象去实现传值。使用这种开发模式,更加方便也更加实用。
二、传递多个参数在开发中,dao层的方法中会有传递多个参数的方法,例如登录方法、多条件查询等方法,我们要传递多个值。当然我们可以在方法中传递多个参数,要注意的是,在xml中调用多个参数时,#{参数名},这种方式已经不能使用了,因为mybatis在进行多个值传递时,会自动的将变量名字换成param1、param2...表示参数1、参数2...。这样在使用时不够方便,不够见名知意。所在在传递多个参数时,我们在参数前面使用@Param("参数名"),来为参数加上默认变量名,这样在xml中使用时就可以使用我们设置好的参数名。
三、如何在添加操作时返回自动递增的主键insert标签中有着useGeneratedKeys属性,值为true或false。true为使用返回自动生成的主键。默认为false,keyProperty属性是要将这个字段的值,赋值给实体类中的哪个属性。
insert into tb_user values(null,#{name},#{address})
四、解决列名和属性名不一致。
当我们实体类中的属性名与数据库表中的字段名不一致时,我们在执行查询方法时,这个属性会得到null,应为mybatis没有找到与之对应的属性名,意思就是我们知道哪一个值赋给哪一个属性,但是程序不知道,我们要给他们指定好,这样程序在执行时,就算字段与属性不同,通过我们的指定也可应找到对应的属性,将值赋给对应属性。
第一种方法:为字段起别名,让他和我们的实体类中的名字一样。缺点就是字段多的情况下会导致sql很长。
第二种: 使用resultMap完成列和属性之间的映射关系。column是数据库的字段名,property是实体类中的属性名。要注意在select标签中的resultMap属性和resultType属性只能存在一个。



