欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

$和#的区别

程序员文章站 2022-06-10 08:30:00
...

$和#的区别

    1.$和#都可以充当占位符,$符号的底层是由Statement实现的,

        #底层是由PreparedStatement实现的

    2.#是先编译sql语句,然后在传值,给传入的值都加上双引号

          $是直接拼接字符串,不会给传入的值加上双引号

<!--(1)实体类 com.xalo.entity-->
public class Student {
   private String name;
   private Integer age;
 <!--提供有参无参的构造方法, setter和getter方法  重写toString()方法-->
   }

<!--(2)com.xalo.dao.inter-->
public interface StudentDao {
  //根据姓名查询学生
 @Select("select * from student where name = ${value}")
 public List<Map<String,Object>> queryStudentByName(String name) throws Exception;
      
    }

<!--(3)mybatis_config_xml-->

<!--调用log4j 打印sql语句 --> 
 <settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>     
 </settings>   

<!-- 为java类型起别名,在配置文件中就可以使用别名 目的:书写简单方便-->
<typeAliases>
   <typeAlias type="com.xalo.model.Student" alias="Student"/>		
</typeAliases>

<!-- 数据库环境配置,一个环境对应一个数据库,将来和spring整合之后,就不在配置-->  
<environments default="development">
  <environment id="development">
 <!-- 事物类型配置	  JDBC:使用JDBC的事物管理 -->
  	<transactionManager type="JDBC"></transactionManager>
  <!-- 数据源的配置 POOLED:使用mybatis默认的数据源-->
  	  <dataSource type="POOLED">
  		<property name="driver" value="com.mysql.cj.jdbc.Driver"/>          <!-- useSSL=false: 是否使用加密 -->
  		<property name="url" value="jdbc:mysql://localhost:3306/has?useUnicode=true&amp;characterEncoding=UTF8&amp;useSSL=false"/>
  		<property name="username" value="root"/>
  		<property name="password" value="12345678"/>
  	 </dataSource>
  </environment>
</environments>

<!-- 映射文件的导入 -->
<mappers>
   <!--注解的使用:在mybatis的配置文件中注册这个映射接口(注意是class)  -->
   <mapper class="com.xalo.dao.inter.StudentDao"></mapper> 
</mappers>

<!--(4)测试-->
<!--SqlSessionFactoryBuilder:
         创建session工厂,所以session=工厂创建成功,就可以将占有的资源释放掉,作用域是一个局部变量
    SqlSessionFactory: 
         创建session对象,我们没有必要每创建一个session对象,都是一个session工厂对象;
             所以SqlSessionFactory对象的作用域是整个应用.  单例模式
     SqlSession:
         使用CURD数据使用,由于该对象是非线程安全的,
          所以我们希望每个线程都拥有自己的session对象,所以该对象的作用域为局部变量-->
public class DaoTest {
   @Test
   public void testInterface() {
	   InputStream in;
	 try {
	   in = Resources.getResourceAsStream("mybatis_config.xml"); <!--读取配置文件-->
	   SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in); <!--加载配置文件并创建session工厂-->
		SqlSession session = sf.openSession(); <!-- 创建session对象-->
		StudentDao studentDao = session.getMapper(StudentDao.class);
		List<Map<String, Object>> list = studentDao.queryStudentByName("'碧瑶'");
		    System.out.println(list);
			session.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
   
   
  <!--测试:
         增删改需要提交事务,查询时不需要提交事务(session commit)
         建立实体类时最好也进行实例化
             (实体类 implement Serializable)-->
   
   }

    3.$会造成sql注入问题,#不会

   4.只有在传入数据库对象时,才会使用$

         (1)按照某个表进行查询时传入表名

         (2)按照某一列进行排序时传入类名

  5.传入非数据库对象时,最好都使用#,不使用$

 

相关标签: $和#的区别