美文网首页
MyBatis入门(二)

MyBatis入门(二)

作者: Olivine_Vip | 来源:发表于2017-04-30 20:54 被阅读0次

    学习内容:

    使用Mybatis开发Dao,通常有两个方法:

    1. 原生Dao开发
    2. Mapper接口开发方法

    1. 原生Dao开发

    1.1 创建配置文件 SqlMapConfig.xml
    1.2 创建po类
    1.3 创建映射文件、加载映射文件
    (参考入门一)
    1.4 Dao接口

    Public interface UserDao {
        public User getUserById(int id) throws Exception;
        public void insertUser(User user) throws Exception;
    }
    
    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();
            }
            
        }
    }
    

    1.5 测试

    private SqlSessionFactory sqlSessionFactory;
        
        @Before
        public void init() throws Exception {
            SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
            InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
            sqlSessionFactory = sessionFactoryBuilder.build(inputStream);
        }
        @Test
        public void testGetUserById() {
            UserDao userDao = new UserDaoImpl(sqlSessionFactory);
            User user = userDao.getUserById(22);
            System.out.println(user);
        }
    }
    

    2. 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的类型相同

    步骤

    1.1 Mapper.xml(映射文件)

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

    <?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>
    
    1.2Mapper.java(接口文件)
    /**
     * 用户管理mapper
     */
    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的类型相同

    2.3加载UserMapper.xml文件

    修改SqlMapConfig.xml文件:

      <!-- 加载映射文件 -->
      <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
      </mappers>
    
    2.4测试
    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);
        }
    
        @Test
          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();
        }
    

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

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

    相关文章

      网友评论

          本文标题:MyBatis入门(二)

          本文链接:https://www.haomeiwen.com/subject/mtbxtxtx.html