Mybatis一之开发dao的方法详述

mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀的持久层的框架,是apache下的顶级项目。mybatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。mybatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。

其中,开发dao有两种方法,一种原始的dao开发方法,程序员需要写dao接口和dao实现类。另一种是mapper代理方法,程序员只需要写mapper接口相当于dao接口。下面看看这两种写法。

先配置好mybatis的核心配置文件:SqlMapConfig.xml

<?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>
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>

    <!-- 加载映射文件 -->
    <mappers>
       <!-- <mapper resource="me/gacl/mapping/userMapper.xml"/> --> 
    </mappers>

</configuration>

原始dao开发方法

写法一

1.编写dao接口(UserDao)

public interface UserDao {  
    // 根据id查询用户信息  
    public User findUserById(int id) throws Exception;  
}  

2.编写dao实现类

public class UserDaoImpl implements UserDao {  
  
    // 需要向dao实现类中注入SqlSessionFactory  
    // 这里通过构造方法注入  
    private SqlSessionFactory sqlSessionFactory;  
  
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {  
        this.sqlSessionFactory = sqlSessionFactory;  
    }  
  
    @Override  
    public User findUserById(int id) throws Exception {  
        SqlSession sqlSession = sqlSessionFactory.openSession();  
          
        //这里的test.findUserById是与下面的映射文件user.xml中的namespace+id有关。  
        User user = sqlSession.selectOne("test.findUserById", id);  
  
        // 释放资源  
        sqlSession.close();  
  
        return user;  
  
    }  
}  

3.编写映射文件(user.xml)

<mapper namespace="test">  
    <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">  
        SELECT * FROM USER WHERE id=#{value}  
    </select>  
</mapper>  

不管是哪种写法,映射文件都要添加到核心配置文件SqlMapConfig.xml的mappers标签内。

4.编写测试类

public class Test {
	
	public static void main(String[] args) throws Exception {
		 // mybatis配置文件  
        String resource = "SqlMapConfig.xml";  
        // 得到配置文件流  
        InputStream inputStream = Resources.getResourceAsStream(resource);  
  
        // 创建会话工厂,传入mybatis的配置文件信息  
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
        // 创建UserDao的对象  
        UserDao userDao = new UserDaoImpl(sqlSessionFactory);  
        // 调用UserDao的方法  
        User user = userDao.findUserById(1);  
        System.out.println(user);  
		
	}

}

测试结果:

User [id=1, name=孤傲苍狼, age=27]

这种方式还有一种形式,就是把实现类的工作移到测试类里面完成,dao和到实现都不需要,只需要一个映射文件和测试类。

写法二

1.编写映射文件(user.xml)

<mapper namespace="test">  
    <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">  
        SELECT * FROM USER WHERE id=#{value}  
    </select>  
</mapper>  

添加映射文件到核心配置文件SqlMapConfig.xml的mappers标签内。

2.编写测试类

public class Test {

    public static void main(String[] args) throws IOException {
        //mybatis的配置文件
        String resource = "SqlMapConfig.xml";
        //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
        InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
        //构建sqlSession的工厂
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
        //创建能执行映射文件中sql的sqlSession
        SqlSession session = sessionFactory.openSession();
        String statement = "test.getUser";//映射sql的标识字符串
        //执行查询返回一个唯一user对象的sql
        User user = session.selectOne(statement, 1);
        System.out.println(user);
    }
}

测试结果:

User [id=1, name=孤傲苍狼, age=27]

mapper代理方法

1.编写mapper.java(UserMapper.java相当于java接口)

public interface UserMapper {  
    // 根据id查询用户信息  
    public User findUserById(int id) throws Exception;  
}  

2.编写mapper.xml(UserMapper.xml)

<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">  
  
    <!--通过id查询用户表的记录 -->  
    <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">  
        SELECT * FROM USER WHERE id=#{value}  
    </select>  
  
</mapper>  

添加映射文件到核心配置文件SqlMapConfig.xml的mappers标签内。

注意:

(1)在mapper.xml中namespace等于mapper接口地址

(2)mapper.java接口中的方法名和mapper.xml中statement的id一致

(3)mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

(4)mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

3.编写测试类

public class Test {
	
	public static void main(String[] args) throws Exception {
		String resource = "SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession session = sqlSessionFactory.openSession();
		//创建UserMapper对象,mybatis自动生成mapper代理对象
        UserDao userDao =session.getMapper(UserDao.class);  
        User user=userDao.findUserById(1);
        System.out.println(user.toString());
        session.close();  
	}
}

测试结果:

User [id=1, name=孤傲苍狼, age=27]

总结

通过以上各种写法的形式可以看出,写法的形式上可以有多种,但本质上的区别是在拿到session对象后采用何种执行SQL的方式。

其核心区别为:

SqlSession session = sqlSessionFactory.openSession();
		//创建UserMapper对象,mybatis自动生成mapper代理对象
        UserDao userDao =session.getMapper(UserDao.class);  
        User user=userDao.findUserById(1);

  SqlSession session = sessionFactory.openSession();
        String statement = "test.getUser";//映射sql的标识字符串
        //执行查询返回一个唯一user对象的sql
        User user = session.selectOne(statement, 1);

这两种session执行SQL的区别。

第一种是通过代理的方式,执行dao接口中的方法时,会调用其对应的映射文件中的同名sql脚本。

第二种方式可用dao,也可以不用dao,其实质为session直接根据namespace调用对应的映射文件中的sql脚本。

参考:

https://www.cnblogs.com/UUUz/p/9022110.html

猜你喜欢

转载自blog.csdn.net/w450093854/article/details/84369040