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

原文地址:https://www.cnblogs.com/jifengblog/p/9221324.html

时间: 2024-10-29 19:11:29

mybatis开发dao的方式的相关文章

Mybatis学习记录(二)--Mybatis开发DAO方式

mybatis开发dao的方法通常用两种,一种是传统DAO的方法,一种是基于mapper代理的方法,下面学习这两种开发模式. 写dao之前应该要对SqlSession有一个更加细致的了解 一.mybatis的SqlSession使用范围 SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产

MyBatis开发Dao层的两种方式(Mapper动态代理方式)

MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上一篇博客中Dao接口实现类方法. Mapper接口开发需要遵循以下规范: (1)Mapper.xml文件中的namespace与mapper接口的类路

mybatis开发dao的方法

mybatis开发dao的方法 1.1     SqlSession使用范围 1.1.1     SqlSessionFactoryBuilder 1 //以流的方式读取总的配置文件 2 Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); 3 4 //生成SqlSessionFactory 5 SqlSessionFactory sqlSessionFactory = new SqlSessionFa

MyBatis学习--mybatis开发dao的方法

简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFactoryBuilder.SqlSessionFactory.SqlSession. SqlSession中封装了对数据库的操作,如:查询.插入.更新.删除等.通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryB

MyBatis开发Dao的原始Dao开发和Mapper动态代理开发

摘自:https://www.cnblogs.com/yichunguo/p/11990961.html 目录 咳咳...初学者看文字(Mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解: 原始Dao开发方式 1. 编写映射文件 3.编写Dao实现类 4.编写Dao测试 Mapper动态代理方式 1.定义Mapper.xml(映射文件) 2.编写UserMapper.xml配置文件内容: 3.编写UserMapper(接口文件) 4.加载UserMapper.xml

MyBatis开发Dao

MyBatis开发Dao有两种方法: 1.原始Dao开发方法,就是程序需要编写Dao的接口和Dao的实现类. 2.MyBatis的mapper接口(相当于Dao接口)代理开发方法.(更重要)

Mybatis使用Dao代码方式CURD

Mybatis 使用Dao代码方式进行增.删.改.查. 1.Maven的pom.xml 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.or

mybatis开发dao的方法——(三)

------------------------1.    SqlSession使用范围------------------- 1.1     SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory 将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder. 在需要创建SqlSessionFactory时候,只需要new

使用mybatis开发Dao的原始方法,实现根据用户id查询一个用户信息 、根据用户名称模糊查询用户信息列表 、添加用户信息等功能

1.需求 将下边的功能实现Dao: 根据用户id查询一个用户信息 根据用户名称模糊查询用户信息列表 添加用户信息 2. 原始Dao开发方法需要程序员编写Dao接口和Dao实现类 3.User.xml映射文件的内容为: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "h