Mybatis的基础使用方法
普通的使用Mybatis框架,我总结为四个部分:
1.实体类的定义,这部分主要是为了方便参数的输入和结果的输出,也可以有别的方法代替。
2.Mapper接口的定义,这里是定义了需要使用的方法。
3.mapper.xml里SQL语句的编写,Mybatis的SQL语句需要自己写入,可以和接口结合,下面会详细介绍。
4.服务层的方法调用,这里是解决实际问题的地方,按照业务要求来调用不同方法。
1.实体类的定义
这里按照已有的数据库做数据源:定义了一个实体类StudentInfo,简单的创建get,set方法和三个构造方法。
public class StudentInfo {
private Integer id;
private Integer classId;
private String stuName;
private Integer stuGender;
private String province;
private String city;
private String district;
public StudentInfo() {
}
public StudentInfo(Integer id, Integer classId, String stuName, Integer stuGender, String province, String city, String district) {
this.id = id;
this.classId = classId;
this.stuName = stuName;
this.stuGender = stuGender;
this.province = province;
this.city = city;
this.district = district;
}
//做添加操作时的构造方法
public StudentInfo(Integer classId, String stuName, Integer stuGender, String province, String city, String district) {
this.classId = classId;
this.stuName = stuName;
this.stuGender = stuGender;
this.province = province;
this.city = city;
this.district = district;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getClassId() {
return classId;
}
public void setClassId(Integer classId) {
this.classId = classId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public Integer getStuGender() {
return stuGender;
}
public void setStuGender(Integer stuGender) {
this.stuGender = stuGender;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getDistrict() {
return district;
}
public void setDistrict(String district) {
this.district = district;
}
public StudentInfo(Integer id){
this.id = id;
}
@Override
public String toString() {
return "StudentInfo{" +
"id=" + id +
", classId=" + classId +
", stuName='" + stuName + '\'' +
", stuGender=" + stuGender +
", province='" + province + '\'' +
", city='" + city + '\'' +
", district='" + district + '\'' +
'}';
}
}
2.Mapper接口的定义
先创建好实体类是为了方便在接口中直接使用。首先在接口中定义一个查询所有表中数据的方法:
List<StudentInfo> findAll();
然后再在xml文件中编写SQL语句,但是Mybatis有一个比较方便的地方,在SQL语句比较简单的时候可以直接在接口方法上使用注解来写SQL语句。
常用的SQL注解:
@Select:查询,@Insert:添加,@delete:删除,@Update:修改。
但是使用注解有一定的限制:必须是简单的SQL语句,不能有循环(mybatis框架在xml中编写SQL语句可以用到循环),判断。和一些复杂的语句。
具体的使用方法;
@Select("select * from studentinfo")
List<StudentInfo> findAll();
@Delete("delete from studentinfo where id=#{id}")
int deleteAll(int id);
复杂的方法,如更新信息:
int modify(StudentInfo score);
这种直接使用注解不太可行就要到xml文件中编写。
3.xml文件中SQL语句的定义
xml文件创建的相关事项在上一篇博客中已经介绍过了,这里就直接使用。
在编写SQL语句之前首先要介绍一下,这里常用的一些标签,他们都有一些特定的功能:
select标签
<select id =”Mapper接口方法名称” resultType=”返回自定义类型”/resultMap=””>...</select>
特别的:当数据库字段名称,类型和java实体类的属性名称,类型不匹配时需要使用resultMap,将数据库和java连起来,一般在编写java语句时就要尽量避免这种情况的发生
常用的增删改标签:
<insert id=”Mapper接口中方法名称”>...</insert>
<delete id=”Mapper接口中方法名称”>...</delete >
<update id=”Mapper接口中方法名称”>...</update >
循环标签
<foreach collection=”array list map” item = “alias” open=”开始符号” close=”结束符号” seperator = “分隔符”>...</foreach>
条件的where标签
<where></where> 去掉第一个and,以 where代替
赋值和判断标签
<set></set> 去掉最后一个“,”
<if test”null!= field”>...</if>判断标签,一般和set会结合使用
下面介绍一下具体的使用方法,首先是简单的SQL语句:
<select id="findAll">//这里的id必须是和接口方法名一致!
select * from studentinfo
</select>
复杂的SQL语句:更新数据:
<update id="modify">//id与接口方法名一致
update studentinfo
<set>
<if test="null!=classId">
//判断更新的数据中,该属性有没有被修改,如果有才会执行下面的操作
classId=#{classId},//将给的数据赋值给该属性,完成修改
</if>
<if test="null!=stuName">
stuName=#{stuName},
</if>
<if test="null!=stuGender">
stuGender=#{stuGender},
</if>
<if test="null!=province">
province=#{province},
</if>
<if test="null!=city">
city=#{city},
</if>
<if test="null!=district">
district=#{district},
</if>
</set>
where
//(where和set标签都是可以不用使用标签的,但使用标签的话会运用到标签的一些特性。上面唷介绍过)
id=#{id}
</update>
4.服务层的方法调用
服务层就是直接调用接口中的方法来解决实际的问题
这里就使用单元测试来完成简单的调用:
首先在使用之前要创建一个Mapper对象来完成调用前的配置:
private VStuScoreMapper mapper;//设置为全局变量
@Before//在所有test方法运行前执行该方法
public void init() throws IOException {
InputStream config = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(config);
SqlSession sqlSession = build.openSession(true);
mapper = sqlSession.getMapper(VStuScoreMapper.class);
}
查询所有数据的方法的调用:
@Test
public void testFindAll() throws IOException{
List<StudentInfo> list = mapper.findAll();
for (StudentInfo vss : list) {
System.out.println(vss);
}
}
修改的方法:
@Test
public void testUpdate(){
int add = mapper.modify(
new StudentInfo(91,5,"牛一一",2,"安徽省","合肥市","经开区"));
System.out.println(add);
}
mybatis还有很多更高阶的使用方法,比如存储过程和事务的使用,这以后有机会再介绍。