搭建MyBatis框架

MyBatis框架

本次内容:参数形式、增删改

接口方法参数是单个

通过一个参数查询数据,参考入门案例.支持常见的简单的数据类型,(8种基本类型,String,Date等)

直接在给实参即可,且UserMapper文件中的参数用#{随意},单个参数时,内容随意

接口方法参数是多个

两种处理方案

1:接口处注解 2:sql语句中参数内容写#{param1}、#{param2}

在接口处方法处添加注解并定义参数类型,注解内容对应#{}中的内容

public interface UserMapper {
    // 注解中的参数是映射文件#{}内的值
    User findUserByLogin(@Param("username") String username, @Param("password") String password);
}

在sql语句中的参数中写#{param1}、#{param2}、… 系统会自动吧第一个参数赋值给param1,第二个参数赋值给param2,以此类推

还是推荐使用注解!!!

 <!--当接口方法的参数列表有多个参数时,此处标签中就不再设置parameterType-->
    <select id="findUserByLogin" resultType="com.qf.model.User">
        <!--
            当接口方法的参数列表有多个参数时,此处#{}内的写法
            方案一: 按照顺序写#{param1},#{param2},....
            方案二: 在接口的参数上加注解 【推荐方案】
        -->
        <!-- select * from user where username = #{param1} and password = #{param2} -->
         select * from user where username = #{username} and password = #{password}
    </select>
接口方法参数是对象类型
//接口方法
User findUserByUser(User user)
    <select id="findUserByUser" resultType="com.qf.model.User" parameterType="com.qf.model.User">
        <!--
            当参数类型是对象时,#{}内必须要是对象的属性名
         -->
        select * from user where username = #{username} and password = #{password}
    </select>	
接口方法的参数是Map
//接口方法
User findUserByLoginMap(Map<String,String> map);
    <select id="findUserByLoginMap" resultType="com.qf.model.User" parameterType="Map">
        <!--当参数是Map时,#{}内写的是Map的key-->
        select * from user where username = #{uname} and password = #{pwd}
    </select>

在test中测试一下,参数是Map集合

    /**
     * 测试参数是Map
     */
    @Test
    public void testMapParameter() throws IOException {
        // 加载配置文件,变成流
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

        // 通过流获得工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder( ).build(inputStream);

        // 通过工厂SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession( );

        // 通过SqlSession获得接口的代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);


        HashMap<String, String> map = new HashMap<String, String>( );
        map.put("uname","root");
        map.put("pwd","123456");

        // 调用方法
        User user = mapper.findUserByLoginMap(map);
        System.out.println(user);
    }
接口方法参数是List集合
//接口方法
List<User> findUserByList(List<Integer> ids);
<!--参数类型是List时,参数固定写List-->
    <select id="findUserByList" parameterType="List" resultType="User">
        select * from user where id in
        <foreach collection="list" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </select>
接口方法的返回值是List
//接口方法
List<User> findAllUser();
    <!--
        查询返回一个对象,还是List集合,resultType指定的都是要封装的实体类类型
        特别注意:不是List
      -->
    <select id="findAllUser" resultType="com.qf.model.User">
        select * from user
    </select>

删除【重要】

需求: 根据id删除数据

    int deleteUserById(int id);
    <!--
        删除使用<delete>标签
        没有resultType属性,默认返回int类型数据
    -->
    <delete id="deleteUserById" parameterType="int">
        delete from user where id = #{id}
    </delete>
        // 通过工厂SqlSession,默认是false,指定为true就会自动提交
        SqlSession sqlSession = sqlSessionFactory.openSession( true);

        // 通过SqlSession获得接口的代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        /**
         * mybatis在执行增,删,改的时候默认开启事务,但是没有自动提交
         * 如果在获得SqlSession时,指定了开启自动提交,那么执行增删改时就会自动提交
         */
        int i = mapper.deleteUserById(46);

        System.out.println(i );

        // 没有自动提交事务,就需要手动提交
        // sqlSession.commit();

更新【重要】

需求: 更新用户信息

    int updataUserById(User user);
    <update id="updataUserById" parameterType="com.qf.model.User">
        <!-- #{}内写的是对象的属性名 -->
        update user set username = #{username},password = #{password},birthday = #{birthday},
        phone = #{phone},address = #{address}
        where id = #{id}
    </update>

        // 通过工厂SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession( );

        // 通过SqlSession获得接口的代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        // 更新,如果对象某个属性为空,将会把直接置空
        User user = new User( );
        user.setId(29);
        user.setUsername("圆圆");
        user.setPassword("654321");

        int i = mapper.updataUserById(user);

        System.out.println(i );

        // 记得提交
        sqlSession.commit();

插入【重要】

需求: 向User表插入一条数据

    int insertUser(User user);
    <insert id="insertUser" parameterType="com.qf.model.User">
        insert into user (username,password,birthday,phone,address)
        values(#{username},#{password},#{birthday},#{phone},#{address})
    </insert>
    @Test
    public void testInsert() throws IOException {
        // 加载配置文件,变成流
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

        // 通过流获得工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder( ).build(inputStream);

        // 通过工厂SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession( );

        // 通过SqlSession获得接口的代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        User user = new User( );
        user.setUsername("喻去子");
        user.setPassword("123456");
        user.setAddress("中国 贵州 黔南布依族苗族自治州");
        user.setBirthday(new Date());

        int i = mapper.insertUser(user);

        System.out.println(i );

        sqlSession.commit();

    }

插入后,主键回填【熟悉】

场景: 下订单,返回订单号

需求: 插入数据后,要得到数据库自增的id

实现: mysql提供一个sql语句select last_insert_id();可以获得上次自增的id

    int insertUser(User user);
    <insert id="insertUser" parameterType="com.qf.model.User">
        insert into user (username,password,birthday,phone,address)
        values(#{username},#{password},#{birthday},#{phone},#{address})

        <!--
            keyProperty : 装载id的属性
            order  : 顺序,是指在insert前或者后执行该句话
            resultType : 结果类型
            解释: 在插入数据后,执行该句话,将主键查询到
                  将其赋值给User类的id属性
        -->
        <selectKey keyProperty="id" order="AFTER" resultType="int">
            select last_insert_id()
        </selectKey>

    </insert>
   /**
     * 测试更新
     */
    @Test
    public void testInsert() throws IOException {
        // 加载配置文件,变成流
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

        // 通过流获得工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder( ).build(inputStream);

        // 通过工厂SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession( );

        // 通过SqlSession获得接口的代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        // 创建一个对象
        User user = new User( );
        user.setUsername("喻去子");
        user.setPassword("123456");
        user.setAddress("中国 贵州 黔南布依族苗族自治州");
        user.setBirthday(new Date());

        // 执行插入,其中会有主键回填
        System.out.println("插入前: " +user );
        int i = mapper.insertUser(user);
        System.out.println(i );

        // 提交
        sqlSession.commit();

        // 再次打印对象,此时对象中的id有值
        System.out.println("插入后: " +user );
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值