봄 학습 11 - 통합 MyBatis로

봄 통합 MyBatis로

사용 항아리에 필요

  • MyBatis로

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.2</version>
    </dependency>
  • MySQL의 커넥터

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
  • <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.0.RELEASE</version>
    </dependency>
  • aspectjweaver

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.4</version>
    </dependency>
  • MyBatis로 스프링 (여기에 초점)

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.2</version>
    </dependency>
  • 정적 자원 필터링 받는다는 문제

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

검토 MyBatis로

테이블을 만들 MYSQL

CREATE DATABASE `mybatis`;

USE `mybatis`;
CREATE TABLE `user` (
  `id` int(20) auto_increment PRIMARY KEY COMMENT '用户id',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `pwd` varchar(30) DEFAULT NULL COMMENT '密码'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Entity 클래스

import lombok.Data;//lombok插件

@Data
public class User {
    private int id;
    private String name;
    private String pwd;
}

프록시 인터페이스

public interface UserMapper {
    List<User> listUser();
}

프록시 인터페이스 매핑 파일

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.cong.dao.AccountMapper">
    <select id="listUser" resultType="account">
        select * from mybatis.account;
    </select>
</mapper>

핵심 프로필의 MyBatis

MyBatis로

<?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>
        <package name="com.cong.pojo"/>
    </typeAliases>
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper class="com.cong.dao.AccountMapper"/>
    </mappers>
</configuration>

테스트 카테고리

    //mybatis
    @Test
    public void test1() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = factory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = userMapper.listUser();
        for (User user : userList) {
            System.out.println(user);
        }
    }

요약하면, 프록시 프로세스는 같은 것을 구현

DeaultSqlSession.getMapper () -> Configuration.getMapper () -> MapperRegistry.getMapper () ->

MapperProxyFactory.newInstance (SQLSESSION)

MapperProxyFactory MapperProxy 공장에 의해 생성 된 프록시 클래스입니다, 여기에 조금 이해하기

MapperProxyFactory를 입력

MapperProxyFactory.newInstance (SQLSESSION) -> MapperProxyFactory.newInstance (mapperProxy)

지금까지 기관이 요구되고있다 클래스

MapperProxy에 MapperProxyFactory 클래스

MapperProxy는 구현을 동적 프록시 인터페이스의 InvocationHandler를 발견

초점 호출 () 메소드는,) (첫 번째 참조 invoke 메소드에 MapperMethod 클래스를 얻고, 다음 mapperMethod.execute 전화

이동 excute에 ()는 CRUD 것을 발견했다.

전체 클래스 MapperMethod 봐

MapperMethod 전체 클래스는 프록시 메커니즘의 핵심 클래스, SQLSESSION 사용 패키지의 작업입니다. 이 클래스는 두 개의 내부 클래스 SqlCommand를하고 MethodSignature 있습니다. XML 우리의 노드 운영에 배치 포장을위한 SqlCommand를 CRUD 작업. 각 노드는 MappedStatement 클래스를 생성합니다. 캡슐화 방법 및 반환 형식, 방법 우리가 여기 우리가 SQLSESSION 인터페이스 호출에 있었고, 객체의 우리 자신의 구현 방법 DefaultSqlSession UerDao 인터페이스 구현 클래스가 SQLSESSION 직접 호출, 실행에 대한 MethodSignature 매개 변수 마찬가지로, 제 동적 프록시의 전체 구현 과정 대신에 큰 원 위로 후.

봄 통합 MyBatis로

의 MyBatis-Spring은 무엇입니까?

의 MyBatis-Spring은 완벽하게 봄과 코드 MyBatis로 통합하는 데 도움이 될 것입니다. 상기 첫 번째 모양이 항아리 패키지를 봄 - MyBatis로

공식 웹 사이트 : 의 MyBatis-봄

기술 자료

당신의 MyBatis-Spring을 사용하기 전에, 당신은 그들 모두의 MyBatis 및 스프링 프레임 워크 및 용어에 대해 잘 알고 있어야합니다. 이것은 중요하다

의 MyBatis-Spring은 다음 버전이 필요합니다

Maven은 빌드 도구로 만 pom.xml 파일에 다음 코드를 추가해야하는 경우 :

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.2</version>
</dependency>

SqlSessionFactoryBean 및 SqlSessionTemplate

봄과 MyBatis로 사용되기 위해서는 두 가지 Spring 애플리케이션 컨텍스트 내에서 적어도 정의 될 필요가하십시오 SqlSessionFactory적어도 하나의 데이터 매퍼 클래스를.

에서의 MyBatis-Spring은 사용할 수 있습니다 SqlSessionFactoryBean만들 수 SqlSessionFactory. 공장 콩을 구성하려면, 단지 스프링 XML 설정 파일에 다음 코드를 넣어 :

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
</bean>

참고 : SqlSessionFactoryA에 대한 필요성 DataSource(데이터 소스). 이것은 임의의 수 있습니다 DataSource, 단지 그것까지 구성 할 수있는 다른 봄 데이터베이스 연결을 구성해야합니다.

에서 MyBatis로 사용 기반입니다 SqlSessionFactoryBuilder생성 SqlSessionFactory을 수행합니다. MyBatis로-봄에서, 다음 사용 SqlSessionFactoryBean만들 수 있습니다.

MyBatis로, 당신은 사용할 수 있습니다 SqlSessionFactory만들 수 SqlSession. 세션을 얻을하면, 명령문의 매핑을 수행하는 데 사용할 커밋 또는 롤백 연결하고, 더 이상 필요한 경우 마지막으로, 당신은 세션을 닫을 수 있습니다.

SqlSessionFactory는 JDBC에 대한 : 만 필요한 속성이 있습니다 DataSource. 이것은 어떤 될 수있다 DataSource객체, 메서드 및 기타 구성은 동일한 데이터베이스 연결 봄입니다.

일반적인 속성은 configLocation그것의 MyBatis XML 설정 파일의 경로를 지정하는 데 사용됩니다. 당신은 MyBatis로 기본 구성을 수정할 때 매우 유용합니다. 일반적으로, 기준이 설정 지칭 <settings>또는 <typeAliases>소자.

이 구성 파일이 완전한 MyBatis로 구성 할 필요가 없다는 것을 주목해야한다. 오히려, 어떤 환경 구성 (<environments>), 데이터 소스 (<DataSource>)와의 MyBatis 트랜잭션 관리자는 (<transactionManager>)무시됩니다. SqlSessionFactoryBean는 자신의 환경 MyBatis로 구성 만들고 (Environment), 필요에 따라 설정 사용자 환경 값을

SqlSessionTemplate그것은 MyBatis로 - 봄의 핵심입니다. SqlSession이미 사용이 대신 원활한 코드를 사용할 수 있다는 것을 의미 구현, SqlSession.

템플릿 Spring 관리 트랜잭션에 참여할 수 있고, 스레드 안전하기 때문에, 여러 매퍼 클래스 용으로 사용할 수 있습니다, 당신은해야한다 항상 사용하는 SqlSessionTemplate기본 MyBatis로의 대체 DefaultSqlSession구현을. 혼합 사용은 동일한 애플리케이션의 서로 다른 클래스들 사이의 데이터 일관성 문제가 발생할 수있다.

사용할 수 있습니다 SqlSessionFactory만들 수 생성자에 매개 변수로 SqlSessionTemplate객체를.

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
  <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

자,이 콩은 당신의 DAO 빈에 직접 주입 할 수있다. 이처럼, 여러분의 빈에 SQLSESSION 속성을 추가해야합니다 :

public class UserDaoImpl implements UserDao {

  private SqlSession sqlSession;

  public void setSqlSession(SqlSession sqlSession) {
    this.sqlSession = sqlSession;
  }

  public User getUser(String userId) {
    return sqlSession.getMapper...;
  }
}

눌러, 주입을 다음과 SqlSessionTemplate:

<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl">
  <property name="sqlSession" ref="sqlSession" />
</bean>

통합을 달성

봄-config.xml에

단 별명 떠나는 MyBatis로 구성 파일 (동일한 별명 스프링 구성 파일에 통합 될 수 있음)

<?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>
        <package name="com.cong.pojo"/>
    </typeAliases>
</configuration>

스프링 mybatis.xml

스프링 집적 MyBatis로 프로필

주요 구성 여기

  • 데이터 소스 데이터 소스
  • 세션 공장 SqlSessionFactory는
  • 세션 SqlSessionFactory는 템플리트
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--datasource-->
    <!--配置数据源:数据源有非常多,可以使用第三方的,这里使用Spring的-->
    <bean id="dataSources" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>
    <!--sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSources"/>
        <!--关联Mybatis-->
        <property name="configLocation" value="mybatis-config.xml"/>
        <!--映射文件-->
        <property name="mapperLocations" value="classpath:com/cong/dao/*Mapper.xml"/>
        <!--别名-->
        <!--<property name="typeAliases" value="com.cong.pojo.Account"/>-->
    </bean>
    <!--SqlSessionTemplate-->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <!--利用构造器注入,没有setter-->
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>
</beans>

applicationContext.xml

봄 코어 구성 파일

여기에 오기 파일을 통합하여 스프링 mybatis.xml 소개

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--引入整合的配置文件-->
    <import resource="classpath:spring-dao.xml"/>
</beans>

UserMapperImp.java

맵퍼 인터페이스 구현 클래스 SqlSessionTemplate 민영화 늘리기 봄 세터 방법을 제공하는 용기에 붓고

public class UserMapperImpl implements UserMapper{
    private SqlSessionTemplate sqlSessionTemplate;//sqlSession不用我们自己创建了,Spring来管理

    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }

    @Override
    public List<User> listUser() {
        UserMapper userMapper = sqlSessionTemplate.getMapper(UserMapper.class);
        return userMapper.listUser();
    }
}

로그인 빈 구현

applicationContext.xml에서 창조 콩, 봄이 주로 AOP와 IOC 때문에

관리 및 트랜잭션 관리 객체에 대한 책임

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--引入整合的配置文件-->
    <import resource="classpath:spring-dao.xml"/>
    <bean id="userMapper" class="com.cong.dao.UserMapperImpl">
        <property name="sqlSessionTemplate" ref="sqlSession"/>
    </bean>
</beans>

테스트

@Test
public void test2(){
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    UserMapper mapper = (UserMapper) context.getBean("userDao");
    List<User> user = mapper.selectUser();
    System.out.println(user);
}

출력 결과!

User(id=1, name=cong, pwd=ajd123.)
User(id=2, name=rainbow, pwd=182184)

개선

더 MyBatis로-spring1.2.3이 버전이있다.

스크린 샷 공식 문서 :

DAO를 상속 지원 클래스를 직접 사용 getSqlSession는 ()을 획득 한 다음 SqlSessionFactory는에 직접 주입. 1에 비해 더 친화적 인. 추적 원본 뷰의 거래에 대한 관리 SqlSessionTemplate 및 지원을 필요로하지 않습니다하기

UserMapper 구현 클래스 UserMapperImpl2 쓰기

상속 SqlSessionDaoSupport을 통해 SqlSessionTemplate 관리를 제거하려면

//可以通过继承SqlSessionDaoSupport来消除SqlSessionTemplate的显示注入
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper{
    @Override
    public List<User> listUser() {
        //getSqlSession()是SqlSessionDaoSupport中的方法
        UserMapper userMapper = getSqlSession().getMapper(UserMapper.class);
        return userMapper.listUser();
    }
}

조금 더 편리하고, 반환이 단어로 쓸 수있다

return getSqlSession().getMapper(UserMapper.class).listUser();

사출 콩

<bean id="userMapper2" class="com.cong.dao.UserMapperImpl2">
    <property name="sqlSessionTemplate" ref="sqlSession"/>
</bean>

요약 : 미래에 봄에 통합이 완전하게 다음과 같은 방법 이외에 MyBatis로 구성 파일, 외부 통합하기 위해, 우리는 또한 달성하기 위해 주석을 사용할 수 있습니다.

추천

출처www.cnblogs.com/ccoonngg/p/12026774.html