3、ssm之DAO开发方法

ssm之DAO开发方法


使用 Mybatis 开发 Dao,通常有两个方法,即原始 Dao 开发方法和 Mapper 接口开发方
法。

原始 Dao 开发方式

原始 Dao 开发方法需要程序员编写 Dao 接口和 Dao 实现类。

映射文件

<?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="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User"> 
        select * from user where id = #{id} 
    </select> 
    <!-- 添加用户 --> 
    <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(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) 
    </insert> 
</mapper>

Dao 接口

public interface UserDao { 
    public User getUserById(int id) throws Exception; 
    public void insertUser(User user) throws Exception; 
}

Dao实现类

public class UserDaoImpl implements UserDao {
    //注入SqlSessionFactory 
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
        this.setSqlSessionFactory(sqlSessionFactory); 
    }
    private SqlSessionFactory sqlSessionFactory; 
    
    @Override 
    public User getUserById(int id) throws Exception { 
        SqlSession session = sqlSessionFactory.openSession(); 
        User user = null; 
        try { 
            //通过sqlsession调用selectOne方法获取一条结果集 
            //参数1:指定定义的statement的id,参数2:指定向statement中传递的参数
            user = session.selectOne("test.findUserById", 1); 
            System.out.println(user);
        } finally{ 
            session.close(); 
        } 
        return user;
    }
    
    @Override 
    public void insertUser(User user) throws Exception { 
        SqlSession sqlSession = sqlSessionFactory.openSession(); 
        try { 
            sqlSession.insert("insertUser", user); 
            sqlSession.commit(); 
        } finally{ 
            session.close(); 
        }
    }
}

存在的问题

原始 Dao 开发中存在以下问题:

  • Dao 方法体存在重复代码:通过 SqlSessionFactory 创建 SqlSession,调用 SqlSession 的数据库操作方法
  • 调用 sqlSession 的数据库操作方法需要指定 statement 的 id,这里存在硬编码,不得于开发维护。

Mapper 动态代理方式

原理

Mapper 接口开发方法只需要程序员编写 Mapper 接口(相当于 Dao 接口),由 Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边 Dao 接口实现类方法。

Mapper 接口开发需要遵循以下规范:

  1. Mapper.xml 文件中的 namespace 与 mapper 接口的类路径相同。
  2. Mapper 接口方法名和 Mapper.xml 中定义的每个 statement 的 id 相同
  3. Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同
  4. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

Mapper.xml(映射文件)

定义 mapper 映射文件 UserMapper.xml(内容同 Users.xml),需要修改 namespace 的值 为 UserMapper 接口路径。

<?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="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User"> 
        select * from user where id = #{id} 
    </select> 
    <!-- 自定义条件查询用户列表 --> 
    <select id="findUserByUsername" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User"> 
        select * from user where username like '%${value}%' 
    </select> 
    <!-- 添加用户 --> 
    <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(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) 
    </insert>
</mapper>

Mapper.java(接口文件)

public interface UserMapper { 
    //根据用户id查询用户信息 
    public User findUserById(int id) throws Exception; 
    //查询用户列表 
    public List<User> findUserByUsername(String username) throws Exception; 
    //添加用户信息 
    public void insertUser(User user)throws Exception; 
}

接口定义有如下特点:

  1. Mapper 接口方法名和 Mapper.xml 中定义的 statement 的 id 相同
  2. Mapper接口方法的输入参数类型和mapper.xml中定义的statement的parameterType的类型相同
  3. Mapper接口方法的输出参数类型和mapper.xml中定义的statement的resultType的类型相同

加载 UserMapper.xml 文件

修改 SqlMapConfig.xml 文件:

<!-- 加载映射文件 --> 
<mappers> 
    <mapper resource="mapper/UserMapper.xml"/> 
</mappers>

测试程序

public class UserMapperTest extends TestCase {
    private SqlSessionFactory sqlSessionFactory;
    protected void setUp() throws Exception { 
        //mybatis配置文件 
        String resource = "sqlMapConfig.xml"; 
        InputStream inputStream = Resources.getResourceAsStream(resource); 
        //使用SqlSessionFactoryBuilder创建sessionFactory 
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
    }
    public void testFindUserById() throws Exception { 
        //获取session 
        SqlSession session = sqlSessionFactory.openSession(); 
        //获取mapper接口的代理对象 
        UserMapper userMapper = session.getMapper(UserMapper.class); 
        //调用代理对象方法 
        User user = userMapper.findUserById(1); 
        System.out.println(user); 
        //关闭session 
        session.close();
    } 
    @Test 
    public void testFindUserByUsername() throws Exception { 
        SqlSession sqlSession = sqlSessionFactory.openSession(); 
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> list = userMapper.findUserByUsername("张"); 
        System.out.println(list.size());
    } 
    public void testInsertUser() throws Exception { 
        //获取session 
        SqlSession session = sqlSessionFactory.openSession(); 
        //获取mapper接口的代理对象 
        UserMapper userMapper = session.getMapper(UserMapper.class); 
        //要添加的数据 
        User user = new User();
        user.setUsername("张三"); 
        user.setBirthday(new Date()); 
        user.setSex("1"); user.setAddress("北京市"); 
        //通过mapper接口添加用户 
        userMapper.insertUser(user); 
        //提交 
        session.commit(); 
        //关闭session 
        session.close();
    }
}

本篇文章参考书籍有:
《传智播客 mybatis 框架课程讲义》 燕青


作者:阿涛
CSDN博客主页:https://blog.csdn.net/qq_43313113
如有不对的地方,欢迎在评论区指正
欢迎大家关注我,我将持续更新更多的文章


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值