MyBatis 笔记(一)——快速入门

来源:互联网 发布:室内装修设计软件 编辑:程序博客网 时间:2024/06/06 07:31

简介

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

入门

添加依赖

在使用 Mybatis 的时候,需要添加数据库驱动包和 Mybatis 包,以 MySQL 为例,Maven 依赖:

<dependencies>      <dependency>        <groupId>org.mybatis</groupId>        <artifactId>mybatis</artifactId>        <version>3.4.4</version>      </dependency>      <dependency>        <groupId>mysql</groupId>        <artifactId>mysql-connector-java</artifactId>        <version>6.0.6</version>      </dependency></dependencies>

MyBatis 配置文件

使用 MyBatis 的时候需要一个 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">                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>                <property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useSSL=true"/>                <property name="username" value="root"/>                <property name="password" value="123456"/>            </dataSource>        </environment>    </environments>    <mappers>        <!-- 基于XML配置文件 -->        <mapper resource="edu/wzm/mybatis/mapping/PersonMapper.xml"/>    </mappers></configuration>

Mapping 映射文件

在上一节 MyBatis 的配置文件中,看到了一个 mapper 标签,而它会指向一个映射文件:

<?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,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的  例如:namespace="edu.wzm.mybatis.mapping.PersonMapper"(userMapper.xml文件去除后缀)--><mapper namespace="edu.wzm.mybatis.mapping.PersonMapper">  <!--    在select、insert、update、delete标签中编写查询的SQL语句, 设置标签的id属性值必须是唯一的,不能够重复。使用parameterType属性    指明查询时,使用的参数类型。resultType属性指明查询返回的结果集类型,resultType="edu.wzm.mybatis.domain.Person"就表示将查询    结果封装成一个Person类的对象返回,Person类就是person表所对应的实体类。  -->  <insert id="insert" parameterType="edu.wzm.mybatis.domain.Person">    insert into person(name, age) values(#{name}, #{age})  </insert>  <select id="getById" resultType="edu.wzm.mybatis.domain.Person">    select *    from person    where id = #{id}  </select>  <select id="getAll" resultType="edu.wzm.mybatis.domain.Person">    select * from person;  </select>  <update id="update" parameterType="edu.wzm.mybatis.domain.Person">    update person set age = #{age} where id = #{id}  </update>  <delete id="delete" parameterType="int">    delete from person where id = #{id}  </delete></mapper>

使用到的数据库表:

CREATE TABLE `person` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(50) NOT NULL,  `age` int(11) DEFAULT '-1',  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

示例

在 Mapping 映射文件中,可以看到引入了一个实体类 Person:

public class Person {    private int id;    private String name;    private int age;    public Person() {    }    public Person(String name, int age) {        this.name = name;        this.age = age;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "Person: [name=" + name + ", age=" + age + "]";    }}

在上述工作都完成的情况下,我们就可以编写访问数据库的 CRUD 代码:

public class PersonServices {    public void add(){        Person person = new Person("Alice", 30);        SqlSession sqlSession = MyBatisUtils.getSqlSession(true);        /**         * 映射sql的标识字符串。         * edu.wzm.mybatis.mapping.PersonMapper是PersonMapper.xml中mapper标签的namespace属性的值,         * insert是insert标签的id属性值,通过update标签的id属性值就可以找到要执行的SQL。         */        int result = sqlSession.insert("edu.wzm.mybatis.mapping.PersonMapper.insert", person);        System.out.println(result);        sqlSession.close();    }    public void getAll(){        SqlSession sqlSession = MyBatisUtils.getSqlSession();        List<Person> persons = sqlSession.selectList("edu.wzm.mybatis.mapping.PersonMapper.getAll");        System.out.println(persons);        sqlSession.close();    }    public void getById(){        SqlSession sqlSession = MyBatisUtils.getSqlSession();        Person person = sqlSession.selectOne("edu.wzm.mybatis.mapping.PersonMapper.getById", 1);        System.out.println(person);        sqlSession.close();    }    public void update(){        Person person = new Person();        person.setId(7);        person.setAge(27);        SqlSession sqlSession = MyBatisUtils.getSqlSession(true);        int result = sqlSession.update("edu.wzm.mybatis.mapping.PersonMapper.update", person);        System.out.println(result);        sqlSession.close();    }    public void delete(){        SqlSession sqlSession = MyBatisUtils.getSqlSession(true);        int result = sqlSession.update("edu.wzm.mybatis.mapping.PersonMapper.delete", 6);        System.out.println(result);        sqlSession.close();    }}

之后,还要启动 MyBatis 的 SQLSession 才能真正使用 MyBatis,下面是 MyBatis 的工具类:

public class MyBatisUtils {    public static SqlSessionFactory getSqlSessionFactory(){        InputStream is = MyBatisUtils.class.getClassLoader().getResourceAsStream(Const.MYBATIS_CONFIG_FILE);        return new SqlSessionFactoryBuilder().build(is);    }    /**     * @param autoCommit     *      true: 表示创建的SqlSession对象在执行完SQL之后会自动提交事务     *      false: 表示创建的SqlSession对象在执行完SQL之后不会自动提交事务,这时就需要我们手动调用sqlSession.commit()提交事务     * @return     */    public static SqlSession getSqlSession(boolean autoCommit){        return getSqlSessionFactory().openSession(autoCommit);    }    public static SqlSession getSqlSession(){        return getSqlSessionFactory().openSession();    }}

测试代码:

public class Driver {    public static void main(String[] args)throws Exception{        PersonServices services = new PersonServices();        services.getById();        services.add();        services.update();        services.delete();        services.getAll();    }}

查看完整代码

参考文献

MyBatis 官网