动态代理优化代码:
List<student> studentList=dao. selectstudents(); 的调用
1.dao对象,类型是studentDao,全限定名称是: com.bjipowernode.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调用方法,访问数据库。
不需要实现类,利用动态代理实现
Test
package com.sdut;
import com.sdut.dao.StudentDao;
import com.sdut.entity.Student;
import com.sdut.utils.MybatisUtils;
import com.sdut.vo.QueryParam;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class MybatisTest {
/**
* 使用mybatis的动态代理机制,使用SqlSession.getMapper(接口)
* getMapper能获得dao接口的实现类对象
*/
@Test
public void testselectAllStudents() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List<Student> studentList = dao.selectAllStudents();
for(Student stu : studentList) {
System.out.println(stu);
}
}
@Test
public void testinsertStudent() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
Student student = new Student();
student.setId(1004);
student.setName("悟空");
student.setEmail("huaguoshan.com");
student.setAge(500);
int result = dao.insertStudent(student);
sqlSession.commit();
sqlSession.close();
System.out.println("结果为:" + result);
}
@Test
public void testdeleteStudentById() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
int result = dao.deleteStudentById(1004);
sqlSession.commit();
sqlSession.close();
System.out.println("结果为:" + result);
}
@Test
public void testselectStudentById() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
Student student = dao.selectStudentById(1003);
System.out.println(student);
}
@Test
public void testselectMutilParam() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List<Student> studentList = dao.selectMutilParam("三藏", 500);
for(Student stu : studentList) {
System.out.println(stu);
}
}
@Test
public void testselectMutilparam2() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
QueryParam param = new QueryParam();
param.setParamAge(500);
param.setParamName("三藏");
dao.selectMutilParam2(param);
}
@Test
public void testselectMutilparam3() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
Student student = new Student();
student.setAge(500);
student.setName("三藏");
dao.selectMutilParam3(student);
}
}
使用#{}传参
一个简单类型的参数:
- 简单类型:java基本数据类型+String
- mapper获取简单类型的一个参数值 #{任意字符}
传多个参数
可使用命名方式或Java对象传参
StudentDao:
package com.sdut.dao;
import com.sdut.entity.Student;
import com.sdut.vo.QueryParam;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface StudentDao {
/**
* 一个简单类型的参数:
* 简单类型:java基本数据类型+String
*
* mapper获取简单类型的一个参数值 #{任意字符}
*/
//根据Id查询
Student selectStudentById(Integer id);
//传入多个参数,使用@Param命名
List<Student> selectMutilParam(@Param("Name") String name, @Param("Age") Integer age);
//传入多个参数,使用Java对象作为参数
List<Student> selectMutilParam2(QueryParam param);
//使用Student类实现👆
List<Student> selectMutilParam3(Student student);
//查询所有
List<Student> selectAllStudents();
//插入
int insertStudent(Student student);
//删除
int deleteStudentById(Integer id);
}
QueryParam:
package com.sdut.vo;
public class QueryParam {
private String paramName;
private Integer 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;
}
}
StudentDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sdut.dao.StudentDao">
<!-- parameterType不加影响运行速度 -->
<select id="selectStudentById" parameterType="integer" resultType="com.sdut.entity.Student">
select * from student where id=#{id}
</select>
<!-- 多个参数,使用@Param命名 -->
<select id="selectMutilParam" resultType="com.sdut.entity.Student">
select * from student where name=#{Name} or age=#{Age}
</select>
<!--
多个参数,使用Java对象属性值,作为参数实际值
完整语法格式(很少用):#{属性名, javaType=类型名称, jdbcType=数据类型}
javaType: Java中属性数据类型
jdbcType: 数据库中的数据类型
例如:name=#{paramName, javaType=java.lang.String,jdbcType=VARCHAR}
or age=#{paramAge, javaType=java.lang.Integer, jdbcType=INTEGER}
利用反射机制可简化操作:
简化版:#{属性名} javaType, jdbcType反射可获取,不用提供
例如:name=#{paramName} or age=#{paramAge}
-->
<select id="selectMutilParam2" resultType="com.sdut.entity.Student">
select * from student where name=#{paramName} or age=#{paramAge}
</select>
<select id="selectMutilParam3" resultType="com.sdut.entity.Student">
select * from student where name=#{name} or age=#{age}
</select>
<insert id="insertStudent">
insert into student values(#{id}, #{name}, #{email}, #{age})
</insert>
<select id="selectAllStudents" resultType="com.sdut.entity.Student">
select * from student order by id
</select>
<delete id="deleteStudentById" parameterType="integer">
delete from student where id=#{id}
</delete>
</mapper>