一、#和$
select id , name,email ,age from student where id-#{studentId}# 的结果: select id, name,email ,age from student where id=?
select id , name,email,age from student where id=${studentId}$的结果: select id ,name,email,age from student where id=1001
string sql="select id ,name,email,age from student where id=" + "1001" ;使用的statement对象执行sql,效率比Preparedstatement低。
$ :可以替换表名或者列名,你能确定数据是安全的。可以使用$
#和$区别
1.#使用?在sql语句中做站位的,使用Preparedstatement执行sql,效率高
2.#能够避免sql注入,更安全。
3.$不使用占位符,是字符串连接方式,使用statement对象执行sql,效率低
4.$有sgl注入的风险,缺乏安全性。
5. $:可以替换表名或者列名
二、
mybatis的输出结果
mybatis执行了sql语句,得到java对象-
1) resultrype结果类型,指sql语句执行完毕后,数据转为的java对象,java类型是任意的。
resultType结果类型的它值 1.类型的全限定名称―2.类型的别名,例如java.lang. Integer别名是int
处理方式:
1. mybatis执行sql语句,然后mybatis调用类的无参数构造方法,创建对象。
2. mybatis把Resultset指定列值赋给同名的属性。
<select id="selectMultiPosition" resultType="com.bjpowernode . domain.student">
select id ,name, email ,age from student
</select>
对等的jdbc
Resultset rs = executeQuery(" select id,name,email,age from student" )
while (rs.next(){
studentstudent - new student() ;student.setid (rs.getInt( "id"));
student. setName (rs.getstring ( "nane" ) ) }
三、定义别名:
1)在mybatis主配置文件中定义,使<typeAlias>定义别名
2)可以在resultType中使用自定义别名
<!--定义别名实例--> <!-- 第一种方法: 可以指定一个类型一个自定义别名 标签<typeAliases> type:自定义类型的全限定名称 alias:别名(短小,容易记忆的) --> <typeAliases> <typeAlias type="stu" alias="com.edu.domain.Student"></typeAlias> <!-- 第二种方式 <package> name是包名,这个包中的所有类,类名就是别名(类名不区分大小写),需要注意的是当不同的包存在相同的 类名时,会报错,因为idea不知道该使用哪个类 --> <package name="com.edu.domain" /> </typeAliases>
四、resultMap结果映射
resultMap:结果映射,指定列名和java对象的属性对应关系。
1)你自定义列值赋值给哪个属性
2)当你的列名和属性名不一样时,一定使用resultMap
res<Map和resultrype不要一起用,二选一l
<resultMap id="myStudentMap" type="com.edu.domain.MyStudent"> <!-- 把从数据库查到的值 通过property赋给相应的实体属性。--> <id column="id" property="stuid"/> <result column="name" property="stuname"/> <result column="age" property="stuage"/> </resultMap> <!-- 使用resultMap 列名与属性名不一致的测试,此时select标签中的resultMap指向 resultmap标签的id --> <select id="selectMyStudent" resultMap="myStudentMap"> select id,name,age from student </select> <!-- 列名与属性名不一致的测试 第二种使用resultType resultType的默认原则是同名的列值赋值给同名的属性,使用列别名--> <select id="selectOtherStudent" resultType="com.edu.domain.MyStudent"> select id as stuid,name as stuname from student </select> 五、like模糊查询 <!--第一种模糊查询like,推荐第一种--> <select id="selectLikeOne" resultType="com.edu.domain.Student"> select * from student where name like #{name} </select> <!--第二种模糊查询like,在mapper中拼接,不推荐这种,拼接比较麻烦--> <select id="selectLikeTwo" resultType="com.edu.domain.Student"> select * from student where name like "%" #{name} "%" </select>