35MyBatis - Dao开发的两种方式

简介: 35MyBatis - Dao开发的两种方式

MyBatis Dao开发的两种方式

两种dao的实现方式:

  1. 原始dao的开发方式
  2. 使用Mapper代理形式开发方式
    a)直接配置Mapper代理
    b)使用扫描包配置Mapper代理

现在有个需求:

  1. 实现根据用户id查询
  2. 实现根据用户名模糊查询
  3. 添加用户

创建pojo

public class User {
  private int id;
  private String username;// 用户姓名
  private String sex;// 性别
  private Date birthday;// 生日
  private String address;// 地址
  get/set。。。
}

传统dao的开发方式

原始的DAO开发接口+实现类来完成。

需要dao实现类需要继承SqlsessionDaoSupport

1.实现Mapper.xml

编写User.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="test">
  <!-- 根据用户id查询 -->
  <select id="queryUserById" parameterType="int" resultType="user">
    select * from user where id = #{id}
  </select>
  <!-- 根据用户名模糊查询用户 -->
  <select id="queryUserByUsername" parameterType="string"
    resultType="user">
    select * from user where username like '%${value}%'
  </select>
  <!-- 添加用户 -->
  <insert id="saveUser" parameterType="user">
    <selectKey keyProperty="id" keyColumn="id" order="AFTER"
      resultType="int">
      select last_insert_id()
    </selectKey>
    insert into user
    (username,birthday,sex,address)
    values
    (#{username},#{birthday},#{sex},#{address})
  </insert>
</mapper>
2.加载Mapper.xml

在SqlMapConfig如下图进行配置:

3.实现UserDao接口
public interface UserDao {
  /**
   * 根据id查询用户
   * 
   * @param id
   * @return
   */
  User queryUserById(int id);
  /**
   * 根据用户名模糊查询用户列表
   * 
   * @param username
   * @return
   */
  List<User> queryUserByUsername(String username);
  /**
   * 保存
   * 
   * @param user
   */
  void saveUser(User user);
}
4.实现UserDaoImpl实现类

编写DAO实现类,实现类必须集成SqlSessionDaoSupport

SqlSessionDaoSupport提供getSqlSession()方法来获取SqlSession

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
  @Override
  public User queryUserById(int id) {
    // 获取SqlSession
    SqlSession sqlSession = super.getSqlSession();
    // 使用SqlSession执行操作
    User user = sqlSession.selectOne("queryUserById", id);
    // 不要关闭sqlSession
    return user;
  }
  @Override
  public List<User> queryUserByUsername(String username) {
    // 获取SqlSession
    SqlSession sqlSession = super.getSqlSession();
    // 使用SqlSession执行操作
    List<User> list = sqlSession.selectList("queryUserByUsername", username);
    // 不要关闭sqlSession
    return list;
  }
  @Override
  public void saveUser(User user) {
    // 获取SqlSession
    SqlSession sqlSession = super.getSqlSession();
    // 使用SqlSession执行操作
    sqlSession.insert("saveUser", user);
    // 不用提交,事务由spring进行管理
    // 不要关闭sqlSession
  }
}
5.配置dao

把dao实现类配置到spring容器中,如下图

6.测试方法

编写测试方法如下:

public class UserDaoTest {
  private ApplicationContext context;
  @Before
  public void setUp() throws Exception {
    this.context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
  }
  @Test
  public void testQueryUserById() {
    // 获取userDao
    UserDao userDao = this.context.getBean(UserDao.class);
    User user = userDao.queryUserById(1);
    System.out.println(user);
  }
  @Test
  public void testQueryUserByUsername() {
    // 获取userDao
    UserDao userDao = this.context.getBean(UserDao.class);
    List<User> list = userDao.queryUserByUsername("张");
    for (User user : list) {
      System.out.println(user);
    }
  }
  @Test
  public void testSaveUser() {
    // 获取userDao
    UserDao userDao = this.context.getBean(UserDao.class);
    User user = new User();
    user.setUsername("曹操");
    user.setSex("1");
    user.setBirthday(new Date());
    user.setAddress("三国");
    userDao.saveUser(user);
    System.out.println(user);
  }
}

Mapper代理形式开发dao

1.实现Mapper.xml

编写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">
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
  <!-- 根据用户id查询 -->
  <select id="queryUserById" parameterType="int" resultType="user">
    select * from user where id = #{id}
  </select>
  <!-- 根据用户名模糊查询用户 -->
  <select id="queryUserByUsername" parameterType="string"
    resultType="user">
    select * from user where username like '%${value}%'
  </select>
  <!-- 添加用户 -->
  <insert id="saveUser" parameterType="user">
    <selectKey keyProperty="id" keyColumn="id" order="AFTER"
      resultType="int">
      select last_insert_id()
    </selectKey>
    insert into user
    (username,birthday,sex,address) values
    (#{username},#{birthday},#{sex},#{address})
  </insert>
</mapper>
2.实现UserMapper接口
public interface UserMapper {
  /**
   * 根据用户id查询
   * 
   * @param id
   * @return
   */
  User queryUserById(int id);
  /**
   * 根据用户名模糊查询用户
   * 
   * @param username
   * @return
   */
  List<User> queryUserByUsername(String username);
  /**
   * 添加用户
   * 
   * @param user
   */
  void saveUser(User user);
}
3.配置mapper代理(方式一)

在applicationContext.xml添加配置

MapperFactoryBean也是属于mybatis-spring整合包

<!-- Mapper代理的方式开发方式一,配置Mapper代理对象 -->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <!-- 配置Mapper接口 -->
  <property name="mapperInterface" value="cn.itcast.mybatis.mapper.UserMapper" />
  <!-- 配置sqlSessionFactory -->
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
4.测试方法
public class UserMapperTest {
  private ApplicationContext context;
  @Before
  public void setUp() throws Exception {
    this.context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
  }
  @Test
  public void testQueryUserById() {
    // 获取Mapper
    UserMapper userMapper = this.context.getBean(UserMapper.class);
    User user = userMapper.queryUserById(1);
    System.out.println(user);
  }
  @Test
  public void testQueryUserByUsername() {
    // 获取Mapper
    UserMapper userMapper = this.context.getBean(UserMapper.class);
    List<User> list = userMapper.queryUserByUsername("张");
    for (User user : list) {
      System.out.println(user);
    }
  }
  @Test
  public void testSaveUser() {
    // 获取Mapper
    UserMapper userMapper = this.context.getBean(UserMapper.class);
    User user = new User();
    user.setUsername("曹操");
    user.setSex("1");
    user.setBirthday(new Date());
    user.setAddress("三国");
    userMapper.saveUser(user);
    System.out.println(user);
  }
}
5.扫描包形式配置mapper(方式二)
<!-- Mapper代理的方式开发方式二,扫描包方式配置代理 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <!-- 配置Mapper接口 -->
  <property name="basePackage" value="cn.itcast.mybatis.mapper" />
</bean>
每个mapper代理对象的id就是类名,首字母小写
目录
相关文章
|
1月前
|
XML Oracle Java
mybatis反向生成实体类、dao层以及映射文件
mybatis反向生成实体类、dao层以及映射文件
14 1
|
2月前
|
Java 数据库连接 Maven
使用mybatis插件generator生成实体类,dao层和mapper映射
使用mybatis插件generator生成实体类,dao层和mapper映射
50 0
|
1月前
ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl
ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl
12 0
|
1月前
ssm(Spring+Spring mvc+mybatis)Dao接口——IDeptDao
ssm(Spring+Spring mvc+mybatis)Dao接口——IDeptDao
8 0
|
1月前
|
Java 数据库连接 mybatis
mybatis简单案例源码详细【注释全面】——Dao层映射文件(UserMapper.xml)【重要】
mybatis简单案例源码详细【注释全面】——Dao层映射文件(UserMapper.xml)【重要】
10 0
|
1月前
|
Java 数据库连接 mybatis
mybatis简单案例源码详细【注释全面】——Dao层接口(UserMapper.java)
mybatis简单案例源码详细【注释全面】——Dao层接口(UserMapper.java)
7 0
|
3月前
|
Java 数据库连接 数据库
JAVAEE框架技术之10-myBatis注解式开发
JAVAEE框架技术之10-myBatis注解式开发
55 0
JAVAEE框架技术之10-myBatis注解式开发
|
3月前
|
Java 数据库连接 mybatis
MyBatis的Dao层实现方式
MyBatis的Dao层实现方式
29 0
|
3月前
|
SQL Java 数据库连接
快速上手MyBatis Plus:简化CRUD操作,提高开发效率!
快速上手MyBatis Plus:简化CRUD操作,提高开发效率!
|
3月前
|
SQL Java 数据库连接
Mybatis 开发神器 Fast MyBatis
Mybatis 开发神器 Fast MyBatis
34 1