【MyBatis】sqlSession对象的间接使用——代理开发方式

MyBatis传统开发方式

先提前说一点,现阶段dao层也可以叫做mapper层。

传统开发方式就是MVC中dao层的经典写法,只是把sql逻辑写在xxxMapper.xml配置文件中而已:

[接口]com.samarua.mapper.userMapper
-------------------------------------------------------------------------------------------
public interface UserMapper {

    public List<User> findAll();
    
    public User findById(int id);
}
[实现类]com.samarua.mapper.impl.userMapperImpl
-------------------------------------------------------------------------------------------
public class UserMapperImpl implements UserMapper {

    public List<User> findAll() {
    
        // 1.获取sqlSession对象
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        
        // 2.直接使用sqlSession对象调用各种sql逻辑
        List<User> userList = sqlSession.selectList("userMapper.findAll");
        return userList;
    }

    public User findById(int id) {
        //...
    }
}
[模拟service层]com.samarua.service.serviceTest
-------------------------------------------------------------------------------------------
public class ServiceDemo {
    public static void main(String[] args) throws IOException {
    
		UserMapper userMapper = new UserMapperImpl();
		
		List<User> userList = userMapper.findAll();
		System.out.println(userList);

		User user = userMapper.findById(3);
		System.out.println(user);
    }
}

 
 

MyBatis代理开发方式

我们发现,传统开发方式需要手动实现接口。实现接口的目的是补充上逻辑代码,但是MyBatis中逻辑代码(即sql语句)是解耦到配置文件中的——我们先实现接口,又在接口实现类中调用配置文件中的逻辑,实在没有必要。

在代理开发模式中,无需实现接口,只需要将接口中的方法与配置文件中的方法做好对应;在使用时,会自动生成该接口的代理实现对象(实际上是接口与配置文件结合的产物),我们直接使用这个对象就可以一步到位完成各种逻辑了。

MyBatis传统开发和代理开发的不同,体现在代码上就是对sqlSession对象的使用——传统开发直接使用该对象调用各种sql逻辑;代理开发使用该对象获取代理对象,再由代理对象调用各种sql逻辑。

xxxMapper接口与xxxMapper.xml的对应规范:

1) Mapper接口完整类名和Mapper.xml中的namespace相同

2)Mapper接口每个方法名和Mapper.xml中每个sql的id相同

3)Mapper接口每个方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同

4)Mapper接口每个方法的返回参数类型和mapper.xml中定义的每个sql的resultType的类型相同

[接口]com.samarua.mapper.UserMapper
-------------------------------------------------------------------------------------------
public interface UserMapper {
    public List<User> findAll();
    public User findById(int id);
}
[配置文件]resources.com.samarua.mapper.UserMapper.xml
-------------------------------------------------------------------------------------------
<?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="com.samarua.mapper.UserMapper">

	<select id="findAll" resultType="com.samarua.domain.User">
        select * from user
    </select>
    
    <select id="findById" parameterType="int" resultType="com.samarua.domain.User">
        select * from user where id = #{id}
    </select>
    
</mapper>
[模拟service层]com.samarua.service.serviceTest
-------------------------------------------------------------------------------------------
public class ServiceDemo {
    public static void main(String[] args) throws IOException {
    
    	// 1.获取sqlSession对象
		InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

		// 2.通过sqlSession对象获得mapper代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

		// 3.使用mapper代理对象调用各种sql逻辑
        List<User> userList = mapper.findAll();
        System.out.println(userList);

        User user = mapper.findById(1);
        System.out.println(user);
    }
}

 
 
 
 

 
 
 
 

 
 
 
 

More >_<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mybatis获取SqlSession对象的方法有两种: 1. 通过SqlSessionFactory获取SqlSession对象 首先需要创建一个SqlSessionFactory对象,可以通过读取mybatis的配置文件来创建,然后通过SqlSessionFactory对象的openSession()方法获取SqlSession对象。 示例代码: //读取mybatis配置文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); //创建SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); 2. 通过Spring框架获取SqlSession对象 如果项目中使用Spring框架,可以通过Spring的容器来获取SqlSession对象。需要在Spring的配置文件中配置SqlSessionFactory和SqlSessionTemplate两个Bean,然后通过@Autowired注解来注入SqlSessionTemplate对象。 示例代码: <!-- 配置SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <!-- 配置SqlSessionTemplate --> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory"/> </bean> //注入SqlSessionTemplate对象 @Autowired private SqlSessionTemplate sqlSessionTemplate; ### 回答2: MyBatis获取SqlSession对象是非常重要的,SqlSessionMyBatis操作数据库的核心对象,用来执行SQL语句、提交事务、获取映射器等。 三种获取SqlSession对象的方式: 1.使用SqlSessionFactoryBuilder来读取配置文件,创建SqlSessionFactory对象,再通过SqlSessionFactory对象创建SqlSession对象: ``` String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); ``` 2.使用MyBatis提供的Resources类,直接获取配置文件流,创建SqlSessionFactory对象,再通过SqlSessionFactory对象创建SqlSession对象: ``` String resource = "mybatis-config.xml"; Reader reader = Resources.getResourceAsReader(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession sqlSession = sqlSessionFactory.openSession(); ``` 3.使用Spring框架集成MyBatis,通过SqlSessionFactoryBean配置SqlSessionFactory,再通过SqlSessionFactory来创建SqlSession对象: ``` <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="password"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory"/> </bean> ``` 无论是哪种方式获取SqlSession对象,都要注意调用close方法将SqlSession对象关闭,释放数据库资源。 否则,容易出现数据库连接泄漏的问题,影响系统性能。因此,在使用MyBatis操作数据库时,一定要注意SqlSession使用和关闭。 ### 回答3: Mybatis是一个基于Java的开源数据访问框架,提供了面向对象的持久化操作方式,是许多Java Web应用的首选框架。其核心是SqlSessionMybatis通过SqlSession与数据库进行交互。因此,获取SqlSession对象使用Mybatis的第一步。 获取SqlSession对象主要有以下两种方式: 1. SqlSessionFactoryBuilder 首先,需要创建SqlSessionFactoryBuilder对象,通过它配置Mybatis并创建SqlSessionFactory对象,再通过SqlSessionFactory对象生成SqlSession对象。示例代码如下: ``` InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = builder.build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); ``` 这里,首先使用Resources.getResourceAsStream加载Mybatis配置文件mybatis-config.xml,然后创建SqlSessionFactoryBuilder对象builder,调用其build方法创建SqlSessionFactory对象sqlSessionFactory,最后通过SqlSessionFactory对象的openSession方法获取SqlSession对象sqlSession。 2. @Inject注解 另外一种获取SqlSession对象的方式是使用@Inject注解。通过在Mapper接口的字段或setter方法上添加@Inject注解,Mybatis会自动注入SqlSession对象。示例代码如下: ``` public interface UserMapper { @Inject SqlSession sqlSession; // 或者 void setSqlSession(SqlSession sqlSession); } ``` 这里,通过@Inject注解,Mybatis会自动注入SqlSession对象sqlSession。另外也可以通过setter方法进行注入。 总结起来,获取SqlSession对象有两种常用方式:通过SqlSessionFactoryBuilder对象创建,或在Mapper接口中使用@Inject注解。根据实际情况选择合适的方式进行使用即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值