MyBatis 原始dao与mapper代理

一.原始Dao开发 

 原始Dao开发,我们需要些dao接口和dao的实现类,向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession。

public class UserDaoImpl implements UserDao {

	// 需要向dao实现类中注入SqlSessionFactory
	// 这里通过构造方法注入
	private SqlSessionFactory sqlSessionFactory;

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

	@Override
	public User findUserById(int id) throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();

		User user = sqlSession.selectOne("test.findUserById", id);

		// 释放资源
		sqlSession.close();

		return user;

	}
上述代码中的

User user = sqlSession.selectOne("test.findUserById", id);

1.sqlSession方法,将statement的id硬编码

2.sqlSession方法id应该是int,但是当传入String类型的时候,因为该方法使用泛型,编译阶段不会出错,不利于开发


二.mapper代理开发

我们编写mapper.xml映射文件, mybatis可以自动生成mapper接口实现类代理对象。但是mapper代理的实现,需要遵循以下4个开发规则

1、在mapper.xml中namespace等于mapper接口地址

<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 
注意:使用mapper代码方法开发,namespace要等于mapper接口地址 -->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">

2、mapper.java接口中的方法名和mapper.xml中statement的id一致

mapper.java接口方法

	//根据id查询用户
	public User findUserById(int id) throws Exception;
mapper.xml中statement的id

	<select id="findUserById" parameterType="int"
		resultType="cn.itcast.mybatis.po.User">
		select * from USER where id = #{id}
	</select>

3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

  在规则2的代码中可以看出


4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

 同规则2的代码


完整代码

  Usermapper接口

package cn.itcast.mybatis.mapper;
import java.util.List;

import cn.itcast.mybatis.po.User;

/**
 * UserMapper 2016年9月21日18:00:30
 * mapper接口,相当于dao接口
 * @author fxq
 *
 */
public interface UserMapper {
	//根据id查询用户
	public User findUserById(int id) throws Exception;
	//查询多条记录
	public List<User> findUserByName(String name) throws Exception;
	//添加用户信息
	public void insertUser(User user) throws Exception;
	//删除用户信息
	public void deleteUser(int id) throws Exception;
}

  UserMapper.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">

<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 
注意:使用mapper代码方法开发,namespace有特殊重要的作用 -->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
	<!-- 在映射文件中配置很多sql语句 -->
	<!-- 需求:通过id查询用户表的记录 -->
	<!-- 通过select执行数据库的查询 -->
	<!-- id:标识映射文件中的sql -->
	<!-- 将sql语句封装到mappedStatement对象中,所以将id成为statement 的id -->

	<select id="findUserById" parameterType="int"
		resultType="cn.itcast.mybatis.po.User">
		select * from USER where id = #{id}
	</select>
	<!-- 自定义条件查询用户列表 -->
	<!-- resultType:指定就是单条记录所映射的java对象类型 -->
	<select id="findUserByName" parameterType="java.lang.String"
		resultType="cn.itcast.mybatis.po.User">
		select * from USER where username like '%${value}%'
	</select>

	<!-- 添加用户 parameterType:指定输入参数类型是pojo(包括:用户信息) #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值; -->
	<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
		<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
			SELECT
			LAST_INSERT_ID()
		</selectKey>
		insert into USER (id,username,birthday,sex,address)
		values(#{id},#{username},#{birthday},#{sex},#{address})
	</insert>

	<!-- 删除 -->
	<delete id="deleteUser" parameterType="java.lang.Integer">
		delete from USER WHERE id
		= #{id}
	</delete>
	<!-- 更新 -->
	<update id="updateUser" parameterType="cn.itcast.mybatis.po.User">
		update USER set username =
		#{username},birthday=#{birthday},sex=#{sex},address=#{address} where
		id = #{id}
	</update>
</mapper>

  测试类

package cn.itcast.mybatis.mapper;

import java.io.InputStream;
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 org.junit.Before;
import org.junit.Test;
import cn.itcast.mybatis.po.User;

public class UserMapperTest {

	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void setUp() throws Exception{
		//创建sqlSessionFactory
		String resource= "SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	@Test
	public void testFindUserById() throws Exception {
		
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//创建UserMapper对象,mybatis自动生成mapper代理对象;
		<strong>UserMapper userMapper=sqlSession.getMapper(UserMapper.class);</strong>
		User user = userMapper.findUserById(1);		
		System.out.println(user);
	}

}

三.总结

  mapper代理开发遵循一定的开发规范,减少了错误的概率,提高了开发效率。同时对于数据类型的控制,从原始Dao的运行阶段到了mapper代理的编译阶段,更利于开发。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
DaoMapper是两个不同的概念,但在Java开发中常常被混淆使用。 Dao(Data Access Object)是一种设计模式,用于封装对数据库的访问操作。它提供了一种抽象层,将业务逻辑与数据访问逻辑分离,使得代码更加清晰和可维护。Dao层通常包含了对数据库的增删改查等操作方法MapperMyBatis框架中的一个概念,它是用于定义数据库操作的接口。Mapper接口中的方法对应了具体的SQL语句,通过MyBatis框架的配置文件将Mapper接口与SQL语句进行映射。Mapper接口的实现由MyBatis框架自动生成,开发人员只需要编写Mapper接口的定义即可。 在MyBatis中,通常将Dao层称为Mapper层,因为Mapper接口的定义和Dao层的职责相似,都是用于封装对数据库的访问操作。因此,DaoMapper在这种情况下可以互换使用。 总结来说,Dao是一种设计模式,用于封装对数据库的访问操作;而MapperMyBatis框架中用于定义数据库操作的接口。在MyBatis中,通常将Dao层称为Mapper层。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [MyBatis开发Dao原始Dao开发和Mapper动态代理开发](https://blog.csdn.net/qq_44543508/article/details/97240307)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Mapperdao](https://blog.csdn.net/qq_42320804/article/details/111146378)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值