动态代理:使用SqlSession,getMapper(dao接口.class)获取这个dao接口的对象。
传入参数:从java代码中把数据传入到mapper文件的sql语句中。
写在mapper文件中的一个属性,表示dao接口中方法的参数的数据类型。
例如;StudentDao接口
public Student selectStudentById(Integer id)
测试:
/**
* 查询单个学生
* @param id 学生id
* @return 返回一个学生
*/
public Student selectStudent(Integer id);
<select id="selectStudent" parameterType="java.lang.Integer" resultType="com.liang.entity.Student">
select id,name,email,age from student where id = #{id}
select>
package com.liang;
import com.liang.dao.StudentDao;
import com.liang.entity.Student;
import com.liang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
/**
* @author liang
* @date 编写日期: 2022/3/18 16:12
*/
public class TestParameter {
@Test
public void testParameterType(){
//获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//动态代理获取dao的实体类
StudentDao dao = sqlSession.getMapper(StudentDao.class);
//执行语句
Student student = null;
student = dao.selectStudent(1005);
//输出结果
if(student!=null){
System.out.println("查询到的学生是:"+student);
}
sqlSession.close();
}
}
mybatis把java的基本数据类型和String类型的参数都叫做简单类型。
在mapper文件中获取简单类型参数的一个值,使用**#{任意字符}**。
select id,name,email,age from student where id = #{id}
使用#{ }之后,mybatis执行sql语句是使用jdbc中的prePareStatement对象。
由mybatis执行下面的代码:
mybatis创建Connection,prepareStatement对象
String sql = "select id,name,email,age from student where id = ? ";
prepareStatement pst = con.prepareStatement(sql);
pst.SetInt(1,1001);
执行sql封装resultType="com.liang.entity.Student"这个对象
ResultSet rs = ps.executeQuery();
while(rs.next()){
//从数据库表中取出一行数据,存到一个java对象是属性中
}
当Dao接口方法有多个参数,需要通过名称使用参数,在方法形参面前加入@Param(“自定义参数名称”),mapper文件中使用#{自定义名称}
/**
* 根据姓名年龄查询
* @param name 姓名
* @param age 年龄
* @return
*/
public List<Student> selectMulParam(@Param("myname") String name,@Param("myage") Integer age);
<select id="selectMulParam" resultType="com.liang.entity.Student">
select id,name,email,age from student where name = #{myname} or age = #{myage}
select>
@Test
public void selectMulParam(){
//获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//动态代理获取dao的实体类
StudentDao dao = sqlSession.getMapper(StudentDao.class);
//执行语句
List<Student> students = dao.selectMulParam("小梁",18);
//输出结果
for (Student stu:students) {
System.out.println("查询到的学生是:"+stu);
}
sqlSession.close();
}
使用java对象传参,java的属性值就是sql需要的参数值,每一个属性就是一个参数。
语法格式:#{property,javaType = java中的数据类型名,jdbcType=数据类型名称}
javaType 和jdbcType的类型mybatis可以检测出来,一般不需要设置,常用格式#{property}
package com.liang.vo;
/**
* @author liang
* @date 编写日期: 2022/3/18 17:18
*/
public class QueryParam {
private String paramName;
private Integer paramAge;
public QueryParam() {
}
public QueryParam(String paramName, Integer paramAge) {
this.paramName = paramName;
this.paramAge = paramAge;
}
public String getParamName() {
return paramName;
}
public void setParamName(String paramName) {
this.paramName = paramName;
}
public Integer getParamAge() {
return paramAge;
}
public void setParamAge(Integer paramAge) {
this.paramAge = paramAge;
}
}
/**
* 使用java对象的属性值作为参数实际值
* @param parm
* @return
*/
public List<Student> selectMulObject(QueryParam parm);
<select id="selectMulObject" resultType="com.liang.entity.Student">
select id,name,email,age from student where name = #{paramName} or age = #{paramAge}
select>
@Test
public void selectMulObject(){
//获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//动态代理获取dao的实体类
StudentDao dao = sqlSession.getMapper(StudentDao.class);
//执行语句
List<Student> students = dao.selectMulObject(new QueryParam("张三",20));
//输出结果
for (Student stu:students) {
System.out.println("查询到的学生是:"+stu);
}
sqlSession.close();
}
参数位置从零开始,引用参数语法#{arg位置},第一个参数是#{arg0},#第二个参数是#{arg1}
/**
* 使用位置传参
* @param name 姓名
* @param age 年龄
* @return 返回查找到的学生
*/
public List<Student> selectMulPosition(String name, Integer age);
<select id="selectMulPosition" resultType="com.liang.entity.Student">
select id,name,email,age from student where
name = #{arg0} or age = #{arg1}
select>
@Test
public void testSelectMulPosition(){
//获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//动态代理获取dao的实体类
StudentDao dao = sqlSession.getMapper(StudentDao.class);
//执行语句
List<Student> students = dao.selectMulPosition("李四",25);
//输出结果
for (Student stu:students) {
System.out.println("查询到的学生是:"+stu);
}
sqlSession.close();
}
map集合可以存储多个值,使用map向mapper文件中一次传入多个参数。map集合使用String的key。Object类型的值存储参数,mapper文件使用**#{key}**引用参数值。
/**
* 使用map传参
* @param map
* @return
*/
public List<Student> selectMulMap(Map<String,Object> map);
<select id="selectMulMap" resultType="com.liang.entity.Student">
select id,name,email,age from student where
name = #{myname} or age = #{age}
select>
@Test
public void testSelectMulMap(){
//获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//动态代理获取dao的实体类
StudentDao dao = sqlSession.getMapper(StudentDao.class);
//执行语句
Map<String, Object> map = new HashMap<>();
map.put("myname","小梁");
map.put("age",25);
List<Student> students = dao.selectMulMap(map);
//输出结果
for (Student stu:students) {
System.out.println("查询到的学生是:"+stu);
}
sqlSession.close();
}
小例子:根据id查询
<select id="selectStudent" parameterType="java.lang.Integer" resultType="com.liang.entity.Student">
select id,name,email,age from student where id = ${id}
select>
/**
* 查询单个学生
* @param id 学生id
* @return 返回一个学生
*/
public Student selectStudent(@Param("id") Integer id);
@Test
public void testParameterType(){
//获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//动态代理获取dao的实体类
StudentDao dao = sqlSession.getMapper(StudentDao.class);
//执行语句
Student student = null;
student = dao.selectStudent(1005);
//输出结果
if(student!=null){
System.out.println("查询到的学生是:"+student);
}
sqlSession.close();
}
测试结果:
如果一个程序如下:
<select id="selectStudentByName" resultType="com.liang.entity.Student">
select id,name,email,age from student where name = ${name}
select>
/**
* 查询单个学生
* @param name 学生姓名
* @return 返回一个学生
*/
public Student selectStudentByName(@Param("name") String name);
@Test
public void testParameterType(){
//获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//动态代理获取dao的实体类
StudentDao dao = sqlSession.getMapper(StudentDao.class);
//执行语句
Student student = null;
student = dao.selectStudentByName("'李四';drop table student;");
//输出结果
if(student!=null){
System.out.println("查询到的学生是:"+student);
}
sqlSession.close();
}
执行的时候sql语句就会变成:
select id,name,email,age from student where name = '李四';drop table student;
会把整张表删掉!!!破坏数据等等!
一般用来替换表明或者列名,完全确定数据是安全的时候!
/**
* 根据列名排序
* @param colName 姓名
* @return
*/
public List<Student> selectUser$Order(@Param("colName") String colName);
<select id="selectUser$Order" resultType="com.liang.entity.Student">
select * from student order by ${colName}
select>
@Test
public void testselectUser$Order(){
//获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//动态代理获取dao的实体类
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List<Student> students = dao.selectUser$Order("name");
for (Student stu:students) {
System.out.println("查询到的学生是:"+stu);
}
sqlSession.close();
}
List<Student> students = dao.selectUser$Order("email");