SSM整合之Mybatis笔记(特殊SQL的执行)(P030—P034)

特殊SQL的执行

一.  模糊查询

1. 准备工作

SpecialSQLMapper.java

创建映射文件SpecialSQLMapper.xml

 

测试:

2.模糊查询

SpecialSQLMapper.java
    /**
     * 通过用户名模糊查询用户信息
     * @param mohu
     * @return
     */
    List<User> getUserByLike(@Param("mohu") String mohu);

SpecialSQLMapper.xml


<mapper namespace="com.atguigu.mybatis.mapper.SpecialSQLMapper">
    <!--List<User> getUserByLike(@Param("mohu") String mohu);-->
    <select id="getUserByLike" resultType="User">
       <!-- select * from t_user where username like '%#{mohu}%' 这个会报错   -->
        <!--select * from t_user where username like '%${mohu}%'-->
        <!--select * from t_user where username like concat('%',#{mohu},'%')-->
        select * from t_user where username like "%"#{mohu}"%"
    </select>

</mapper>

测试:SpecialSQLMapperTest

    @Test
    public void testGetUserByLike(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);
        List<User> list = mapper.getUserByLike("a");
        list.forEach(System.out::println);
    }

拓展:

当执行 select * from t_user where username like '%#{mohu}%'  这个时会报错

错误如下 

1.DEBUG 10-23 16:19:55,538 ==>  Preparing: select * from t_user where username like '%?%' (BaseJdbcLogger.java:137)

%#{mohu}%解析后让问号代替变成'%?%' ?属于字符串的一部分  不会看成点位符来解析

也就是这条sql没有任何的点位符 可是我们写#{} 说明要有占位符,所以他就调用译编译的方法为占为符赋值,但是sql中并没有占位符

2.  Caused by: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).  SQL异常  当前参数的地索引超出范围   1>参数有个数  当前参数是0 操作的个数是1 

报错解释

    public void testJDBC(){
        try {
            Class.forName("");
            Connection connection = DriverManager.getConnection("","","");
            /*String sql = "select * from t_user where username like '%?%'";
            PreparedStatement ps = connection.prepareStatement(sql);*/
            //ps.setString(1, "a");
            String sql = "insert into t_user values()";
            PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            ps.executeUpdate();
            ResultSet resultSet = ps.getGeneratedKeys();
            resultSet.next();
            int id = resultSet.getInt(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 拓展:当报很多错误的时候我们应该从上往上看

主要错误主要体现在Caused by:   Error  Exception:

二.  批量删除
SpecialSQLMapper.java
    /**
     * 批量删除
     * @param ids
     */
    void deleteMoreUser(@Param("ids") String ids);

SpecialSQLMapper.xml

   <!--void deleteMoreUser(@Param("ids") String ids);//ids:4,5-->
    <delete id="deleteMoreUser">
        delete from t_user where id in(${ids})
    </delete>
测试: SpecialSQLMapperTest
  @Test
    public void testDeleteMoreUser(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);
        mapper.deleteMoreUser("4,5");
    }

为了测试我们把数据库添加到5  删除4和5  如图

删除后结果:

三.  动态设置表名

SpecialSQLMapper.java
    /**
     * 动态设置表名,查询用户信息
     * @param tableName
     * @return
     */
    List<User> getUserList(@Param("tableName") String tableName);

 SpecialSQLMapper.xml

  <!--List<User> getUserList(@Param("tableName") String tableName);-->
    <select id="getUserList" resultType="User">
        select * from ${tableName}
    </select>

 测试: SpecialSQLMapperTest

    @Test
    public void testGetUserList(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);
        List<User> list = mapper.getUserList("t_user");
        list.forEach(System.out::println);
    }

添加功能获取自增的主键(重要,以后用得相当)

场景模拟:
t_clazz(clazz_id,clazz_name)   班级表  
t_student(student_id,student_name,clazz_id)   学生表
1 、添加班级信息
2 、获取新添加的班级的 id
3 、为班级分配学生,即将某学的班级 id 修改为新添加的班级的 id

SpecialSQLMapper.java


    /**
     * 添加用户信息并获取自增的主键
     * @param user
     */
    void insertUser(User user);

 SpecialSQLMapper.xml

    <!--void insertUser(User user);-->
    <!--
        useGeneratedKeys:表示当前添加功能使用自增的主键
        keyProperty:将添加的数据的自增主键为实体类类型的参数的属性赋值
    -->
    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
        insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})
    </insert>

测试: SpecialSQLMapperTest

    @Test
    public void testInsertUser(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);
        User user = new User(null,"xiaoming","123456",23,"男","123@qq.com");
        mapper.insertUser(user);
        System.out.println(user);
    }

 

 

 useGeneratedKeys:设置使用自增的主键

 keyProperty :因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参
user 对象的某个属性中

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值