- 动态代理: 使用SqlSession.getMapper(dao接口.class) 获取这个dao接口的对象
- 传入参数: 从java代码中把数据传入到mapper文件的sql语句中。
parameterType : dao接口中方法参数的数据类型。
parameterType它的值是java的数据类型全限定名称或者是mybatis定义的别名
例如:parameterType="java.lang.Integer"parameterType="int"
注意:parameterType不是强制的,mybatis通过反射机制能够发现接口参数的数类型。所以可以没有。 一般我们也不写。
使用#{}之后, mybatis执行sql是使用的jdbc中的PreparedStatement对象
由mybatis执行下面的代码:
1. mybatis创建Connection , PreparedStatement对象
String sql="select id,name, email,age from student where id=?";
PreparedStatement pst = conn.preparedStatement(sql);
pst.setInt(1,1001);
2. 执行sql封装为resultType="com.bjpowernode.domain.Student"这个对象
ResultSet rs = ps.executeQuery();
Student student = null;
while(rs.next()){
//从数据库取表的一行数据, 存到一个java对象属性中
student = new Student();
student.setId(rs.getInt("id));
student.setName(rs.getString("name"));
student.setEmail(rs.getString("email"));
student.setAge(rs.getInt("age"));
}
return student; //给了dao方法调用的返回值
例如StudentDao接口
public Student selectStudentById(Integer id)
1. parameterType : 写在mapper文件中的 一个属性。 表示dao接口中方法的参数的数据类型。他的值是java中的数据类型全限定名称或者说是mybatis定义别名
2. 一个简单类型的参数:
简单类型: mybatis把java的基本数据类型和String都叫简单类型。
在mapper文件获取简单类型的一个参数的值,使用 #{任意字符}
接口:public Student selectStudentById(Integer id)
mapper:select id,name, email,age from student where id=#{studentId}
-
多个参数,使用@Param命名参数
接口 public List selectMulitParam(@Param(“myname”) String name, @Param(“myage”) Integer age)
使用 @Param(“参数名”) String name
mapper文件:
select * from student where name=#{myname} or age=#{myage}
List<Student> selectMulitParam(@Param("myname")String name,@Param("myage")Integer age);
<select id="selectMulitParam" resultType="com.mybatis.study.domain.Student">
select id, name, email, age from student where name=#{myname} or age=#{myage}
</select>
public void selectMulitParam() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List<Student> students = dao.selectMulitParam("张飞", 25);
for (Student stu: students
) {
System.out.println(stu);
}
sqlSession.close();
}
-
多个参数,使用java对象
语法 #{属性名}vo: value object , 放一些存储数据的类。比如说 提交请求参数, name ,age
现在想把name ,age 传给一个service 类。vo: view object , 从servlet把数据返回给浏览器使用的类,表示显示结果的类。
pojo: 普通的有set, get方法的java类。 普通的java对象
Servlet — StudentService( addStudent( MyParam param) )
entity(domain域): 实体类, 和数据库中的表对应的类,
List<Student> selectMulitObjet(QuaryParam param);
<select id="selectMulitObjet" resultType="com.mybatis.study.domain.Student">
select id, name, email, age from student where
name=#{ParamName} or age=#{ParamAge}
</select>
public void selectMulitObject(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
QuaryParam param = new QuaryParam();
param.setParamName("张三");
param.setParamAge("20");
List<Student> students = dao.selectMulitObjet(param);
for (Student stu: students
) {
System.out.println(stu);
}
sqlSession.close();
}
5.# 和 $
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. $有sql注入的风险,缺乏安全性。
5. $:可以替换表名或者列名
- mybatis的输出结果
mybatis执行了sql语句,得到java对象。
1)resultType结果类型, 指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()){
Student student = new Student();
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"))
}
-
定义自定义类型的别名
1)在mybatis主配置文件中定义,使定义别名。
2)可以在resultType中使用自定义别名
<!--定义别名-->
<typeAliases>
<!--可以指定一个类型一个自定义别名
type:自定义类型的全限定名称
alias:别名(短小,容易记忆的)-->
<typeAlias type="com.bjpowernode.domain.Student"alias="stu"/>
<typeAlias type=”com.bjpowernode.vo.ViewStudent"alias="vstu"/>
<!--第二种方式
<package> name是包名,这个包中的 所有类,类名就是别名(类名不区分大小写 )
<package name="com.bjpowernode.dpmain" />
-->
</typeAliases>
3)resultMap:结果映射, 指定列名和java对象的属性对应关系。
1)你自定义列值赋值给哪个属性
2)当你的列名和属性名不一样时,一定使用resultMap
resultMap和resultType不要一起用,二选一
<resultMap id="studentMap"type="com.bjpowernode.domain.student">
<!--列名和java属性的关系-->
<!--注解列,使用id标签
column:列名
property:java类型的属性名
-->
<id column="id"property="id"/>
<!--非主键列,使用result-->
<result column="name"property="name"/>
<result column="email"property="email"/>
<result column="age"property=”age"/>
</resultMap>
<select id="selectAllstudents"resul tMap="studentMap'
select id,name,email,age from student
</select>
</mapper>
列名与属性名不一样第二种方式
resultType的默认原则是 同名的列值赋值给同名的属性,使用列别名。
select id as stuid ,name as stuname, email as stuemail ,age stuage from student
模糊like
第一种:在java代码指定like的内容
第二种:在mapper文件拼接like的内容
select id, name, email ,age from student where name like "%" #{name} "%"