JobPlus知识库 IT DBA 文章
mybatis开发dao的方式

mybatis基于传统dao的开发方式

第一步:开发接口

public interface UserDao {

    public User getUserById(int id) throws Exception;

    public void insertUser(User user) throws Exception;

 }


第二步:设置实现类

public class UserDaoImpl implements UserDao {

    private SqlSessionFactory sqlSessionFactory;

    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {

        this.sqlSessionFactory = sqlSessionFactory;

    }

    public UserDaoImpl() {

        super();

    }

    @Override

    public User getUserById(int id) throws Exception {

        //获取sqlSession,需要使用sqlSessionFactory

        SqlSession session = sqlSessionFactory.openSession();

        try {

            User user = session.selectOne("selectUserById", id);

            return user;

        }

 finally{

            session.close();

        }

    }

    @Override

    public void insertUser(User user) throws Exception {

        //获取sqlSession,需要使用sqlSessionFactory

        SqlSession session = sqlSessionFactory.openSession();

        try {

            session.insert("insertUser", user);

            session.commit();

        }

 finally{

            session.close();

        }

    } 

}


第三步:设置对应的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="mybatis.mapper.UserMapper">

    <!-- 根据id获取用户信息 -->

    <select id="selectUserById" parameterType="int" resultType="user">

        select * from user where id = #{id}

    </select>

    <!-- 向数据库插入一条数据 -->

    <insert id="insertUser" parameterType="user">

    <selectKey keyProperty="id" resultType="int" order="AFTER">

        select last_insert_id();

    </selectKey>

        insert into user(username,birthday,sex,address) 

            values(#{username},#{birthday},#{sex},#{address})

    </insert>

</mapper>


加载mapper文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <!-- 加载外部配置文件 -->

    <properties resource="db.properties">

    </properties>

    <!-- 这个environments定义了我们的数据库的连接操作 -->

      <environments default="development">

        <environment id="development">

          <transactionManager type="JDBC"/>

          <dataSource type="POOLED">

            <property name="driver" value="${driver}"/>

            <property name="url" value="${url}"/>

            <property name="username" value="${username}"/>

            <property name="password" value="${password}"/>

          </dataSource>

        </environment>

      </environments>

      <!-- 通过mappers来指定加载我们对应的mapper文件 -->

        <mappers>

            <mapper resource="UserMapper.xml"/>

        </mappers>

</configuration>



第五步:编写测试案例

public class UserDaoTest {

    private SqlSessionFactory getSqlSessionFactory() throws IOException {

        String resource = "mybatis-config.xml";

        InputStream inputStream = Resources.getResourceAsStream(resource);

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        return sqlSessionFactory;

    }

    @Test

    public void testGetUserById() throws Exception {

        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

        UserDao userDao = new UserDaoImpl(sqlSessionFactory);

        User user = userDao.getUserById(1);

        System.out.println(user);

    }

    @Test

    public void testInsertUser() throws Exception {

        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

        UserDao userDao = new UserDaoImpl(sqlSessionFactory);

        User user = new User();

        user.setUsername("安茱莉");

        user.setSex("0");

        user.setAddress("好莱坞38号");

        userDao.insertUser(user);

    }

 }


存在的问题

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

通过接口代理的方式来开发dao

官方重点推荐这种方式

开发规范:

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

第一步:定义接口

public interface UserMapper {

        // 根据id查找用户

        public User findUserById(int id) throws Exception;

        // 插入用户信息

        public void insertUser(User user) throws Exception;

 }


第二步:定义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="mybatis.mapper.UserMapper">

    <!-- 根据id获取用户信息 -->

    <select id="findUserById" parameterType="int" resultType="user">

        select * from user where id = #{id}

    </select>

    <!-- 向数据库插入一条数据 -->

    <insert id="insertUser" parameterType="user">

        insert into user(username,birthday,sex,address)

            values(#{username},#{birthday},#{sex},#{address})

    </insert>

</mapper>


第三步:加载mapper文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <!-- 别名的配置 -->

    <typeAliases>

        <!-- 不区分大小写的 -->

        <!-- <typeAlias type="domain.User" alias="user"/> -->

        <!-- 扫描这个包下面的所有类,起别名,也是不区分大小写的 ,名字是类名不带包,推荐这种方式-->

        <package name="domain"/>

    </typeAliases>

    <!-- 加载外部配置文件 -->

    <properties resource="db.properties">

    </properties>

    <!-- 这个environments定义了我们的数据库的连接操作 -->

      <environments default="development">

        <environment id="development">

          <transactionManager type="JDBC"/>

          <dataSource type="POOLED">

            <property name="driver" value="${driver}"/>

            <property name="url" value="${url}"/>

            <property name="username" value="${username}"/>

            <property name="password" value="${password}"/>

          </dataSource>

        </environment>

      </environments>

        <!-- 通过mappers来指定加载我们对应的mapper文件 -->

        <!-- 此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。 -->

          <mappers>

            <mapper resource="mapper.xml"/>

    <!--    <mapper class="mybatis.mapper.UserMapper"/> -->

    <!-- 加载包下所有mapper接口,要求接口名称和mapper映射文件名称相同,且放在同一个目录中。 -->

            <package name="mybatis.mapper"/>

          </mappers>

</configuration>



第四步:开发测试代码

public class UserMapperTest {

    /**

     * 通过接口代理开发dao层的测试

     * 调用getUserById方法,传递id参数

     * 输出user对象到控制台

     */

    @Test

    public void findUserByIdTest() throws Exception{

        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //mybatis会产生一个代理对象

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        User user = mapper.getUserById(2);

        System.out.println(user);

        sqlSession.close();

    }

    ...

    /**

     * 抽取方法,保证项目中SQLSessionFactory的单例

     */

    private SqlSessionFactory getSqlSessionFactory() throws IOException {

        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        return sqlSessionFactory;

    }

 }



补充:mybatis默认支持的别名:


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
119人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序