一个考试网站怎么做,品牌建设10阶梯,wordpress虚拟资源主题,策划推广方案目录
1、映射器简介
#xff08;1#xff09;什么是mapper动态代理#xff1f;
#xff08;2#xff09;动态代理的规范
#xff08;3#xff09;如何使用动态代理
#xff08;4#xff09;为什么学映射器
#xff08;5#xff09;映射器与接口
#xff08;…目录
1、映射器简介
1什么是mapper动态代理
2动态代理的规范
3如何使用动态代理
4为什么学映射器
5映射器与接口
6映射器的引入
7映射器的组成
2、select元素
1select元素结构
2示例代码
3输出pojo对象简单参数pojo参数
4多个参数传递
3、insert元素
1insert元素结构
2主键回填
4、update元素和delete元素
1update元素
2delete元素
5、resultMap元素
1为什么要使用resultMap元素
2resultMap元素的结构
3使用POJO存储结果集
6、多表联查
1什么是联查
2一对一级联步骤
3一对一级联映射
4一对多级联步骤
5一对多级联
6级联的缺陷 1、映射器简介
1什么是mapper动态代理 在接口中有方法的返回值定义参数的定义方法名在sqlMapper.xml中也对应这接口给予了赋值这时候dao的实现类就显得多余这是Mybatis可以帮助我们自动产生实现类并可以调取方法得到结果这就是Mybatis的mapper动态代理。 2动态代理的规范 Mapper接口开发方法只需要程序员编写Mapper接口相当于Dao接口由Mybatis框架根据接口定义创建接口的动态代理对象代理对象的方法体同上边Dao接口实现类方法。 相当于是你在Mapper层声明方法在xml中去实现sql代码逻辑。 相当于是一个接口文件对应一个xml文件而且必须名字相同。 也就是方法名和id名也必须相同才能映射到Mapper接口开发需要遵循以下规范 Mapper.xml文件中的namespace与mapper接口的类路径相同。Mapper接口方法名和Mapper.xml中定义的每个statement的id相同。Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同。Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同。 3如何使用动态代理 使用SqlSession的方法getMapper()让Mybatis自动生成对应接口的实现对象。 首先是DaoUtil层它封装了一些加载配置文件、构建工厂、创建SqlSession对象等操作和关闭资源等操作。
public class DaoUtil {private static SqlSessionFactory factory;static {try {// 1.加载配置文件// 加载 MyBatis 配置文件 mybatis-config.xml。配置文件中包含了数据库连接信息和 MyBatis 的各种设置InputStream stream Resources.getResourceAsStream(mybatis-config.xml);// 2.构建工厂factory new SqlSessionFactoryBuilder().build(stream);} catch (IOException e) {e.printStackTrace();}}public static SqlSession getSqlSession() {// 从 SqlSessionFactory 中打开一个新的 SqlSession。SqlSession 是 MyBatis 的核心接口之一用于执行 SQL 命令、获取映射器以及管理事务。return factory.openSession();}public static void closeResource(SqlSession sqlSession) {// 释放资源sqlSession.close();}}然后是测试类中调用DaoUtil方法来实现动态代理的使用。
public static void main(String[] args) {SqlSession sqlSession DaoUtil.getSqlSession();StudentMapper stuMapper sqlSession.getMapper(StudentMapper.class);ListStudent blist stuMapper.findAllStudentAndClassOneTable(2);for(Student s : blist) {System.out.println(s);}DaoUtil.closeResource(sqlSession);} 其中包含的方法有 selectOne和selectList动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定如果返回list则调用 selectList方法如果返回单个对象则调用selectOne方法。如果是返回学生列表List则调用selectList()如果是返回学生单个则调用selectOne()。 namespacemybatis官方推荐使用mapper代理方法开发mapper接口程序员不用编写mapper接口实现类使用mapper代理方法时输入参数可以使用pojo包装对象或map对象保证dao的通用性。 4为什么学映射器 半自动化的体现配置 SQL 语句体现了半自动化和灵活性。 ORM的体现对象关系映射的实现数据库表和POJO类的映射关系。 5映射器与接口 映射器配置文件和接口绑定配置文件名对应接口名id属性值对应方法名。 6映射器的引入 文件路径用相对路径引入映射器
mapper resource ”com/codeup/dao/Mapper.xml”/XML用文件定位符引入映射器
mapper url ”file:///var/mappers/Mapper.xml”/ 包名用包名引入映射器
package name ”com.codeup.dao.Mapper”/类注册用类名引入映射器
mapper class ”com.codeup.mapper.NewsMapper”/ 7映射器的组成 2、select元素
1select元素结构 属性说明id唯一标识接口中的方法名parameterType参数的类型resultType结果的类型resultMap复杂的结果集映射关系 2示例代码 通过班级编号来查询一个学生 StudentMapper接口封装的抽象方法
public Student findStudentBySid(int sid); StudentMapperXML对应的映射器XML代码中
select id findStudentByClassid parameterTypeint resultTypestudent select * from student where classid #{v}
/select 这里的id就是接口抽象方法的方法名parameterType对应的就是传进来的参数要查找几班的学生resultType就是返回的类型查询到的具体学生。 #{v}是用来处理参数占位符的。它会将传入的参数值安全地替换到 SQL 语句中防止 SQL 注入攻击。在XML文件中配置文件中利用 parameterType 属性设置参数类型利用 #{}设置参数的使用及位置。在接口中接口中按照方法的入参方式指定参数类型和参数名称。 3输出pojo对象简单参数pojo参数 在使用 MyBatis 或 Hibernate 等 ORM 框架时POJO 类通常表示数据库中的表记录。 在我们写XML映射器代码时会有一些逻辑的判断但是在XML中不能用java中的常规条件符号来写需要用替换符号来完成逻辑的判断。 如果条件有 可以使用转义字符进行代替 示例代码
select idfindStudentBigSid parameterTypeint resultTypestudentselect * from student where sid lt; #{v}
/select 例如这段代码用lt就可以实现查找小于指定sid的学生信息。 4多个参数传递 方法1Map方式不推荐 耦合度太高 比如说现在我们有一个对学生进行查询并且以表联查的方式对应着学生班级一对一查询再对其结果进行分页但是我们的映射器parameterType只能传入一个参数呢该怎么办呢这时候就可以传入一个Map集合把我们想要传进入的值都放在Map里面。 接口代码
public ListStudent findStudentByClassidAndSsexLimit(MapString, Object map); XML代码
select idfindStudentByClassidAndSsexLimit parameterTypemap resultTypestudentselect * from student where classid #{bj} and ssex #{xb} limit #{wz},#{bc}
/select 这里就将map传递进入按照map传进去的不同的类型对应着完成sql语句的拼接。但是如果表结构发生变化或者参数名称改变都会要重新维护代码所以耦合度很高。 方法2JavaBean方式推荐但只能查看实体类所有属性值 如果你要通过班级id和性别来查看一个学生的信息呢我们完全可以实例化一个学生对象通过给里面的参数赋值来传入映射其中完成查询。 接口代码
public ListStudent findStudentByClassidAndSsex(Student s); XML代码
select id findStudentByClassidAndSsex parameterTypestudent resultTypestudentselect * from student where classid #{classid} and ssex #{ssex}
/select 方法3param数 推荐Map和key固定 可以通过param数来进行传递多参param相当于Map但是它的key是固定的值不是固定的key从1开始往后递增。 接口代码
public ListStudent findStudentByClassidAndSsexlimitParam(int classid, String sex, int weizhi, int buchang); XML代码
select idfindStudentByClassidAndSsexlimitParamselect * from student where classid #{param1} and ssex #{param2} limit #{param3},#{param4}
/select 方法4arg数不推荐 可以通过arg数来进行传递多参从0开始依次递增。 接口代码
public ListStudent findStudentByClassidAndSsexlimitArg(int classid, String sex, int weizhi, int buchang); XML代码
select idfindStudentByClassidAndSsexlimitArg resultTypestudentselect * from student where classid #{arg0} and ssex #{arg1} limit #{arg2},#{arg3}
/select 3、insert元素
1insert元素结构 属性说明id唯一标识接口中的方法名parameterType参数的类型keyProperty表示以哪个列作为属性的主键不能和 keyColumn 同时使用keyColumn指明哪一列是主键不能和 keyProperty同时使用useGeneratedKeys使用 JDBC 的 getGeneratedKeys 方式来取有数据库内部生成的主键 2主键回填 主键回填就是当主键在数据库中为自增字段时新增成功后回填主键。相当于有把主键值返回给了当前的实体类对象。 两个属性useGeneratedKeystrue 开启主键回填keyPropertysid 回填的主键给哪个属性。 自定义主键生成规则 selectKey用来预先设定主键值。自定义主键生成规则时可以使用该标签 order属性取值 BEFOREAFTER ; 4、update元素和delete元素
1update元素 属性说明id唯一标识接口中的方法名parameterType参数的类型 2delete元素 属性说明id唯一标识接口中的方法名parameterType参数的类型 5、resultMap元素 当我们给数据库中的表字段创建实体类时因为java和数据库的命名规范不同所以有时候可能会导致字段名和属性不一致的问题。 其中属性smname和字段名sm_name不一致会导致映射不上的问题。 1为什么要使用resultMap元素 定义映射规则ORM的特性POJO 类和数据库的映射关系 级联操作多表存在主外键关系时主表和从表之间的关联操作 类型转换数据库字段的类型和 POJO类属性的类型转换。 2resultMap元素的结构 3使用POJO存储结果集 属性说明property映射到列结果的字段或者属性通常是指 POJO 的属性column对应的数据库字段javaTypeJava 类型可以是基本数据类型也可以是类完全限定名jdbcTypeJDBC 的类型基本支持所有常用的数据库类型 通常来讲property传入的时java中的属性而colum代表的是对应的表中的字段名称。 如果没有做映射处理的话POJO属性和数据库字段不对应的属性就会显示为null。 示例代码错误
select idfindAllSMaster resultTypeSMasterselect * from schoolmaster
/select 查询结果 查询的结果smname为null因为属性名和字段名不对应。 示例代码正确
resultMap typesmaster idsm_mapresult columnsm_name propertysmname/result
/resultMapselect idfindAllSMaster resultMapsm_mapselect * from schoolmaster
/select 查询结果 6、多表联查
1什么是联查 级联cascade是指多个对象之间的映射关系建立数据之间的级联关系提高管理效率。 一对一一个对象对应唯一的对象举例中国公民和身份证 一对多一个对象对应多个对象举例班级和学生 多对多多个对象对应多个对象举例公司角色和公司员工 2一对一级联步骤 3一对一级联映射 以一个学生为例一个学生最多对应一个班级所以一个学生对应一个班级这就是一对一级联。 示例代码 接口代码
public ListStudent findAllStudent(); XML代码
resultMap typestudent idstu_class_Mapresult columnsid propertysid /result columnsname propertysname /result columnbirthday propertybirthday /result columnssex propertyssex /result columnclassid propertyclassid /!-- 一对一 --association propertybj javaTypeBanjiresult columnclassid propertyclassid /result columnclassname propertyclassname //association
/resultMapselect idfindAllStudent resultMapstu_class_Mapselect * from studentleft join class on student.classid class.classid
/select 这样查询就可以实现一个学生对应一个班级的查询。association propertybj代表的是java中属性名为bjjavaTypeBanji这个代码意思是bj的类型为Banji。这一句用于定义一对一关联关系。 4一对多级联步骤 5一对多级联 以一个班级为例一个班级中可以有很多的学生所以如果要以班级为主表来联查就得在实体类中创建一个学生列表来存放学生。但是如果单独用映射器来映射的话只能映射出班级的属性所以要用一对多的步骤来完成对班级内的所有学生的映射操作。 示例代码 接口代码
public ListBanji findAllBanjiAndStu(); XML代码
resultMap typeBanji idbj_class_Mapresult columnclassid propertyclassid/result columnclassname propertyclassname/!-- 1对多 --collection propertystulist ofTypeStudentresult columnsid propertysid/result columnsname propertysname/result columnbirthday propertybirthday/result columnssex propertyssex/result columnclassid propertyclassid//collection
/resultMapselect idfindAllBanjiAndStu resultMap bj_class_Mapselect * from classleft join student on class.classid student.classid
/select 这段代码property是对应java中的属性stulist学生集合映射的对应属性是student的实体类。 6级联的缺陷 使用建议 根据实际情况增加级联关系 多层关联式建议超过三层关联时尽量少用级联