当前位置:   article > 正文

Mybatis初阶_r.`id`=ru.`rid`

r.`id`=ru.`rid`

SqlSessionFactory

每一个mybatis应用都以一个SqlSessionFactory为核心,而SqlSessionFactory则由SqlSessionFactoryBuilder来生成,配置文件一般为mybatis-config.xml;
SqlSessionFactory一旦创建,在程序执行期间应该都一直存在于内存中,并一般不需要重复创建,所以一般使用单例模式即可。
SqlSessionFactory是线程安全的。

mybatis的配置文件 mybatis-config.xml

常见的mybatis-config.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">
            <transactionManager type="JDBC" />  <!--事务管理器-->
            <dataSource type="POOLED">          <!--连接池配置,jdbc的参数为一个配置文件中配置-->
                <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="user" value="${jdbc.user}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="xxx/xxx/xxx.xml" />    <!--mapper映射器,包含SQL代码以及映射定义信息-->
    </mappers>

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

sqlSession

sqlSession是mybatis的一个重要对象,用于应用程序和持久层之间进行交互;
sqlSession是线程私有的对象,所以不存在线程安全;
SqlSession通过SqlSessionFactory来获取: SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession包含有数据库操作的全部,底层封装jdbc的连接,可以直接用sqlSession来执行映射的SQL语句:
sqlSession.select(“aaa.bbb.ccc.xxxMapper.selectInfo”);

实现

可以用XML文件映射来实现SQL。 如下(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="org.hexf.mapper.UserMapper">
	<resultMap id="BaseResultMap" type="org.hexf.bean.User">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="nickname" property="nickname"/>
        <result column="password" property="password"/>
        <result column="email" property="email"/>
        <collection property="roles" ofType="org.hexf.bean.Role">
            <id column="rid" property="id"/>
            <result column="rname" property="name"/>
        </collection>
    </resultMap>
    
    <select id="loadUserByUsername" resultType="org.hexf.bean.User">
        SELECT * FROM user WHERE username=#{username}
    </select>
    
    <insert id="reg" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user set username=#{username},password=#{password}
    </insert>
    
    <update id="updateUserEmail">
        UPDATE user set email=#{email} WHERE id=#{id}
    </update>
    
    <select id="getUserByNickname" resultMap="BaseResultMap">
        SELECT u.*,r.`id` AS rid,r.`name` AS rname FROM user u,roles r,roles_user ru WHERE u.`id`=ru.`uid` AND
        r.`id`=ru.`rid` AND u.`id` NOT IN(SELECT u.`id` FROM user u,roles_user ru WHERE u.`id`=ru.`uid` AND ru.`rid`=1)
        <choose>
            <when test="nickname!=null and nickname!=''">
                and u.nickname like concat('%',#{nickname},'%') ORDER BY u.`id`
            </when>
            <otherwise>
                ORDER BY u.`id` limit 20
            </otherwise>
        </choose>
    </select>
  
    <delete id="deleteUserById">
        DELETE FROM user WHERE id=#{id}
    </delete>
</mapper>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

相对应的,我们可以定义一个Java接口类,用于和上述的Mapper.xml进行映射;关于映射关系可以用命名空间nameSpace来进行限定,如上文件中的:***mapper namespace=“org.hexf.mapper.UserMapper”***,此处的命名空间为全限定名,即包名+类名唯一确定。接口类中的方法名和XML文件中的ID是一一对应的,如果错误则会找不到。同时,接口类需要加上注解@Mapper。
接口类如下(UserMapper.java):

@Mapper
public interface UserMapper {

    User loadUserByUsername(@Param("username") String username);

    long reg(User user);

    int updateUserEmail(@Param("email") String email, @Param("id") Long id);

    List<User> getUserByNickname(@Param("nickname") String nickname);

    int deleteUserById(Long uid);

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

此外,还有一种方式就是不写XML文件,而是直接使用注解的方式实现,如下:

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM user WHERE username=#{username}")
    User loadUserByUsername(@Param("username") String username);
    
	......
	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

但是基于注解的方式实现上有一定的限制,如果SQL语句较为简单还可以,一旦SQL语句比复杂则会导致代码的阅读性大幅度下降,维护起来很不容易。所以此处推荐使用XML的形式进行实现。
此外,使用XML的形式可以使用mybatis逆向工程来进行相关代码的自动生成。

mybatis 逆向工程

mybatis逆向工程是通过自动配置相关的类和文件以此来自动生成mybatis的SQL语句的XML和相关接口类。
mybatis的逆向工程有自己的官网,网址为:http://www.mybatis.org/generator/quickstart.html;
可以在上面查看相关使用说明,此处仅举例说明使用方式。

逆向工程使用的配置文件如下(generatorConfig.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />

    <context id="DB2Tables" targetRuntime="MyBatis3">
        <!-- 是否去除自动生成的注释 true:是 : false:否 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>

        <!-- 数据库信息配置,包括driver/url/user/pwd,用于连接使用的数据库 -->
        <jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
                        connectionURL="jdbc:db2:TEST"
                        userId="db2admin"
                        password="db2admin">
        </jdbcConnection>

        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- 生成实体类存储的包的位置 -->
        <javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!-- 生成SQL对应XML的包位置 -->
        <sqlMapGenerator targetPackage="test.xml"  targetProject="\MBGTestProject\src">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <!-- 生成Mapper接口类的存储包位置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao"  targetProject="\MBGTestProject\src">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <!--指定需要生成的数据库表,可以写多个,tableName为表名,其他两个参数可以不配置-->
        <table schema="DB2ADMIN" tableName="User" domainObjectName="Customer" ></table>   
        <table schema="DB2ADMIN" tableName="Workbook" domainObjectName="Customer" ></table>

    </context>
</generatorConfiguration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

生成逆向工程的配置文件后,在Java中可以自己写一个类进行调用即可。
运行后可在配置文件中配置的对应的包下查看生成的文件。
参考代码如下:

public static void main(String[] args) {
       List<String> warnings = new ArrayList<String>();
       boolean overwrite = true;
       // generatorConfig.xml为生成的逆向工程的配置文件,此处是工程的相对路径
       File configFile = new File("generatorConfig.xml");     
       ConfigurationParser cp = new ConfigurationParser(warnings);
       Configuration config = cp.parseConfiguration(configFile);
       DefaultShellCallback callback = new DefaultShellCallback(overwrite);
       MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
       myBatisGenerator.generate(null);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

【本节完,后续记录mybatis的具体原理…】

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/536508
推荐阅读
相关标签
  

闽ICP备14008679号