day14–【Mybatis】动态代理–接口与实现类与代理
接口与实现类与代理
若有一个接口,怎么实现接口?
方法1:编写实现类文件
public interface MyDao{
public void save();
}
//编写实现类文件
public class MyDaoClass implements MyDao{
public void save(){
System.out.println("Hello");
//sql
//jdbc
}
}
方法2:使用动态代理在内存中生成实现类,但没有对应的.java,.class文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020092609032453.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlblZpY3Rvcnk=,size_16,color_FFFFFF,t_70#pic_center
动态代表类存在内存里,不在硬盘上,我们看不见
接口
//com.wzx.dao.UserDao.findById
//com.wzx.dao.UserDao.findById
public interface UserDao {
public User findById(int id);
}·
public class Test01Proxy {
@Test
public void test01(){
SqlSession sqlSession = MySessionUtils.getSession();
//select * from user where id =1;
UserDao dao = sqlSession.getMapper(UserDao.class);//内部就使用你编写接口来生成代理对象
//代理对象的方法内部 查询sql,并且执行jdbc代码
User user = dao.findById(1);
System.out.println(user);
//定义接口
sqlSession.close();
}
}
核心文件配置加载
<?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">
<!--
使用代理以后 当前的映射文件要与接口同名,并且放在同一个位置
使用代理以后 namespace要求写接口的全类名 包名+类名=全类名
UserDao-->
<mapper namespace="com.wzx.dao.UserDao">
<!-- 使用代理以后id必须是方法名-->
<select id="findById" parameterType="int" resultType="com.wzx.bean.User">
select * from user where id =#{id};
</select>
</mapper>
<!-- 配置多个映射文件-->
<mappers>
<mapper resource="UserMapper.xml"/>
<mapper resource="com/wzx/dao/UserDao.xml"/>
</mappers>
根据用户名模糊查询
(1)定义接口中的方法
(2)语句
(3)配置
(4)通过session.getMapper()返回的对象不是实现类对象
@Test
public void test02(){
SqlSession sqlSession = MySessionUtils.getSession();
//返回的是实现接口的实现类对象,动态代理生成,在内存中
UserDao dao = sqlSession.getMapper(UserDao.class);
//搜索名字
List<User>list=dao.findByKeyWord("张%");
System.out.println(list);
//定义接口
sqlSession.close();
}
//com.wzx.dao.UserDao.findById
public interface UserDao {
public User findById(int id);
//select * from user where username like '张%'
List<User> findByKeyWord(String s);
}
<select id="findByKeyWord" parameterType="string" resultType="com.wzx.bean.User">
select * from user where username like #{keyword}
</select>
删除数据
(1)定义接口中的方法
(2)语句
(3)配置
(4)通过session.getMapper()返回的对象不是实现类对象
@Test
public void test03(){
SqlSession sqlSession = MySessionUtils.getSession();
//返回的是实现接口的实现类对象
UserDao dao = sqlSession.getMapper(UserDao.class);
//删除
dao.deleteById(16);
//
sqlSession.commit();
sqlSession.close();
}
//com.wzx.dao.UserDao.findById
public interface UserDao {
//delete from user where id = 16;
void deleteById(int id);
}
<delete id="deleteById" parameterType="int">
delete from user where id = #{id};
</delete>
(1)定义接口中的方法
(2)语句
(3)配置
(4)通过session.getMapper()返回的对象不是实现类对象
插入数据
@Test
public void test04(){
SqlSession sqlSession = MySessionUtils.getSession();
//返回的是实现接口的实现类对象
UserDao dao = sqlSession.getMapper(UserDao.class);
User user = new User();
user.setId(100);
user.setUsername("jackjhone");
user.setAddress("北京");
user.setBirthday(new Date());
dao.saveUser(user);
//
sqlSession.commit();
sqlSession.close();
}
//com.wzx.dao.UserDao.findById
public interface UserDao {
//insert into user value(null,#{username},#{birthday},#{sex},#{address})
void saveUser(User user);
}
<insert id="saveUser" parameterType="com.wzx.bean.User">
insert into user value(null,#{username},#{birthday},#{sex},#{address})
</insert>
给类名起别名
比如上面User.xml文件中的parameterType="com.wzx.bean.User"很长,可以起别名
<typeAliases>
<!-- <typeAlias type="com.wzx.bean.User" alias="user"></typeAlias> -->//alias:别名,以后直接用user,不用com.wzx.bean.User
// 若是有很多个实体类: 一个类一个标签太麻烦
// <typeAlias type="com.wzx.bean.User" alias="user"></typeAlias>
// <typeAlias type="com.wzx.bean.Student" alias="user"></typeAlias>
// <typeAlias type="com.wzx.bean.Teacher" alias="user"></typeAlias>
//将类统一放到一个包底下,直接扫描包,包扫描策略
<package name="com.wzx.bean"/>
</typeAliases>