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默认支持的别名:

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
map Map
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章