Mybatis - Dao层开发(02)

原始模式开发的弊端

在原始Dao开发中,我们一般需要写接口、实现类和sqlmap配置文件。但是在实现类中,我们发现其实有很多都是重复代码,比如虽然工厂是单例,可以提取到属性,但是sqlSession之后都是大同小异,所以Mybatis提供了动态代理开发技术让我们能只写接口,不写实现类而产生动态生成实现对象。

动态代理开发

动态代理开发有四个需要遵循的原则:

  • 接口方法名 == sqlMap.xml中的id名;
  • 返回值类型与sqlMap.xml文件中返回值一致;
  • 方法的参数与sqlMap.xml文件中参数一致;
  • sqlMap.xml命名空间是接口的全包名。
import java.util.List;

import com.pojo.User;

public interface UserDao {
    public User findUserById(Integer i);
    public List<User>findUsersByName(String name);
    public Long insert(User user);
    public Long updateUser(User user);
    public Long delete(Integer i);
}
<!-- 命名空间,当不同的sqlMap文件中存在id相同的sql语句时,使用命名空间能给他们区分开来 
      设置和接口一致,让Mybatis帮我们动态生成对象   -->
<mapper namespace="com.firstday.UserDao">
    <!-- 通过ID查询一个用户 -->
    <!-- 自动映射的前提是pojo中的属性名和表的字段名完全一致 -->
    <select id="findUserById" parameterType="Integer" resultType="com.pojo.User">
        select * from user where id = #{a}
    </select>

    <!-- 占位符
        #{}  类似于JBDC的占位符,比如上面的sql语句,传入Integer10时,它就是把Integer10填在占位符的位置
              如果是String10,就是把String10填在里面。里面的参数可以随便填,但不能为空。

        ${}     字符串拼接,如下面的sql语句,传入"五",最终注入数据库的是"%五%"。里面的参数只能写value

        #{}  占位符实现字符串拼接,"%${value}%" <==> "%"#{v}"%"
     -->
    <select id="findUsersByName" parameterType="String" resultType="com.pojo.User">
        select * from user where username like "%${value}%"
    </select>

    <!-- 这里的 #{} 参数不能再随便写了,需要取出来User里的属性-->
    <insert id="insert" parameterType="com.pojo.User">
        <!-- 返回最新插入的id,底层是mysql提供 -->
        <!-- Integer类型,自增长是先保存数据再生成ID,比如uuid,会先生成ID,再保存数据 -->
        <selectKey keyProperty="id" resultType="Integer" order="AFTER">
            select LAST_INSERT_ID()
        </selectKey>
        insert into user(username, sex, birthday, address) 
            values(#{username}, #{sex}, #{birthday}, #{address});
    </insert>

    <update id="updateUser" parameterType="com.pojo.User">
        update user
        set username = #{username}, sex = #{sex}, birthday = #{birthday}, address = #{address}
        where id = #{id}
    </update>

    <update id="delete" parameterType="Integer">
        delete from user where id = #{aaa}
    </update>
</mapper>
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.pojo.User;

public class TestAdvanced {
    public static void main(String[] args) throws Exception {

        //1、加载核心配置文件
        String coreXml = "sqlMapConfig.xml";
        InputStream in = Resources.getResourceAsStream(coreXml);
        //2、创建工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //3、获得sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //4、获取sqlSession对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);

        //查询:返回单个对象
        User user = userDao.findUserById(1);
        System.out.println(user);

        //查询:返回集合
        List<User> list = userDao.findUsersByName("五");
        System.out.println(list);

        //删除
//      Long delete = userDao.delete(26);
//      sqlSession.commit();

        //插入
//      User newUser = new User("helloworld", "2", new Date(), "aaaaaa");
//      Long insert = userDao.insert(newUser);
//      sqlSession.commit();

        //更新
        User newUser = new User("helloworld", "2", new Date(), "aaaaaa");
        newUser.setId(16);
        Long updateUser = userDao.updateUser(newUser);
        sqlSession.commit();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值