欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis Dao层的编写

程序员文章站 2022-03-21 17:12:13
传统的dao层编写 以前编写dao层,先新建一个包com.chy.dao,再写接口StudentDao: public interface StudentDao { public void insertStudent(Student student); public void updateStude ......

 

传统的dao层编写

以前编写dao层,先新建一个包com.chy.dao,再写接口studentdao:

public interface studentdao {
    public void insertstudent(student student);

    public void updatestudent(student student, integer id);

    public student selectstudent(integer id);
}

 

接着写实现类studentdaoimpl:

public class studentdaoimpl implements studentdao {
    @override
    public void insertstudent(student student) {

    }

    @override
    public void updatestudent(student student, integer id) {

    }

    @override
    public student selectstudent(integer id) {
        return null;
    }
}

 

 


 

 

 

mybatis的dao层编写

mybatis不这样编写dao。mybatis的dao由2部分组成:映射文件、映射文件对应的接口。

 

新建一个包com.chy.mapper,包下新建接口studentmapper:

public interface studentmapper {
    public void insertstudent(student student);

    public student selectstudent(integer id);
}

 

包下新建此接口对应的映射文件studentmapper.xml:

<?xml version="1.0" encoding="utf-8" ?>
<!doctype mapper
        public "-//mybatis.org//dtd mapper 3.0//en"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.chy.mapper.studentmapper">
    <insert id="insertstudent" parametertype="com.chy.pojo.student">
        insert into student_tb(name,age,score)values (#{name},#{age},#{score})
    </insert>

    <select id="querybyid" parametertype="integer" resulttype="student">
        select * from student_tb where id=#{id}
    </select>
</mapper>

 

  • 映射文件的文件名、namespace要与接口名相同,面向接口编程。
  • id要与接口中的方法名相同
  • 参数类型、返回值类型要与接口中的一致
  • 接口中的方法最多只能有一个参数,因为映射文件的参数类型最多只能有一个

 

MyBatis  Dao层的编写

 

mapper包相当于传统方式的dao包,映射文件相当于接口的实现类。

 

 


 

 

 

mybatis dao层的使用

在mybatis全局配置文件中引入映射文件。

     inputstream inputstream = resources.getresourceasstream("mybatis-config.xml");
        sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream);
        sqlsession sqlsession=sqlsessionfactory.opensession();

        //通过mapper来调用接口中的方法,操作数据库
        //参数是mapper接口类的class对象
        studentmapper mapper = sqlsession.getmapper(studentmapper.class);

        //插入
        student student1 = new student();
        student1.setname("chy");
        mapper.insertstudent(student1);

        //查询
        student student2 = mapper.querybyid(1);
        system.out.println(student2);

        sqlsession.commit();
        sqlsession.close();

 

 


 

 

 

传入包装类型的参数

有时候我们需要传入多个参数,比如

  • 查询age>20、score>90的学生,需要传入2个integer型的参数
  • 查询某本书在这一周的销量,需要传入一个pojo类:book,还需要传入一个参数表示这一周以内。
  • 要查询某用户购买某辆汽车的订单信息,需要传入2个pojo类:user、car

这种传入多个参数的情况在复杂的条件查询中比较常见,尤其是多表查询。

 

mybatis最多只能传入一个参数,怎么办?

可以把要传入的参数包装一下,放在一个包装类中,传入包装类即可

 

 

新建包com.chy.vo,包下新建包装类userqueryvo,将要传入的参数写为成员变量,并提供getter、setter方法:

public class userqueryvo {
    private user user;
    private car car;

    public user getuser() {
        return user;
    }

    public void setuser(user user) {
        this.user = user;
    }

    public car getcar() {
        return car;
    }

    public void setcar(car car) {
        this.car = car;
    }
}

vo:value object  值对象

po:persist object   持久化对象,与数据表对应。

pojo:plain ordinary java object  简单的java对象

 

 

在com.chy.mapper包下新建usermapper接口,编写对应的映射文件实现数据库操作。

public interface usermapper {
    public order queryorder(userqueryvo vo);
}
<mapper namespace="com.chy.mapper.usermapper">
    <select id="queryorder" parametertype="com.chy.vo.userqueryvo" resulttype="com.chy.pojo.order">
        select * from order_tb where order_tb.user_id=#{user.id} and order_tb.car_name=#{car.name}
    </select>
</mapper>

#{}中的user、car是vo的属性,这2个属性本身也是对象,可通过.来访问user、car的属性。

 

 

使用:

     inputstream inputstream = resources.getresourceasstream("mybatis-config.xml");
        sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream);
        sqlsession sqlsession=sqlsessionfactory.opensession();

        car car = new car();
        car.setname("宝马x6");

        user user = new user();
        user.setid(1);

        //要传入的包装类
        userqueryvo vo = new userqueryvo();
        vo.setcar(car);
        vo.setuser(user);


        usermapper mapper = sqlsession.getmapper(usermapper.class);
        //传入包装类进行查询
        order order = mapper.queryorder(vo);
        system.out.println(order);

 

 


 

 

 

使用map传入多个参数

除了可以使用包装类传入多个参数,也可以使用map传入多个参数。

 

mapper接口:

public interface usermapper {
    public order queryorder(map<string,object> map);
}

这个是mapper接口,所以参数通常写接口,不写具体的实现类,让耦合是接口层次的。

要传入的参数的数据类型不同,写成object。

 

 

映射文件:

<mapper namespace="com.chy.mapper.usermapper">
    <select id="queryorder" parametertype="hashmap" resulttype="com.chy.pojo.order">
        select * from order_tb where order_tb.user_id=#{user.id} and order_tb.car_name=#{car.name}
    </select>
</mapper>

#{}中的user、car是map的key,得到对应的value(对象),再通过.获取属性值。

 

 

使用:

     inputstream inputstream = resources.getresourceasstream("mybatis-config.xml");
        sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream);
        sqlsession sqlsession=sqlsessionfactory.opensession();

        car car = new car();
        car.setname("宝马x6");

        user user = new user();
        user.setid(1);

        //要传入的包装类
        hashmap<string,object> map = new hashmap<>();
        map.put("car", car);
        map.put("user", user);

        usermapper mapper = sqlsession.getmapper(usermapper.class);
        //传入map进行查询
        order order = mapper.queryorder(map);
        system.out.println(order);

 

与使用包装类传入多个参数相比,使用map不需要创建vo类,更加简单。