zoukankan      html  css  js  c++  java
  • Java -- MyBatis学习笔记7、# 和 $的区别

    1、# 占位符

    告诉mybatis使用实际的参数值代替。并使用 PrepareStatement对象执行sql语句, #{…}代替sql语句的"?"。这样做更安全,更迅速,通常也是首选做法。

    • 在Dao层接口中添加如下方法:
    public int insert(UserInfo userInfo);
    
    • 在mapper映射文件中添加对应的标签和SQL语句:
    <insert id="insert" parameterType="com.rg.entity.UserInfo">
        insert into UserInfo(Name,Age) values(#{Name},#{Age})
    </insert>
    
    • 在测试类中测试、如下:
    @Test
    public void insert()
        {
            UserInfo userInfo = new UserInfo();
            userInfo.setName("王昭君");
            userInfo.setAge(16);
            int result = this.userInfoDao.insert(userInfo);
            sqlSession.commit();
            System.out.println(result);
        }
    
    • 观察日志记录、如下:
    ==> Preparing: insert into UserInfo(Name,Age) values(?,?) 
    ==> Parameters: 王昭君(String), 16(Integer)
    ==> //........
    

    可以看到、values()里边是 ? 、也就是说:转为JDBC代码使用的就是PreparedStatement、如下:

    String sql = "insert into UserInfo(Name,Age) values(?,?)";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setString(1,"张三");
    ps.setInt(2,30);
    

    values(?,?)就是values(#{Name},#{Age})。
    ps.setString(1,"张三")中的"张三"会替换掉#{Name}。
    使用PreparedStatement更安全、高效、可以防止SQL注入。

    2、$ 字符串替换

    $和#差不多、#能使用的地方$都可以使用。但是不使用占位符的方式给参数赋值、而是使用直接拼接的方式,主要用在替换表名,列名,不同列排序等操作。在Java里就是字符串的拼接。比如:

    String name = "张三";
    System.out.println("你好、我是" + name);
    //结果就是:你好、我是张三
    
    • 在Dao层接口中添加如下方法:
    public List<UserInfo> selectAll(@Param("age") String age);
    
    • 在mapper映射文件中添加对应的标签和SQL语句:
    <select id="selectAll" resultType="com.rg.entity.UserInfo">
         select * from UserInfo order by ${age}
    </select>
    
    • 在测试类中测试、如下:
    @Test
        public void selectAll()
        {
            List<UserInfo> userList = userInfoDao.selectAll("age");
            //循环输出集合中的结果
            userList.forEach(x -> System.out.println(x));
        }
    
    • 观察日志记录、如下:
    ==> Preparing: select * from UserInfo order by age 
    ==> Parameters: 
    

    可以看到、传入的字符串类型的参数age、直接将${age}替换掉了、但是并没有双引号、如果要传入的类型在数据库里是字符串类型的、那么就需要这样写:selectAll("'age'")。这样、SQL语句就变成了:

    select * from UserInfo order by 'age'
    

    使用$替换、在接口中的方法参数要使用@Param给参数定义别名、在mapper映射文件对应的SQl语句中就使用别名 $(别名)。最后、$使用的是Statement对象执行SQL、效率比较低、不安全。需合理使用。

    3、查询通用方法

    还可以使用$编写通用方法,使用不同列作为查询条件:

    • 接口方法:
    UserInfo findByDiffField(@Param("col") String colunName,@Param("cval") Object
    value);
    
    • mapper文件
    <select id="findByDiffField" resultType="com.rg.entity.UserInfo">
    select * from UserInfo where ${col} = #{cval}
    </select>
    
    • 测试方法:
    @Test
    public void testFindDiffField()
    {
        UserInfo userInfo1 = this.userInfoDao.findByDiffField("id",3);
        System.out.println("按按id 列查询:"+userInfo1);
        Student userInfo2 = this.userInfoDao.findByDiffField("Name","王五");
        System.out.println("按按Name列查询:"+userInfo2);
    }
    
  • 相关阅读:
    Loadrunner脚本自动关联和手动关联
    Linux常用命令大全
    linux软件的安装和卸载
    PL/SQL DEVELOPER执行计划的查看
    利用pl/sql执行计划评估SQL语句的性能简析
    LoadRunner监控Linux与Windows方法
    LR添加Windows和Linux压力机实战
    《JS设计模式笔记》 4,桥接模式
    《ES6基础教程》之 Call 方法和 Apply 方法
    《JS设计模式笔记》 3,观察者模式
  • 原文地址:https://www.cnblogs.com/dcy521/p/14747569.html
Copyright © 2011-2022 走看看