##Mybatis框架之—— 基于代理 Dao 实现 CRUD 操作

Mybatis框架之—— 基于代理 Dao 实现 CRUD 操作

  • 使用要求:
  1、持久层接口和持久层接口的映射配置必须在相同的包下   2、持久层映射配置中 mapper 标签的 namespace 属性取值必须是持久层接口的全限定类名   3、SQL 语句的配置标签<select>,<insert>,<update>,<delete>的 id 属性必须和持久层接口的方法名相同。   ##1,在持久层接口中添加,(根据id查询),(新增),(删除),(修改)方法
/**
* 根据 id 查询
* @param userId
* @return
*/
User findById(Integer userId);
/**
* 保存用户
* @param user
* @return 影响数据库记录的行数
*/
int saveUser(User user);
/**
* 更新用户
* @param user
* @return 影响数据库记录的行数
*/
int updateUser(User user);
/**
* 根据 id 删除用户
* @param userId
* @return
*/
int deleteUser(Integer userId);

  ##2,在用户的映射文件中配置

<!-- 根据 id 查询 -->
<select id="findById" resultType="com.itheima.domain.User" parameterType="int">
  select * from user where id = #{uid}
</select>
<!-- 保存用户-->
<insert id="saveUser" parameterType="com.itheima.domain.User">
  insert into user(username,birthday,sex,address) 
values(#{username},#{birthday},#{sex},#{address})
</insert>
<!-- 更新用户 -->
<update id="updateUser" parameterType="com.itheima.domain.User">
  update user set username=#{username},birthday=#{birthday},sex=#{sex},
address=#{address} where id=#{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
  delete from user where id = #{uid}
</delete>
  resultType 属性:用于指定结果集的类型。   parameterType 属性:用于指定传入参数的类型。   sql 语句中使用#{}字符:它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。具体的数据是由#{}里面的内容决定的。     #{}中内容的写法:由于我们保存方法的参数是 一个 User 对象,此处要写 User 对象中的属性名称。 它用的是 ognl 表达式。   ognl 表达式:它是 apache 提供的一种表达式语言,全称是:Object Graphic Navigation Language 对象图导航语言,它是按照一定的语法格式来获取数据的。   #{user.username}它会先去找 user 对象,然后在 user 对象中找到 username 属性,并调用getUsername()方法把值取出来。但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user.而直接写 username。

  ##3,测试方法:

public class MybastisCRUDTest {
  private InputStream in ;
  private SqlSessionFactory factory;
  private SqlSession session;
  private IUserDao userDao;
  @Test
  public void testFindOne() {
    //6.执行操作
    User user = userDao.findById(41);
    System.out.println(user);
  }
  @Before//在测试方法执行之前执行
  public void init()throws Exception {
    //1.读取配置文件
    in = Resources.getResourceAsStream("SqlMapConfig.xml");
    //2.创建构建者对象
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    //3.创建 SqlSession 工厂对象
    factory = builder.build(in);
    //4.创建 SqlSession 对象
    session = factory.openSession();
    //5.创建 Dao 的代理对象
    userDao = session.getMapper(IUserDao.class);
  }
  @After//在测试方法执行完成之后执行
  public void destroy() throws Exception{
    session.commit();
    //7.释放资源
    session.close();
    in.close();
  }
}

  保存数据

@Test
public void testSave(){
  User user = new User();
  user.setUsername("modify User property");
  user.setAddress("北京市顺义区");
  user.setSex("男");
  user.setBirthday(new Date());
  System.out.println("保存操作之前:"+user);
  //5.执行保存方法
  userDao.saveUser(user);
  System.out.println("保存操作之后:"+user);
}
  切记:session.commit();   更改数据:
@Test
public void testUpdateUser()throws Exception{
  //1.根据 id 查询
  User user = userDao.findById(52);
  //2.更新操作
  user.setAddress("北京市顺义区");
  int res = userDao.updateUser(user);
  System.out.println(res);
}

  删除数据:

@Test
public void testDeleteUser() throws Exception {
  //6.执行操作
  int res = userDao.deleteUser(52);
  System.out.println(res);
}

二,还有一个模糊查询:

/**
* 根据名称模糊查询
* @param username
* @return
*/
List<User> findByName(String username);

在映射配置文件中的配置:

<!-- 根据名称模糊查询 -->
<select id="findByName" resultType="com.itheima.domain.User" parameterType="String">
   select * from user where username like #{username}
</select>

测试:

@Test
 public void testFindByName(){
     //5.执行查询一个方法
     List<User> users = userDao.findByName("%王%");
     for(User user : users){
     System.out.println(user);
     }
 }
上一篇:AOP的原理之:JDK的动态代理


下一篇:springboot实战原理分析笔记(十五)- Spring boot 日志