Mybatis-Mapper代理

1.Hibernate和Mybatis简单对比

Hibernate

适用于需求变化不大的中小型项目,比如:后台管理系统,ERP,OA系统等。
适用于数据库变更频繁,或者要求支持多数据库的情况。
出现bug调试时,要求技术人员对Hibernate有较深的立即。

Mybatis:
适用于需求变化较多的项目,比如新出的系统等。
适合于性能要求,数据库单一的情况。
框架简单,出问题好修改,要求开发人员对sql有掌握。
2.使用Mybatis利用传统DAO开发的问题
1. SqlSession是线程不安全的,只能作为局部变量使用,DAO实现方法中存在大量的重复代码,获取sqlSession,关闭sqlSession等。
2.调用sqlSession执行SQL操作时,将statement的ID直接写到代码中。硬编码不利于维护。
3.调用sqlSession方法时传入的变量是Object泛型参数,在编译阶段不会报错。
3.使用Mapper代理
Mapper代理方法规范总结:
1.xxxMapper.xml中namespace必须是xxxMapper.java的全类名。
2.xxxMapper.xml中Statement的id需要和xxxMapper.java中方法名保持一致。
3.xxxMapper.xml中statement的parameterType指定输入参数的类型和xxxMapper.java的方法输入参数类型保持一致。
4.xxxMapper.xml中的statement的resultType指定的类型和xxxMapper.java的方法返回值类型一致。


sqlMapConfig.xml 整体环境配置,mapper文件指定
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <!-- 与Spring整合后environment将不需要再配置 -->
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/high"/>
        <property name="username" value="root"/>
        <property name="password" value="1234"/>
      </dataSource>
    </environment>
  </environments>
  
  <mappers>
    <mapper resource="mapper/studentMapper.xml"/>
  </mappers>
</configuration>
Mapper接口根据一定的规范,通过对应的mapper.xml映射文件来自动实现代理对象。通过以下两个步骤实现:
1)编写mapper.xml
规则:配置文件中的mapper的namespace必须是mapper接口的全类名。
2)编写mapper接口
mapper接口中的方法名必须是配置文件中定义的statement id,接口方法的参数类型必须是配置文件中指定的parameterType返回值类型必须是resultType的类型。
studentMapper.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="dao.StudentMapper">
	<!-- id可以理解为标识sql statement的唯一标识 -->
	<!--
		MyBatis中占位符的表达方式同SpringMVC的EL表达式类似,#{}中可以使用任意的形参。
		resultType指定需要映射的类型。
	 -->
	<select id="findStudentByName" parameterType="String" resultType="mybatis.Student">
		select * from student where name = #{value}
	</select>
	
	<!-- 注意 parameterType仍然是Student,通过ONGL来解析对应的属性 -->
	<!-- selectKey 将插入操作生成的自增主键值设定到parameterType的属性中。 -->
	<insert id="insertStudent" parameterType="mybatis.Student">
		<selectKey keyProperty="id" order="AFTER" resultType="int">
			select last_insert_id();
		</selectKey>
		insert into student(name, age) values(#{name}, #{age});
	</insert>
	
	<update id="updateStudent" parameterType="mybatis.Student">
		update student set name=#{name} where id=#{id};
	</update>
	
	<delete id="deleteStudentById" parameterType="java.lang.Integer">
		delete from student where id=#{id};
	</delete>
</mapper>
StudentMapper.java 根据studentMapper.xml中定义的statement语句来写Mapper接口
package dao;

import java.util.List;

import mybatis.Student;

//注意Mapper方法中的参数只能有一个,如果有多种数据时,可以通过POJO进行包装一个。
//即定义一个类,专门用来作为参数,这个参数的属性就是想操作的数据。
public interface StudentMapper {
	public List<Student> findStudentByName(String name) throws Exception;
	public void insertStudent(Student student) throws Exception;
	public void updateStudent(Student student) throws Exception;
	public void deleteStudentById(int id) throws Exception;
}

接口写完后,可以通过MyBatis自动生成代理类。这样不需要手动些Impl类,即可直接使用。
MybatisTest.java

package mybatis;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import dao.StudentMapper;

public class MybatisTest {
	public static void main(String[] args) throws IOException{
		//指定mybatis的配置文件
		InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
		
		//得到 SqlSessionFactory接口引用 用来创建SqlSession接口引用
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
		SqlSession sqlSession = sqlSessionFactory.openSession(true);
		StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
		
		Student forInsert = new Student(0, "Lucy", 20);  //追加新用户Lucy,Id自动生成
		Student forUpdate = new Student(33, "Lily", 20); //将ID为33的学生,更名为Lily
		try {
			studentMapper.insertStudent(forInsert); //插入数据
			studentMapper.deleteStudentById(22);    //删除ID为22的数据
			studentMapper.updateStudent(forUpdate); //将ID为forUpdate的数据的名字更新为forUpdate的名字。
			List<Student> list = studentMapper.findStudentByName("Lily"); //查询
			System.out.println(list);		
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

<完>
### 回答1: 这个问题可能是由于使用了过时的DTD(Document Type Definition)文件导致的。DTD文件是用于定义XML文档结构的文件,而mybatis.org网站上的mybatis-3-mapper.dtd文件已经过时了。 如果在使用MyBatis时出现了这个问题,建议使用最新版本的MyBatis,并更新DTD文件。可以从MyBatis官方网站上下载最新版本的DTD文件,或者在MyBatis配置文件中使用以下URL来引用最新的DTD文件: http://mybatis.org/dtd/mybatis-3-mapper.dtd 这样可以避免DTD文件过时导致的问题。 ### 回答2: http://mybatis.org/dtd/mybatis-3-mapper.dtd爆红,是因为这个链接是一个 DTD(Document Type Definition)文件的链接。DTD 文件是一种用来定义 XML 文档结构的文件,它定义了元素和属性的规则,以及规定了它们之间的关系和约束。 然而,DTD 在现代的 XML 开发中已经被多数人弃用,因为它具有一些局限性。首先,DTD 不支持命名空间,这意味着在一个文件中定义的元素和属性可能会与其他文件中定义的相冲突。其次,DTD 不支持数据类型的定义,因此无法对数据进行更加精确的限制。最后,DTD 的语法相对较为复杂,不够直观和易读。这些因素导致了 DTD 在实际开发中的使用减少。 因此,建议在开发过程中不要使用 DTD 来定义 XML 文档结构,而是选择使用其他更为先进的替代方案,比如 XML Schema 或 Relax NG。这些替代方案具有更强大和灵活的功能,可以满足各种不同的需求。此外,对于 MyBatis 框架来说,它已经提供了更现代化的配置方式,可以直接使用 XML 或注解的方式来配置 SQL 映射,而无需依赖于 DTD 文件。 总之,http://mybatis.org/dtd/mybatis-3-mapper.dtd爆红主要是因为 DTD 过时且不推荐使用,开发者应该转向更加先进和强大的替代方案,以提高开发效率和代码质量。 ### 回答3: http://mybatis.org/dtd/mybatis-3-mapper.dtd 爆红的原因可能有以下几点: 1. 链接失效:链接地址所对应的DTD文件可能已经从服务器中移除或修改,导致无法访问。这可能是因为文件被移动到了新的位置,或者服务器不再提供该DTD文件的访问。 2. 版本不匹配:如果使用的是不兼容的MyBatis版本,可能会导致无法正确解析DTD文件。检查使用的MyBatis版本与DTD文件的兼容性,确保版本匹配。 3. 网络问题:可能是由于网络连接问题,无法正常下载DTD文件。可以尝试使用其他网络环境或者代理服务器重新访问链接,确认是否可以正常下载。 解决这个问题的方法可以是: 1. 更新链接地址:尝试在官方网站或其他可信来源中查找最新的DTD文件链接,并将链接地址替换为最新版本的DTD文件地址。 2. 修改MyBatis配置:在MyBatis的配置文件中,可以指定一个本地的DTD文件地址,而不是直接调用网络上的DTD文件。将DTD文件下载到本地,指定本地DTD文件地址可以规避因网络问题导致的无法访问的情况。 3. 切换版本:如果无法解决版本不匹配的问题,可以尝试切换到与DTD文件兼容的MyBatis版本,确保能够正确解析DTD文件。 总之,爆红的原因可能是由于链接失效、版本不匹配或网络问题等,可以根据具体情况逐一排查并采取相应的解决方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值