mybatis动态代理

 mybatis架构图:

使用mybatis查询数据的执行过程:

创建SQLSessionFactoryBuilder对象

               2.加载Mybatis核心配置文件,因为创建SQLSessionFactory对象需要获取配置信息。

               3.创建SQLSessionFactory对象

               4.创建SQLSession对象

               5.SQLSession执行查询得到User对象

               6.打印结果

                7.释放资源(关闭SQLSession对象)

 

 

 

1.1     Mapper动态代理方式     

1.配置db.properties文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

 

2.配置.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>
    <!-- 配置属性
        先加载内部属性,再加载外部属性,如果有同名属性会覆盖。
    -->
    <properties resource="db.properties"/>
    
    <!-- 别名 -->
    <typeAliases>
        <package name="com.itheima.mybatis.domain"/>
    </typeAliases>
    
    <!-- 和spring整合后 environments配置将废除-->
    <environments default="development">
        <environment id="development">
        <!-- 使用jdbc事务管理-->
            <transactionManager type="JDBC" />
        <!-- 数据库连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    <mappers>

   <!-- 加载该包下的所有的mapper文件-->
        <package name="com.itheima.mybatis"/>
    </mappers>
</configuration>

 

3.编写.UserMapper接口文件

package com.itheima.mybatis.mapper;

import java.util.List;
import com.itheima.mybatis.domain.User;

public interface UserMapper {
    User getUserById(int id);
    List<User> findByUserName(String username);
    void insertUser(User user);
}

 

4.配置.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">
<!-- namespace是命名空间,作用sql语句的隔离,后面还有重要作用
#{}作用就是占位符,相当于jdbc的“?”
parameterType:查询的参数类型
resultType:查询结果的数据类型,如果时候pojo应该给全路径。
-->
<!--
Mapper接口开发需要遵循以下规范:
1、    Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、    Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、    Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、    Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
 -->
<mapper namespace="com.itheima.mybatis.mapper.UserMapper">
    <select id="getUserById" parameterType="int" resultType="user">
        SELECT * FROM `user` WHERE id = #{id};
    </select>
    
    <select id="findByUserName" parameterType="String" resultType="user">
        SELECT * FROM `user` WHERE username like #{username};
    </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>

5.编写测试类,我们要实现UserMapper里面的方法,不再需要编写它的实现类,只需要获得UserMapper的代理对象,然后通过它的代理对象直接调用相应的方法就行了

如:

public class UserMapperTest {

private SqlSessionFactory sqlSessionFactory=null;
    
    @Before
    public void init() throws IOException{
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();        
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        
    }

    @Test
    public void testGetUserById() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById(30);
        System.out.println(user);
        
    }

}

 

posted @ 2018-04-03 20:28  紫川先生  阅读(143)  评论(0编辑  收藏  举报