MyBatisMyBatis连忙入门(1):搭建环境和单表映射

    <?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="yitian.study.dao.mapper">
        <select id="selectPerson"
                resultType="Person" parameterType="Person">
            SELECT *
            FROM Person
            WHERE id = #{id}
        </select>
        <select id="selectPersonByName"
                resultType="Person">
            SELECT *
            FROM Person
            WHERE username = #{username}
        </select>
        <insert id="insertPerson"
                useGeneratedKeys="true">
            INSERT INTO Person (username, birthday) VALUES (#{username}, #{birthday})
        </insert>
        <update id="updatePerson">
            UPDATE Person
            SET birthday = #{birthday}
            WHERE id = #{id}
        </update>
        <delete id="deletePerson">
            DELETE FROM Person
            WHERE id = #{id}
        </delete>
    </mapper>

3.创建SqlSessionFactory
  
 有了布置文件,大家就可以开始利用MyBatis了。首先要做的事情是创办MyBatis的SqlSessionFactory,它和Hibernate的SessionFactory类似,是重要的工厂类,一个应用程序中只需要创立一个即可。
  
 下边是一个工具类,用双检锁简单的贯彻了一个线程安全的工具类。大旨代码在最内层的if判断中。由于配备文件在类路径上,所以我们只需要指定文件名即可。这里运用了MyBatis提供的Resources工具类,创立一个输入流,然后交由SqlSessionFactoryBuilder来创设一个SqlSessionFactory。

2.安排文件
  
 然后大家需要编制MyBatis的配置和照耀文件。所有这么些配置文件最好放在类路径上,对于Gradle项目以来就是src/main/resources文件夹下。我们先来编排一个部署文件。配置文件每个部分的详尽效用请参见官方文档,这里只简单表明一下。
       
属性部分。在这里定义MyBatis需要的性质,可以用在底下的四个地点。另外属性也足以从表面properties文件中导入。
        系统设置。在这里指定MyBatis的大局配置。详细的部署插足文档。
       
简写名。在炫耀文件中需要指定Java实体类的人名,我们能够在这里指定简写名简化配置。
       
环境。在此间我们要指定数据库连接、事务管理器等布置。还足以指定测试环境、生产条件等三个条件对应不同的数据库配置。
        映射文件。在此处指定映射文件,或者也得以添加应用评释配置的类。

2.映射文件
  
 然后我们来编排映射文件。映射文件包含5条SQL语句,分别是增删查改以及按名称查找。每一条语句都亟待一个标识符,将会在末端再代码中用到。淌假若查询语句还需要resultType,指定再次来到类型。MyBatis会将数据表列明和这里指定的档次属性按名称自动映射起来。要是急需在讲话中传唱参数,可以运用
parameterType属性,指定Java实体类的姓名或简写,然后就足以在SQL语句中行使#{}来访问参数的性质了。要是是简简单单的炫耀,那么parameterType属性还足以省略,MyBatis会自动从传播的Java对象中赢得相应的属性。对于某些数据库(例如MySQL),仍能够在插入的时候指定useGeneratedKeys=”true”,让数据库自动生成主键。

    public interface PersonMapper {
        Person selectPerson(int id);
        Person selectPersonByName(String name);
        void insertPerson(Person person);
        void updatePerson(Person person);
        void deletePerson(Person person);
    }
    <?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>
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/test"/>
            <property name="username" value="root"/>
            <property name="password" value="12345678"/>
            <property name="driver.useSSL" value="false"/>
        </properties>
        <!--系统设置-->
        <settings>
            <setting name="cacheEnabled" value="true"/>
            <setting name="lazyLoadingEnabled" value="true"/>
        </settings>
        <!--指定简写名-->
        <typeAliases>
            <package name="yitian.study.entity"/>
        </typeAliases>
        <!--配置环境,可以配置多个环境用于测试、调试和生产-->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>
        <!--配置映射文件-->
        <mappers>
            <mapper resource="BaseEntityMapper.xml"/>
        </mappers>
    </configuration>
    CREATE TABLE person (
      id       INT AUTO_INCREMENT PRIMARY KEY,
      username VARCHAR(255) NOT NULL UNIQUE,
      birthday DATE
    );
    compile group: 'org.mybatis', name: 'mybatis', version: '3.4.2'
    compile group: 'org.mybatis', name: 'mybatis-typehandlers-jsr310', version: '1.0.2'
    compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.40'

一.MyBatis简介
  
 一说起对象关系映射框架,我们第一时间想到的必然是Hibernate。Hibernate作为一个闻明的框架,效率相当强劲。我们只需要配备好实体类和数据表之间的关系,Hibernate就会自行帮大家完成生成并执行SQL语句,映射结果集这样的劳作。可是也正是出于Hibernate如此强大的效率,导致了它的欠缺:一是非凡笨重,启动Hibernate的SessionFactory非常耗时,开销巨大;二是部署复杂,学习成本较高,系统调优也不易于;三是自定义查询效率较弱,查询结果要是不是炫耀的实体类,查询起来就相比较费心。因而另一个ORM框架MyBatis,越来越流行。
  
 前边说到的多少个Hibernate的欠缺,反过来正好就是MyBatis的助益:一是分外轻量,系统开发小;二是布局简单,易于学习,官方文档我直觉上感到比Log4j2的文档还少;三刚好就是MyBatis的特色,映射查询结果非凡灵活。另外MyBatis还有一个优点就是自带闽南语文档,可能有些地点感觉不太流利,不过完全充分我们学习和利用了。
二.配备环境
1.看重引入
  
 添加MyBatis最简便的主意就是使用Maven或Gradle这样的构建工具。在此处我动用Gradle。在档次中添加如下几行即可。假使确定不应用新的Java
8
时间API,那么第二行的依赖还可以够去掉。这里自己用的数据库是MySQL,由此还需要添加MySQL的JDBC驱动。

   
仅仅增添映射类还不够,大家需要修改映射文件,以便让MyBatis能找到那多少个映射类。做法就是将映射文件的命名空间改为对应的炫耀文件的类名。
    <mapper namespace=”yitian.study.mapper.PersonMapper”>
  
 映射类定义和布置好未来,我们就足以选择了。使用方法很简短,在SqlSession上调用getMapper方法,并传播要得到的Mapper类即可。

   
创设好SqlSessionFactory之后,大家就可以先河拔取MyBatis了。这里先回过头看看如何创造MyBatis映射文件。然后我们在此起彼伏运用MyBatis。
三.单表映射
1.数据表和实体类
  
 在安排文件最终的mapper部分定义的就是炫耀文件。映射文件也是我们需要着重学习的地方。在炫耀文件中我们需要定义各个SQL语句,并创设它们和Java实体类之间的关系。这里我们运用最简便易行的单表映射:数据表和实体类之间属性名相同,一一对应。
    首先先来添加一个实体类。

    public abstract class MyBatisUtils {
        private static volatile SqlSessionFactory sqlSessionFactory;
        public static final String MyBatisConfigLocation = "configuration.xml";
        public static SqlSessionFactory getSqlSessionFactory() throws IOException {
            if (sqlSessionFactory == null) {
                synchronized (MyBatisUtils.class) {
                    if (sqlSessionFactory == null) {
                        InputStream input = Resources.getResourceAsStream(MyBatisConfigLocation);
                        sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
                        input.close();
                    }
                }
            }
            return sqlSessionFactory;
        }
    }
    public class Person {
        private int id;
        private String username;
        private LocalDate birthday;
    }

    对应的数量库表如下。

    import static org.assertj.core.api.Assertions.*;
    public class MyBatisTest {
        private static SqlSessionFactory sqlSessionFactory;
        private SqlSession sqlSession;
        @BeforeClass
        public static void init() throws IOException {
            sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
        }
        @Before
        public void before() {
            sqlSession = sqlSessionFactory.openSession(true);//自动提交
        }
        @After
        public void after() {
            sqlSession.close();
        }
        @Test
        public void testMyBatisUtils() {
            assertThat(sqlSessionFactory).isNotNull();
        }
        @Test
        public void testInsert() {
            Person p = new Person(0, "yitian", LocalDate.of(1993, 5, 6));
            sqlSession.insert("insertPerson", p);
            Person s = sqlSession.selectOne("selectPersonByName", p.getUsername());
            assertThat(s).isNotNull();
            System.out.println(s);
            sqlSession.delete("deletePerson", s);
        }
        @Test
        public void testUpdate() {
            Person p = new Person(1, "leo", LocalDate.of(1993, 5, 6));
            sqlSession.insert("insertPerson", p);
            p = sqlSession.selectOne("selectPersonByName", p.getUsername());
            LocalDate b = LocalDate.of(1987, 7, 8);
            p.setBirthday(b);
            sqlSession.update("updatePerson", p);
            Person s = sqlSession.selectOne("selectPersonByName", p.getUsername());
            assertThat(s.getBirthday()).isEqualTo(b);
            System.out.println(s);
            sqlSession.delete("deletePerson", s);
        }
    }

四.使用MyBatis
  
 以上那些都配置好之后,我们就可以来行使MyBatis了。这里我们拔取一个单元测试来查看MyBatis的职能。在创设SQLSessionFactory之后,我们需要得到MyBatis最主题的目的SqlSession,所有操作都急需SqlSession来举办。此外它是非线程安全的对象,无法放在类的静态字段上,最好也无须看成实例字段。大家要在急需的时候创立它,不用的时候立时放出。
  
 常用的方法有增删查改这些情势。这么些形式的首先个参数是前边大家在炫耀文件中定义的语句ID,第二个参数是要传播的参数。对于查询来说有selectOne和selectList方法,它们的界别重要在于重返个数,假使确定只回去一个目的就拔取selectOne方法。

   
其它默认境况下MyBatis的事务管理是翻开的,意味着我们不可能不显式使用commit()方法才能交到业务。这里在开辟SqlSession的时候指定了活动提交,这样我们的保有变更都会及时反映到数据库中。
五.采取映射类
  
 在头里的例证中,使用的都是字符串来指定要运用的询问。可是那样做特别不便宜,字符串容易发生错误,而且不能够赢得IDE的智能补全。所以MyBatis提供了另一种方法来实施SQL语句,这就是接纳映射类。
  
 映射类其实就是一个简练的接口。该接口中的方法和照耀文件中定义的言辞一一对应。接口方法的名称必须和语句id完全相同,接口方法的重返值和参数和对应的语句相对应。

   
有了炫耀对象,我们就足以以体系安全的主意来存取对象了,同时还足以获取IDE的补全效能。

    PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
    Person p = new Person(0, "yitian", LocalDate.of(1993, 5, 6));
    mapper.insertPerson(p);
    Person s = mapper.selectPersonByName(p.getUsername());
    assertThat(s).isNotNull();
    System.out.println(s);
    mapper.deletePerson(p);
网站地图xml地图