03.MyBatis基于代理 Dao 实现 CRUD 操作

前提要求

  1. 持久层接口和持久层的映射配置必须在相同的包下(目录相同)
  2. 持久层映射配置中 mapper 标签的 namespace 属性取值必须是持久层接口的全限定类名(我的理解:当方法名相同时,用了做映射依据)
  3. SQL 语句的配置标签< select >,< insert >,< delete >,< update >的 id 属性必须和持久层接口的方法名相同

实体类

@Data
public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
}

根据id查询

  • 在持久层接口中添加 findById 方法
	User findById(Integer userId); 
  • 在用户的映射配置文件中配置
	<!--
		resultType :
			用于指定结果集的属性
		parameterType :
			指定传入参数的类型,如果是包装类,要写明具体的包,比如java.lang.Integer
		#{}介绍:
			表示占位符,相当于原来 jdbc 的‘?’(问号),都是用于执行语句时替换的数据,具体的数据有#{}里面的内容决定
		#{}中内容的写法:
			 ognl 表达式:语法格式就是使用  #{对象.对象}的方式 
			 #{user.id}它会先去找 user 对象,然后在 user 对象中找到 id 属性,并调用 getid()方法把值取出来。
			 但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user. 而直接写 id
	-->
    <select id="findByUserId" resultType="com.zsc.domain.User" parameterType="int">
        select * from user where id = #{id}
    </select>

模糊查询

  • 在持久层接口中添加模糊查询方法
	List<User> findByName(String username); 
  • 在用户的映射配置文件中配置
	<!--实现模糊查询,username的值要在调用方法时放在两个%中间-->
	<!--比如说findByName("%王%")-->
    <select id="findByName" resultType="com.zsc.domain.User" parameterType="String">
        select * from user where username like #{username}
    </select>
  • 模糊查询的另一种配置方式
	<!--${value}的写 法就是固定的,不能写成其它名字-->
	<!--相当于把value拼接到两个%中间-->
    <select id="findByName" resultType="com.zsc.domain.User" parameterType="String">
        select * from user where username like '%${value}%'
    </select>
  • #{}与${}的区别
      #{}表示一个占位符号 ,通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换, #{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称
       $ {}表示拼接 sql 串,通过 $ {}可以将 parameterType 传入的内容拼接在 sql中且不进行 jdbc 类型转换, $ {}可以接收简 单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值, ${} 括号中只能是 value

查询使用聚合函数

  • 在持久层接口中添加模糊查询方法
	int findTotal(); 
  • 在用户的映射配置文件中配置
	<select id="findTotal" resultType="int"> 
		select count(*) from user; 
	</select>

保存

  • 在持久层接口中添加新增方法
	int saveUser(User user); 
  • 在用户的映射配置文件中配置
	<!--
		标签属性和上面的查询一样
	-->
    <insert id="saveUser" parameterType="com.zsc.domain.User">
        insert into user(username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
    </insert>
  • 问题扩展:新增用户 id 的返回值
    <insert id="saveUser" parameterType="com.zsc.domain.User">
        <!-- 配置保存时获取插入的 id -->
        <selectKey keyColumn="id" keyProperty="id" resultType="int">
           select last_insert_id();
        </selectKey>
        insert into user(username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
    </insert>

更新

  • 在持久层接口中添加更新方法
	int updateUser(User user); 
  • 在用户的映射配置文件中配置
    <update id="updateUser" parameterType="com.zsc.domain.User">
        update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
    </update>

删除

  • 在持久层接口中添加删除方法
	int deleteUser(Integer userId); 
  • 在用户的映射配置文件中配置
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id = #{id}
    </delete>

测试

  • 这里只列出读取配置文件、创建工厂及获取代理对象的代码,具体的方法调用省略
	// 读取配置文件
	InputStream in = Resources.getResourceAsStream("sqlMapconfig.xml");
	// 创建 SessionFactory 工厂
	SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
	SessionFactory factory = builder.build(in);
	// 使用工厂生成 SqlSession 对象
	SqlSession session = factory.openSession();
	// 使用SqlSession创建dao接口的代理对象
	IUserDao userDao = getMapper(IUserDao.class);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值