3、MyBatis中DAO开发

来源:互联网 发布:淘宝双11营业额直播 编辑:程序博客网 时间:2024/06/06 09:42

传统的DAO开发

创建DAO接口:

public interface UserDao {    //获取所有    public List<User> getAll();    //模糊查询    public List<User> getLikeByName(String str);    //删除    public void deleteById(int id);    //修改    public void update(User user);    //添加    public int insert(User user);}

创建实现类:

public class UserDaoImpl implements UserDao{    private SqlSessionFactory sqlSessionFactory = null;    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){        this.sqlSessionFactory = sqlSessionFactory;    }    @Override    public List<User> getAll() {        SqlSession session = this.sqlSessionFactory.openSession();        List<User> list = session.selectList("getAll");        session.commit();        session.close();        return list;    }    @Override    public List<User> getLikeByName(String str) {        SqlSession session = this.sqlSessionFactory.openSession();        List<User> list = session.selectList("getLikeByName", str);        session.commit();        session.close();        return list;    }    @Override    public void deleteById(int id) {        SqlSession session = this.sqlSessionFactory.openSession();        session.delete("deleteUserById", id);        session.commit();        session.close();    }    @Override    public void update(User user) {        SqlSession session = this.sqlSessionFactory.openSession();        session.update("updateUser", user);        session.commit();        session.close();    }    @Override    public int insert(User user) {        SqlSession session = this.sqlSessionFactory.openSession();        session.insert("insertUser", user);        session.commit();        session.close();        return user.getId();    }}

在传统的DAO开发中有许多重复性的代码,并且要指定执行的statement的id,这很繁琐。


MyBatis使用Mapper动态代理方式

我们只需要写一个mapper接口(相当于DAO接口)就可以进行和上面一样的操作了,当然,这肯定是要遵循一定的规定的。

4点:

1. mapper.xml文件中namespace与mapper接口的类路径相同;
2. Mapper接口的方法名和Mapper.xml中定义的statement的id相同;
3. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同;
4. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同。

UserMapper.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="cn.xpu.hcp.bean.UserMapper">    <select id="getUserById" parameterType="int" resultType="cn.xpu.hcp.bean.User">        select * from user where id = #{id}    </select>    <!-- 查询所有 -->    <select id="getAll" resultType="cn.xpu.hcp.bean.User">        select * from user    </select>    <!-- 模糊查询 -->    <select id="getLikeByName" parameterType="string" resultType="cn.xpu.hcp.bean.User">         select * from user where username like "%"#{value}"%"    </select>    <!-- 添加 -->    <insert id="insertUser" parameterType="cn.xpu.hcp.bean.User">        <!-- selectKey 标签实现主键的返回            keyColumn:主键对应表中列名            keyProperty:主键对应类中的属性名            order:设置在执行insert语句之前还是之后查询id,这里选择之后         -->        <selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">            SELECT LAST_INSERT_ID()        </selectKey>        insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})    </insert>    <!-- 更新 -->    <update id="updateUser" parameterType="cn.xpu.hcp.bean.User">        update user set username=#{username},birthday = #{birthday},sex = #{sex},address = #{address} WHERE id=#{id}    </update>    <!-- 删除 -->    <delete id="deleteUserById" parameterType="int">         DELETE FROM USER WHERE id = #{id}    </delete></mapper>

UserMapper接口:

public interface UserMapper {    public User getUserById(int id);    public List<User> getAll();    public List<User> getLikeByName(String str);    public void insertUser(User user);    public void updateUser(User user);    public void deleteUserById(int id);}

仔细检查,符合上面的4个要求。
测试代码的编写:

@Testpublic void MapperTest(){    SqlSession session = sqlSessionFactory.openSession();    UserMapper mapper = session.getMapper(UserMapper.class);    List<User> list = mapper.getAll();    for(User user:list){        System.out.println(user);    }    session.close();}

测试成功:
这里写图片描述

原创粉丝点击