$和#的区别

$和#的区别

    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.传入非数据库对象时,最好都使用#,不使用$

 

猜你喜欢

转载自blog.csdn.net/zs1342084776/article/details/82778122