zoukankan      html  css  js  c++  java
  • MyBatis源码分析-IDEA新建MyBatis源码工程

     MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。项目GitHub地址

      下载MyBatis源码,导入到IDEA工程(Maven工程)中,工程结构如下:

    在pom.xml中新增如下依赖:

    复制代码
    <!-- MySQL相关 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.38</version>
    </dependency>
    
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.6.2</version>
    </dependency>
    
    <dependency>
        <groupId>ognl</groupId>
        <artifactId>ognl</artifactId>
        <version>3.1.6</version>
    </dependency>
    
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.21</version>
    </dependency>
    
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>2.2.2</version>
    </dependency>
    复制代码

      等待依赖更新完毕后,如果出现了@Override覆盖接口方法报错问题,请参考IDEA中 @override报错的解决方法

    MyBatis配置conf.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>
    
        <settings>
            <setting name="cacheEnabled" value="true"/>
            <setting name="lazyLoadingEnabled" value="false"/>
            <!--setting name="logImpl" value="STDOUT_LOGGING"/--> <!-- 日志 -->
        </settings>
    
        <typeAliases>
            <typeAlias type="com.luoxn28.dao.User" alias="User"/>
        </typeAliases>
    
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC" /> <!-- 声明使用那种事务管理机制 JDBC/MANAGED -->
                <!-- 配置数据库连接信息 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url" value="jdbc:mysql://192.168.1.150:3306/xxx" />
                    <property name="username" value="xxx" />
                    <property name="password" value="xxx" />
                </dataSource>
            </environment>
        </environments>
    
        <mappers>
            <mapper resource="userMapper.xml"/>
        </mappers>
    
    </configuration>
    复制代码

    User类的映射文件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.luoxn28.dao.UserDao">
    
        <select id="getById" parameterType="int" resultType="User">
            SELECT * FROM user WHERE id=#{id}; <!-- #{xxx} xxx为类中的数据域名称 -->
        </select>
    
        <select id="getAll" resultType="com.luoxn28.dao.User">
            SELECT * FROM user;
        </select>
    </mapper>
    复制代码

    测试代码:

    复制代码
    /**
     * MyBatis测试类
     */
    public class TestMain {
    
        public static void main(String[] args) throws IOException {
            String resouce = "conf.xml";
            //InputStream is = TestMain.class.getClassLoader().getResourceAsStream(resouce);
            InputStream is = Resources.getResourceAsStream(resouce);
    
            // 构建sqlSession工厂
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            SqlSession session = sqlSessionFactory.openSession();
    
            /**
             * 第一种方式: 直接执行已映射的 SQL 语句
             */
            String statement = "com.luoxn28.dao.UserDao.getById";
            User user = session.selectOne(statement, 1);
            System.out.println(user);
    
            System.out.println("---------------------");
    
            /**
             * 第二种方式: 执行更清晰和类型安全的代码
             */
            UserDao userDao = session.getMapper(UserDao.class);
            user = userDao.getById(1);
            System.out.println(user);
        }
    
    }
    复制代码

    User用户类:

     User

    UserDao用户操作类

    复制代码
    /**
     * UserDao - User操作类
     */
    public interface UserDao {
    
        public User getById(int id);
        public List<User> getAll();
    
    }
    复制代码

      以上示例代码是用XML来设置映射语句的,当然,也可以用Java注解来做。比如,上面的 XML 示例可被替换如下:

    复制代码
    /**
     * UserDao - User操作类
     */
    public interface UserDao {
    
        @Select("SELECT * FROM user WHERE id=#{id}")
        public User getById(int id);
    
        @Select("SELECT * FROM user")
        public List<User> getAll();
    
    }
    复制代码

      使用注解时调用实例:

    UserDao userDao = session.getMapper(UserDao.class);
    user = userDao.getById(1);
    System.out.println(user);

      对于简单语句来说,注解使代码显得更加简洁,然而 Java 注解对于稍微复杂的语句就会力不从心并且会显得更加混乱。因此,如果你需要做很复杂的事情,那么最好使用 XML 来映射语句。选择何种方式以及映射语句的定义的一致性对你来说有多重要这些完全取决于你和你的团队。换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和 XML 的语句映射方式间自由移植和切换。注意:UserDao接口的getById方法配置了注解,那么就不要XML中配置<select id="getById">xxx</select>了,否则程序会报异常。

  • 相关阅读:
    (离线算法 LCA) hdu 2874
    (树形DP) hdu 4118
    (树的重心) poj 1655
    (线性基) bzoj 2115
    (线性基) bzoj 2460
    (边双联通+树直径) hdu 4612
    (拓扑图+DP) poj 3249
    (求割点和除去割点后的联通块数目) poj 1523
    (边双联通) poj 3352
    (DP求最长路) hdu 4607
  • 原文地址:https://www.cnblogs.com/zhengxingpeng/p/6664639.html
Copyright © 2011-2022 走看看