MyBatis 之 使用二 (Mapper接口的使用)

一、在前一篇中,存在一些问题:

1.  没有使用接口编程,Java是面向接口编程语言。应该对数据库操作定义一些接口,调用dao接口完成数据库操作。

public interface UserDao {

	//根据Id查询用户信息
	public User findUserById(int userId) throws Exception;

	//添加用户
	public void insertUser(User user) throws Exception;

	//修改用户
	public void updateUser(User user) throws Exception;

	//删除用户
	public void deleteUser(int userId) throws Exception;
}

public class UserDaoImpl implements UserDao {

	private SqlSessionFactory sqlSessionFactory;

	//通过spring将 SqlSessionFactory 注入,这里没有spring,暂时使用构造方法代替

	public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
		this.sqlSessionFactory = sqlSessionFactory;
	}

	public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
		this.setSqlSessionFactory(sqlSessionFactory);
	}

	@Override
	public User findUserById(int userId) throws Exception {
		SqlSession sqlSession = null;
		User user = null;
		try {
			//通过SqlSessionFactory获取SqlSession
			sqlSession = sqlSessionFactory.openSession();

			//使用session操作数据库
			//selectOne第一个参数:指定sql的id(statement id),注意带上namespace;第二个参数:向sql中传的参数值
			user = sqlSession.selectOne("test.findUserById", userId);

			System.out.println(user);
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if (sqlSession != null) {
				sqlSession.close();
			}
		}

		return user;
	}

	@Override
	public void insertUser(User user) throws Exception {
		SqlSession sqlSession = null;
		try {
			//通过SqlSessionFactory获取SqlSession
			sqlSession = sqlSessionFactory.openSession();

			//使用session操作数据库
			sqlSession.insert("test.insertUser", user);

			//提交事务
			sqlSession.commit();

		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if (sqlSession != null) {
				sqlSession.close();
			}
		}
	}
}

2.  虽然上面改写成Dao接口实现类的方式,但访问sql映射文件中定义的sql时需要调用 SqlSession 的 selectOne() 方法,          并将 sql 的位置(命名空间 + id)和参数传递到 selectOne() 方法中,且第一个参数是长字符串,第二个参数是object          对象,编写代码时出现错误无法 在编译阶段发现。

优化:

第一步:定义UserMapper.xml, 还用原来的不用变

第二步:定义mapper接口

public interface UserMapper {
	//根据Id查询用户信息
	public User findUserById(int userId) throws Exception;

	//添加用户
	public void insertUser(User user) throws Exception;

	//修改用户
	public void updateUserById(User user) throws Exception;

	//删除用户
	public void deleteUserById(int userId) throws Exception;
}

接口定义有以下特点:

a. Mapper 接口方法名和 UserMapper.xml 中定义的每个 sql 的 id 同名。

b. Mapper 接口方法的输入参数类型和 UserMapper.xml 中定义的 sql parameterType 类型相同。

c. Mapper 接口的输出参数类型和 UserMapper.xml 中 定义的 sql 的 resultType 类型相同。

第三步:修改 UserMapper.xml 的namespace

修改后的 namespace 即是 Mapper 接口的类路径。

<mapper namespace="mybatis.mapper.UserMapper">

第四步:通过 Mapper 接口调用statement 去操作数据库

public class UserMapperTest extends TestCase {
	private SqlSessionFactory sqlSessionFactory;

	String resource = "SqlMapConfig.xml";

	//任何测试方法都要执行的方法
	@Override
	protected void setUp() throws Exception {
		super.setUp();
		//通过输入流读取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);

		//获取SqlSessionFactory
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}

	public User testFindUserById() throws Exception {
		//获取SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//指定 mapper 接口的类型,MyBatis通过动态代理的方式实现mapper接口
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

		User user = userMapper.findUserById(100101);

		sqlSession.commit();
		sqlSession.close();

		//查询主键为100101的用户并输出
		System.out.println("user---" + user);

		return user;
	}

	public void testInsertUser() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//指定 mapper 接口的类型,MyBatis通过动态代理的方式实现mapper接口
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

		User user = new User();
		user.setUsername("Dina");
		user.setSex("0");
		user.setBirthday(new Date());
		user.setAddress("Redwood City");
		user.setDetail("good person");
		user.setScore(99.2f);

		userMapper.insertUser(user);
		sqlSession.commit();
		sqlSession.close();
	}

	public void testUpdateUserById() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//指定 mapper 接口的类型,MyBatis通过动态代理的方式实现mapper接口
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

		User user = new User();
		user.setUserId(100102);
		user.setUsername("Golden");
		user.setSex("0");
		user.setBirthday(new Date());
		user.setAddress("Shen zhen");
		user.setDetail("good person");
		user.setScore(89.2f);

		userMapper.updateUserById(user);
		sqlSession.commit();
		sqlSession.close();
	}

	public void testDeleteUserById() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();

		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		userMapper.deleteUserById(100110);

		sqlSession.commit();
		sqlSession.close();
	}
}

总结:

使用 Mapper 接口的方式,不用写接口实现类接口完成数据库操作,简单方便,此方法是官方推荐。

是MyBatis一种很重要的用法。

使用 Mapper 接口调用必须具备以下条件:

  1. Mapper 接口方法名 和 UserMapper.xml 中定义的每个 sql 的 id 同名。
  2. Mapper 接口方法的输入参数类型和 UserMapper.xml 中定义的 sql parameterType 类型相同。
  3. Mapper 接口的输出参数类型和 UserMapper.xml 中 定义的 sql 的 resultType 类型相同。
  4. UserMapper.xml 文件中的 namespace 即是 Mapper 接口的类路径。
时间: 2024-10-10 12:12:08

MyBatis 之 使用二 (Mapper接口的使用)的相关文章

(转)Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring

Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring Mybatis在与Spring集成的时候可以配置MapperFactoryBean来生成Mapper接口的代理. 例如 <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInte

Spring Boot 整合mybatis时遇到的mapper接口不能注入的问题

现实情况是这样的,因为在练习spring boot整合mybatis,所以自己新建了个项目做测试,可是在idea里面mapper接口注入报错,后来百度查询了下,把idea的注入等级设置为了warning,至于怎末设置可以自行百度,这里不再赘述,但是接下来spring boot能够运行起来,但是通过浏览器访问的时候,就会报错,后来也是经过多方查询,发现了问题的原因,特此记录一下: spring  boot整合mybatis时,要将mapper装配到spring容器中,要在mapper接口中加上@M

mybatis入门基础(二)----原始dao的开发和mapper代理开发

阅读目录 一:原始dao开发方法 二:mapper代理方法(只需要mapper接口,相当于dao接口) 承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先苦后甜嘛! 回到顶部 一:原始dao开发方法 概要:1.在上篇中搭建好的框价中编写dao接口和dao实现类 2.向dao接口实现类中注入SqlSessionFactory,在方法体内通过SqlSe

MyBatis 中 Mapper 接口的使用原理

MyBatis 中 Mapper 接口的使用原理 MyBatis 3 推荐使用 Mapper 接口的方式来执行 xml 配置中的 SQL,用起来很方便,也很灵活.在方便之余,想了解一下这是如何实现的,之前也大致知道是通过 JDK 的动态代理做到的,但这次想知道细节. 东西越多就越复杂,所以就以一个简单的仅依赖 MyBatis 3.4.0 的 CRUD 来逐步了解 Mapper 接口的调用. 通常是通过 xml 配置文件来创建SqlSessionFactory对象,然后再获取SqlSession对

Mybatis学习总结二

Mapper动态代理开发方式 实现原理: Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象. Mapper接口开发需要遵循以下规范: 1. Mapper.xml文件中的namespace与mapper接口的类路径相同. 2. Mapper接口方法名和Mapper.xml中定义的每个statement的id相同. 3. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameter

MyBatis学习13-MyBatis使用mapper代理DAO方法进行开发

1.基本思路 需要编写mapper接口和mapper.xml映射文件.编写mapper接口需要遵循一些开发规范,从而让mybatis可以自动生成mapper接口实现类代理对象. a.在mapper.xml中namespace等于mapper接口地址 b.mapper.java接口中的方法名和mapper.xml中statement的id一致 c.mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致 d.mapper.j

mybatis的基本配置:实体类、配置文件、映射文件、工具类 、mapper接口

搭建项目 一:lib(关于框架的jar包和数据库驱动的jar包) 1,第一步:先把mybatis的核心类库放进lib里 2,第二步:导入第三方类库(在lib里).mybatis的核心类库在运行时还依赖一些第三方类库 3,第三步:导入连接数据库驱动jar包 二:创建mybatis的配置文件 1,第一步:先创建实体包,对照着表结构把实体类写出来.封装好就是写get,set方法------不像hibernate,可以自动的将表名字段名与实体类相对应,不用自己手写实体类与映射文件 2,第二步:创建xml

mybatis如何根据mapper接口生成其实现类

mybatis系列 SpringBoot集成mybatis mybatis的statement的解析与加载 mybatis如何根据mapper接口生成其实现类 mybatis的mapper返回map结果集 mybatis结果的组装 序 mybatis里头给sqlSession指定执行哪条sql的时候,有两种方式,一种是写mapper的xml的namespace+statementId,如下: public Student findStudentById(Integer studId) { log

MyBatis的Mapper接口以及Example的实例函数及详解

来源:https://blog.csdn.net/biandous/article/details/65630783 一.mapper接口中的方法解析 mapper接口中的函数及方法 方法 功能说明 int countByExample(UserExample example) thorws SQLException 按条件计数 int deleteByPrimaryKey(Integer id) thorws SQLException 按主键删除 int deleteByExample(Use