mybatis—动态代理getMapper、传⼊参数、输出结果、动态sql以及扩展的
Pag。。。
mybatis(⼆)
传统dao执⾏数据库⽅法
public class TestMyBatis {
@Test
public void testSelectStduents(){
StudentDao student=new StudentDaoImpl();
List<Student> students = student.selectStudents();
students.forEach(student1 -> System.out.println(student1));
}
@Test
public void TestInsertStudent(){
StudentDao dao=new StudentDaoImpl();
Student student=new Student();
student.setId(1004);
student.setName("ccl");
student.setEmail("ccl@qq");
student.setAge(20);
dao.insertStudent(student);
}
}
List<Student> students = student.selectStudents(); 调⽤
1、dao对象,类型是StudentDao,全限定名称是:com.hr.qjb.dao.StudentDao
全限定名称,和 namespace是⼀样的
2、⽅法名称,selectStudents,这个⽅法就是mapper⽂件中的id值, selectStudents
3、通过dao中⽅法的返回值也可以确定MyBatis要调⽤的SqlSession的⽅法
如果返回值是List,调⽤的是SqlSession.selectList()⽅法
如果返回值是int , 或是⾮List的,看mapper⽂件中的标签是<insert>,<update>就会调⽤
sqlSession的insert、update等⽅法
mybatis的动态代理:mybatis根据dao的⽅法调⽤,获取执⾏sql语句的信息
mybatis根据你的dao接⼝,创建出⼀个dao接⼝的实现类,并创建这个类的对象。
完成SqlSession调⽤⽅法,访问数据库。
动态代理getMapper
使⽤Mapper(dao接⼝.class) 获取这个dao接⼝的对象
public class TestMyBatis {
@Test
public void testSelectStduents(){
/*
* 使⽤mybatis的动态代理机制,使⽤Mapper(dao接⼝)
* getMapper 能获取dao接⼝对于的实现类对象
*
* */
SqlSession sqlSession= SqlSession();
StudentDao dao = Mapper(StudentDao.class);
//调⽤dao的⽅法,执⾏数据库的操作
List<Student> students = dao.selectStudents();
students.forEach(student -> System.out.println(student));
}
传统dao执⾏数据库⽅法,需要接⼝的实现类⽀撑,但是使⽤动态代理以后,可以通过getMapper去代替接⼝实现类通过执⾏System.out.Class().getName());查看dao的类型发现
com.sun.proxy.$Proxy2
可以看到⽤的就是动态代理
深⼊理解参数
传⼊⼀个简单类型参数
如果想要在进⾏数据库操作的时候加⼊参数
传⼊参数:从Java代码中把数据传⼊到mapper⽂件的sql语句中。
1、parameterType:写在mapper⽂件中的要给属性。表⽰dao接⼝中⽅法的参数的数据类型,
例如StudentDao接⼝
public Student selectStudent ById(Integer id)
parameterType:⽤来表⽰dao接⼝⽅法参数的数据类型
parameterType它的值是Java的数据类型全限定名称或者是mybatis定义的别名
例如:parameterType=“java.lang.Integer”
parameterType=“int”
注意:parameterType不是强制的,mybatis通过反射能够发现接⼝参数的数类型
所以可以没有。⼀般我们不写
在mapper⽂件(dao接⼝)获取简单类型的⼀个参数的值,使⽤#{任意字符}
例如
mapper类
<select id="selectStudentById"parameterType="java.lang.Integer"resultType="com.hr.qjb.domain.Student">
select id , name ,email, age from student where id=#{id}
</select>
测试类
public void testSelectStduents(){
SqlSession sqlSession= SqlSession();
StudentDao dao = Mapper(StudentDao.class);
//传过去参数
Student student = dao.selectStudentById(1004);
System.out.println(student);
}
接⼝类
public interface StudentDao {
public Student selectStudentById(Integer id);
}
使⽤#{}之后,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.hr.qjb.domain.Student“这个对象
ResultSet rs = ps.executeQuery();
Student student = null;
()){
//从数据库取表的⼀⾏数据,存到⼀个Java对象属性中
Student student = new Student();
student.Int(“id”));
student.String(“name”));
student.String(“email”));
student.String(“age”));
}
return student; // 给了dao⽅法调⽤的返回值
传⼊多个参数
使⽤@Param
当Dao接⼝⽅法多个参数,需要通过名称使⽤参数。在⽅法形参前⾯加⼊@Param(“⾃定义参数名”),
mapper⽂件使⽤#{⾃定义参数名}param name
例如定义 List<Student>selectStudent(@Param(“personName”) String name ){ … }
mapper ⽂件 select * from student where name = #{ personName}
接⼝⽅法:
List<Student> selectMultiParam(@Param(“personName”) String name ,@Param(“personAge”) int age); mapper⽂件:
<select id ="selectMultiParam" resultType="com.hr.qjb.domain.Student">
select id , name, email,age from student where name = #{personName} or age = #{personAge}
</select>
实例代码
StudentDao
//多个参数:命名参数,在形参定义的前⾯加⼊@Param("⾃定义参数名称")
List<Student>selectMultiParam(@Param("myname") String name ,
@Param("myage") Integer age);
<!--    多个参数,使⽤@Param命名-->
<select id="selectMultiParam"resultType="com.hr.qjb.domain.Student">
select id , name ,email, age from student where name=#{myname} or age=#{myage}
</select>
测试类
@Test
public void testSelectMultiParam(){
SqlSession SqlSession();
StudentDao dao = Mapper(StudentDao.class);
List<Student> students = dao.selectMultiParam("ccl",20);
students.forEach(student -> System.out.println(student));
sqlSession.close();
}
使⽤对象
可以新建⼀个类,也可以使⽤已有的类,只要xml⽂件中#{}花括号中的参数与实体类的属性名对应就可以
多个参数,使⽤Java对象的属性值,作为参数实际值
使⽤对象的语法:#{属性名,javaType=类型名称,jdbcType=数据类型} 很少⽤
JavaType:指Java中的属性数据类型。
jdbcType:在数据库中的数据类型
例如:#{paramName,javaType=java.lang.String,jdbcType=VARCHAR}
<select id="selectMultiObject"resultType="com.hr.qjb.domain.Student">
select id , name ,email, age from student where
name=#{paramName,javaType=java.lang.String,jdbcType=VARCHAR}
or age=#{paramAge,javaType=java.lang.Integer,jdbcType=INTEGER}
</select>
上⾯是最为完整的,我们⼀般⽤简化的
简化⽅式:#{属性名} , JavaType,jdbcType的值mybatis反射能获取,不同提供
<select id="selectMultiObject"resultType="com.hr.qjb.domain.Student">
select id , name ,email, age from student where
name=#{paramName} or  age=#{paramAge}
</select>
vo:value object,放⼀些存储数据的类。⽐如说 提交请求参数, name, age现在想把name,age 传给⼀个service类。vo:view object,从servlet把数据返回给浏览器使⽤的类,表⽰显⽰结果的类。
pojo:普通的有set,get⽅法的Java类,普通的Java对象
entity(domain域):实体类,和数据库中的表对应的类
使⽤位置(了解)
使⽤位置的话是通过接⼝中⽅法传递过来的参数从左往右计算,从零开始数,
例如:
List<Student>selectMultiPosition(String name , Integer age);
想要进⾏查询的话就是
<select id="selectMultiPosition"resultType="com.hr.qjb.domain.Student">
select id , name ,email, age from student where
name=#{arg0} or  age=#{arg1}
</select>
在mybatis 3.4之前 , 使⽤#{0} ,#{1} 表⽰
在mybatis3.4之后,使⽤#{arg0} , #{arg1}
使⽤map(了解)
List<Student>selectMultiMap(Map<String,Object> map);
使⽤Map,使⽤语法#{map的key}
xml
<select id="selectMultiMap"resultType="com.hr.qjb.domain.Student">
select id , name , email ,age from student where name=#{name} or age=#{age}
</select>
测试
@Test
public void testSelectMultiMap(){
//获取SqlSession对象
SqlSession sqlSession= SqlSession();
/
/通过getMapper⽅法,得到dao对象
StudentDao dao = Mapper(StudentDao.class);
//因为要传⼀个map,所以创建要给map
Map<String ,Object> map =new HashMap<>();
map.put("name","ccl");
map.put("age",20);
//通过传过去的map调⽤⽅法,得到结果集,并且打印
List<Student> students = dao.selectMultiMap(map);
students.forEach(student -> System.out.println(student));
}
占位符
$和#的区别
select id , name ,email, age from student where id=#{id}
#的结果: select id , name ,email, age from student where id=?
select id , name ,email, age from student where id=${id}
$的结果:select id , name ,email, age from student where id=1004
String sql="select id , name ,email, age from student where id = "+“1004”;使⽤Statement对象执⾏sql,效率⽐PreparedStatement低。
1、#使⽤?在sql语句中能做站位的,使⽤PreparedStatement执⾏sql,效率⾼

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。