使用动态代理,则在dao持久层接口中不要使用重载(sql.xml中语句的id)
动态代理
用getMapper不用写dao层接口的实现类了
传参
单个参数
//根据id查学生
Student selectStuFromId(int id);
<select id="selectStuFromId" resultType="com.neuq.domain.Student">
select * from student where id=#{stuId}
</select>
多个参数
使用@Param(String value)取别名
List<Student> selectMultiStu(@Param("myId") int id,@Param("myAge") int age);
<select id="selectMultiStu" resultType="com.neuq.domain.Student">
select * from student where id>#{myId} and age>#{myAge}
</select>
对象参数
直接用对象属性名
要求对象必须有无参构造、get、set方法
//插入数据
int insertStudent(Student stu);
<insert id="insertStudent">
insert
into student (name,email,age)
values (#{name},#{email},#{age})
</insert>
#(占位符)和 $(拼接符) ★★★★★
#:会把传入的参数当成是一个字符串,自动添加双引号(能够防止sql注入)。mybatis会先对sql语句进行预编译。
$:不做任何处理,直接将值拼接在sql语句中(不能避免注入攻击)。sql语句不进行预编译。
resultType
1、返回的类型是查询出的每行数据的对象类型,与是不是以List返回没关系
2、但返回对象类型没有限制:
注:建议使用全限定名称,不要使用别名。
3、可以是类的全限定名称,也可以是别名,如 java.lang.Integer 别名为 int
<select id="selectCount" resultType="int">
select count(*) from student
</select>
4、< configuration >中定义别名
5、单行数据Map返回
resultMap
当数据库中表的列名与对应的Java类的属性名不相同时!!!
注意:当存在resultMap时就不用resultType
当然:在sql语句中可以使用别名的方式以达到匹配对象属性名
like模糊查询
@Test
public void selectStuLike(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
String grep = "_2%";//建议直接在java中形成匹配字符串
List<Student> students = dao.selectStuLike(grep);
students.forEach(System.out::println);
}
<select id="selectStuLike" resultMap="studentMap">
select * from student where stu_email like #{email}
</select>