MyBatis知识点总结

一、JDBC编程的回顾

1.1 准备数据

-- 建立数据库
CREATE DATABASE mybatis;

-- 使用数据库
USE mybatis;

-- 删除表
DROP TABLE IF EXISTS user;

-- 建立表
CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` datetime default NULL COMMENT '生日',
  `sex` char(1) default NULL COMMENT '性别',
  `address` varchar(256) default NULL COMMENT '地址',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 插入数据
insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'张三','2019-03-27 18:47:08','男','北京');
insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (42,'李四','2019-03-27 18:47:08','男','上海');
insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (43,'王五','2019-03-27 18:47:08','男','广州');

1.2 搭建maven工程

File -> New -> Module
image.pngjava

Maven -> Module SDK -> Next
image.pngmysql

Finish
image.pngsql

导入坐标
image.png数据库

1.3 JDBC编程

import java.sql.*;

public class TestJdbc {
    public static void main(String args[]) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            //1. 加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2. 获取链接
            String url = "jdbc:mysql://localhost:3306/mybatis";
            String username = "root";
            String password = "root";
            connection = DriverManager.getConnection(url, username, password);
            //3. 获取预处理对象
            String sql = "SELECT * FROM user WHERE id = ?";
            preparedStatement = connection.prepareStatement(sql);
            // 设置参数
            preparedStatement.setInt(1,41);
            // 执行查询
            resultSet = preparedStatement.executeQuery();
            // 处理结果集
            while (resultSet.next()) {
                System.out.println(resultSet.getString("username"));
                System.out.println(resultSet.getDate("birthday"));
                System.out.println(resultSet.getString("sex"));
                System.out.println(resultSet.getString("address"));
            }
        }catch (Exception ex) {
            ex.printStackTrace();
        }finally {
            try {
                // 关闭链接,释放资源
                if (resultSet != null) {
                    resultSet.close();
                }
                if (preparedStatement != null) {
                    preparedStatement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            }catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }
}

1.4 JDBC变成缺点分析

image.png

二、MyBatis简介

2.1 什么是Mybatis?

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,而且更名为MyBatis 。

2.2 Mybatis的总体架构

image.png

三、MyBatis入门案例

3.1 准备数据

-- 建立数据库
CREATE DATABASE mybatis;

-- 使用数据库
USE mybatis;

-- 删除表
DROP TABLE IF EXISTS user;

-- 建立表
CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` datetime default NULL COMMENT '生日',
  `sex` char(1) default NULL COMMENT '性别',
  `address` varchar(256) default NULL COMMENT '地址',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 插入数据
insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'张三','2019-03-27 18:47:08','男','北京');
insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (42,'李四','2019-03-27 18:47:08','男','上海');
insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (43,'王五','2019-03-27 18:47:08','男','广州');

3.1 搭建maven工程

File -> New -> Module
image.pngapache

Maven -> Module SDK -> Next
image.png编程

Finish
image.pngmybatis

导入坐标
image.png架构

3.2 建立数据表对应的pojo与dao接口

3.2.1 建立pojo

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public User() {
    }

    public User(Integer id, String username, Date birthday, String sex, String address) {
        this.id = id;
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

3.2.2 建立dao接口

public interface UserDao {
    /**
     * 查询全部用户
     * @return
     */
    List<User> findAll();
}

3.3 建立Mybatis配置文件

3.3.1 建立Mybatis主配置文件

<?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>
    <!-- 环境,能够配置多个,default:指定采用哪一个环境 -->
    <environments default="development">
        <!-- id:environment的惟一标识 -->
        <environment id="development">
            <!-- 事务管理器,JDBC类型的事务管理器 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 数据源,池类型的数据源 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- 映射配置文件 -->
    <mappers>
        <mapper resource="com/mybatis/dao/UserDao.xml"></mapper>
    </mappers>
</configuration>

3.3.2 建立Mybatis映射配置文件

<?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.mybatis.dao.UserDao">
    <select id="findAll" resultType="com.mybatis.domain.User">
        SELECT * FROM user;
    </select>
</mapper>

3.4 MyBatis执行测试

3.4.1 测试主类

public class MybatisTest {
    /**
     * 入门案例测试类
     * @param args
     */
    public static void main(String[] args) throws Exception{
        //1. 读取配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2. 获取SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //3. 获取SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        //4. 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //5. 获取接口的代理对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        //6. 使用代理对象执行方法
        List<User> userList = userDao.findAll();
        for (User user : userList) {
            System.out.println(user);
        }
        //7. 释放资源
        sqlSession.close();
        inputStream.close();
    }
}

3.4.2 执行结果

User{id=41, username='张三', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='北京'}
User{id=42, username='李四', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='上海'}
User{id=43, username='王五', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='广州'}

3.5 Mybatis入门案例流程总结

1.准备数据
2.搭建maven工程,导入坐标
3.建立数据表对应的pojo与dao接口
4.建立Mybatis的主配置文件与映射配置文件
5.建立测试类app

四、使用MyBatis进行CRUD操做

4.1 建立maven工程,导入坐标

File -> New -> Module
image.pngdom

Maven -> Module SDK -> Next
image.png

Finish
image.png

导入坐标
image.png

4.2 建立数据表对应的pojo与dao接口

4.2.1 建立pojo

User类
import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public User() {
    }

    public User(Integer id, String username, Date birthday, String sex, String address) {
        this.id = id;
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
QueryVo类
import java.io.Serializable;

public class QueryVo implements Serializable {
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String toString() {
        return "QueryVo{" +
                "user=" + user +
                '}';
    }
}

4.2.2 建立dao接口

public interface UserDao {
    /**
     * 查询全部
     * @return
     */
    List<User> findAll();

    /**
     * 保存用户
     * @param user
     */
    void saveUser(User user);

    /**
     * 更新用户
     * @param user
     */
    void updateUser(User user);

    /**
     * 删除用户
     * @param id
     */
    void deleteUser(Integer id);

    /**
     * 根据id查询用户
     * @param id
     */
    User findById(Integer id);

    /**
     * 根据名称模糊查询
     * @param username
     * @return
     */
    List<User> findByUsername(String username);

    /**
     * 查询用户的总记录数
     * @return
     */
    Integer findTotal();

    /**
     * 根据pojo查询用户
     */
    List<User> findByQueryVo(QueryVo queryVo);
}

4.3 建立Mybatis配置文件

4.3.1 建立Mybatis主配置文件

<?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>
    <!-- 环境,能够配置多个,default:指定采用哪一个环境 -->
    <environments default="development">
        <!-- id:environment的惟一标识 -->
        <environment id="development">
            <!-- 事务管理器,JDBC类型的事务管理器 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 数据源,池类型的数据源 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- 映射配置文件 -->
    <mappers>
        <mapper resource="com/mybatis/dao/UserDao.xml"></mapper>
    </mappers>
</configuration>

4.3.1 建立Mybatis映射配置文件

<?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.mybatis.dao.UserDao">
    <!-- 查询全部 -->
    <select id="findAll" resultType="com.mybatis.domain.User">
        SELECT * FROM user
    </select>

    <!-- 保存用户 -->
    <insert id="saveUser" parameterType="com.mybatis.domain.User">
        INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
    </insert>

    <!-- 更新用户 -->
    <update id="updateUser" parameterType="com.mybatis.domain.User">
        UPDATE user
        SET username = #{username},
            birthday = #{birthday},
            sex = #{sex},
            address = #{address}
        WHERE id = #{id}
    </update>

    <!-- 删除用户 -->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        DELETE FROM user WHERE id = #{id}   <!-- 当只有一个参数时,参数名称能够任意 -->
    </delete>

    <!-- 根据id查询用户 -->
    <select id="findById" parameterType="java.lang.Integer" resultType="com.mybatis.domain.User">
        SELECT * FROM user WHERE id = #{id}
    </select>

    <!-- 根据名称模糊查询 -->
    <select id="findByUsername" parameterType="java.lang.String" resultType="com.mybatis.domain.User">
        SELECT * FROM user WHERE username LIKE #{%username%}
    </select>

    <!-- 查询用户的总记录数 -->
    <select id="findTotal" resultType="java.lang.Integer">
        SELECT COUNT(id) FROM user
    </select>

    <!-- 根据pojo查询用户 -->
    <select id="findByQueryVo" parameterType="com.mybatis.domain.QueryVo" resultType="com.mybatis.domain.User">
        SELECT * FROM user WHERE username = #{user.username}
    </select>
</mapper>

4.4 MyBatis执行测试

4.4.1 测试主类

public class MybatisTest {

    private InputStream inputStream;
    private SqlSessionFactoryBuilder sqlSessionFactoryBuilder;
    private SqlSessionFactory sqlSessionFactory;
    private SqlSession sqlSession;
    private UserDao userDao;

    @Before
    public void init() throws Exception{
        //1. 读取配置文件
        this.inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2. 获取SqlSessionFactoryBuilder
        this.sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //3. 获取SqlSessionFactory
        this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        //4. 获取SqlSession
        this.sqlSession = sqlSessionFactory.openSession();
        //5. 获取接口的代理对象
        this.userDao = sqlSession.getMapper(UserDao.class);
    }

    @After
    public void destroy() throws Exception{
        //8. 提交事务
        sqlSession.commit();
        //9. 关闭资源
        sqlSession.close();
        inputStream.close();
    }

    /**
     * 查询全部
     */
    @Test
    public void testFindAll() throws Exception {
        List<User> userList = this.userDao.findAll();
        for (User user : userList) {
            System.out.println(user);
        }
    }

    /**
     * 保存用户
     */
    @Test
    public void testSaveUser() throws Exception {
        //6. 利用代理对象调用接口中的方法
        User user = new User();
        user.setUsername("找老刘");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("上海陆家嘴");
        this.userDao.saveUser(user);
    }

    /**
     * 更新用户
     */
    @Test
    public void testUpdateUser() throws Exception {
        User user = new User();
        user.setId(53);
        user.setUsername("王五");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("香格里拉");
        userDao.updateUser(user);
    }

    /**
     * 删除用户
     */
    @Test
    public void testDeleteUser() throws Exception {
        userDao.deleteUser(53);
    }

    /**
     * 根据id查询用户
     */
    @Test
    public void testFindById() throws Exception {
        User user = userDao.findById(51);
        System.out.println(user);
    }

    /**
     * 根据名称模糊查询
     */
    @Test
    public void testFindByUsername() throws Exception {
        List<User> userList = userDao.findByUsername("老王");
        for (User user : userList) {
            System.out.println(user);
        }
    }

    /**
     * 查询用户的总记录数
     */
    @Test
    public void testFindTotal() throws Exception {
        Integer total = userDao.findTotal();
        System.out.println(total);
    }

    /**
     * 根据pojo查询用户
     */
    @Test
    public void testFindByQueryVo() throws Exception {
        User user = new User();
        user.setUsername("tom");
        QueryVo queryVo = new QueryVo();
        queryVo.setUser(user);
        List<User> userList = userDao.findByQueryVo(queryVo);
        for (User u : userList) {
            System.out.println(u);
        }
    }
}

4.4.2 执行结果

-- 执行findAll()
User{id=41, username='张三', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='北京'}
User{id=42, username='李四', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='上海'}
User{id=43, username='王五', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='广州'}

五、MyBatis主配置文件

image.png

5.1 属性(properties)

MyBatis主配置文件中的properties元素的propertie子元素的value属性的值,便可以直接定义,也能够在主配置文件中定义而后引用,也能够引用外部的properties文件。举例子来讲就是,以下的两个xml的配置效果是同样的。

5.1.1 直接配置

<?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"></transactionManager>
            <dataSource type="pooled">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/eesy"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <mapper resource="com/mybatis/dao/UserDao.xml"></mapper>
    </mappers>
    
</configuration>

5.1.2 引用配置

<?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/eesy"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </properties>
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="jdbc"></transactionManager>
            <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="com/mybatis/dao/UserDao.xml"></mapper>
    </mappers>
    
</configuration>

以上两种形式,在开发过程当中通常不会这么用。通常是直接类路径下(在maven工程下就是resources目录下)定义一个properties文件,而后在MyBatis的主配置文件中引用该文件,而后就能够在主配置文件中直接引用。以下所示:

5.1.3 引用properties配置文件

5.1.3.1 properties配置文件
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/mybatis
jdbc.username = root
jdbc.password = root
5.1.3.2 MyBatis主配置文件
<?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="datasource.properties"></properties>

    <environments default="development">
        <environment id="development">
            <transactionManager type="jdbc"></transactionManager>
            <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 resource="com/mybatis/dao/UserDao.xml"></mapper>
    </mappers>

</configuration>

5.1.3.3 目录结构

image.png

5.1.3.4 注意事项

  1. properties标签的resource属性指向的类路径下的文件(在maven工程下为resources目录下)。
  2. 在${jdbc.driver}中,大括号里面的值要对应properties文件中定义的变量名,要个要求一一对应。
  3. 若是属性在不仅一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:

    1. 在 properties 元素体内指定的属性首先被读取。
    2. 而后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
    3. 最后读取做为方法参数传递的属性,并覆盖已读取的同名属性。
    4. 总结:经过方法参数传递的属性具备最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。

5.2 设置(settings)

5.3 别名(typeAliases)

在MyBatis的映射配置文件中(也就是接口对应的XxxMapper.xml文件),每当指定一个java类的所属类型时,都须要拼写出该类的全限定类名。例以下面的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.mybatis.dao.UserDao">
    <!-- 查询全部 -->
    <select id="findAll" resultType="com.mybatis.domain.User">
        SELECT * FROM user
    </select>

    <!-- 保存用户 -->
    <insert id="saveUser" parameterType="com.mybatis.domain.User">
        INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
    </insert>
</mapper>

如上这样配置存在一个问题,当配置文件少的时候还好,若是配置文件的数量一旦增多,就会致使工做量激增。因此就有了给java类的全限定类名取一个简短的别名,用别名代替全限定类名,减小没必要要的工做量。具体操做以下。

主配置文件中使用typeAliases标签为pojo的全限定类名去一个别名,而后把映射配置文件中pojo的全限定类名替换成别名便可。别名能够任意,且当使用了别名后,别名将不区分大小写。具体配置以下。

主配置文件

<?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>
    <!-- 注意configuration下的子标签严格区分定义顺序(使用顺序) -->
    <properties resource="datasource.properties"></properties>

    <typeAliases>
        <!--
            type:用于指定pojo的全限定类名;
            alias:用于指定别名
        -->
        <typeAlias type="com.mybatis.domain.User" alias="user"></typeAlias>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="jdbc"></transactionManager>
            <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 resource="com/mybatis/dao/UserDao.xml"></mapper>
    </mappers>
</configuration>

映射文件

<?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.mybatis.dao.UserDao">
    <!-- 查询全部 -->
    <!-- 使用了别名后pojo的别名不区分大小写 -->
    <select id="findAll" resultType="user">
        SELECT * FROM user
    </select>

    <!-- 保存用户 -->
    <insert id="saveUser" parameterType="User">
        INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
    </insert>
</mapper>

以上操做虽然已经能极大的简化咱们的开发,可是,一个项目中不可能只有一两个pojo。因此若是咱们要使用上述的方式指定定义一个项目中全部pojo的话也不现实。typeAliases下除了typeAlias子标签外,还有一个package子标签,该标签的做用是为某个指定的包下全部的pojo一块儿取别名,默认类名即为别名。具体以下所示。

<?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>
    <!-- 注意configuration下的子标签严格区分定义顺序(使用顺序) -->
    <properties resource="datasource.properties"></properties>

    <typeAliases>
        <!--
            type:用于指定pojo的全限定类名;
            alias:用于指定别名
        -->
        <typeAlias type="com.mybatis.domain.User" alias="user"></typeAlias>
        <!-- 为com.mybatis.domain子包下的pojo一块儿取别名,别名即为类名 -->
        <package name="com.mybatis.domain"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="jdbc"></transactionManager>
            <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 resource="com/mybatis/dao/UserDao.xml"></mapper>
    </mappers>
</configuration>

六、MyBatis映射配置文件

6.1 CRUD标签

6.1.1 <select>标签

<select id="findById" parameterType="java.lang.Integer" resultType="com.mybatis.domain.User">
  SELECT * FROM user WHERE id = #{id}
</select>

属性说明

  • id:当前select标签在当前映射配置文件中的惟一标识符;
  • parameterType:参数类型,若是为非基本类型的pojo,则须要写出pojo的全限定类名(若是取了别名,可使用别名),若是为基本类型,能够直接写全限定类名,也能够直接写类名,若是没有则省略;
  • resultType:返回值类型,若是为非基本类型的pojo,则须要写出pojo的全限定类名(若是取了别名,可使用别名),若是为基本类型,能够直接写全限定类名,也能够直接写类名,若是没有则省略;

6.1.2 <insert>标签

<insert id="saveUser" useGeneratedKeys="true" keyColumn="id" keyProperty="id"  parameterType="com.mybatis.domain.User">
    INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>

属性说明

  • id:当前select标签在当前映射配置文件中的惟一标识符;
  • parameterType:参数类型,若是为非基本类型的pojo,则须要写出pojo的全限定类名(若是取了别名,可使用别名),若是为基本类型,能够直接写全限定类名,也能够直接写类名,若是没有则省略;
  • useGeneratedKeys:开启主键回写(当咱们向数据库插入数据时,主键是设置的自增的,可是咱们插入好数据库后,咱们但愿获得刚刚插入的数据的主键,mybatis经过useGeneratedKeys、keyColumn、keyProperty能够实现该需求);
  • keyColumn:keyColumn:主键列名(既数据库表中的列名);
  • keyProperty:主键对应的属性名(实体中的属性名);

6.1.3 <updata>标签

<update id="updateUser" parameterType="com.mybatis.domain.User">
    UPDATE user
    SET username = #{username},
        birthday = #{birthday},
        sex = #{sex},
        address = #{address}
    WHERE id = #{id}
</update>

属性说明

  • id:当前select标签在当前映射配置文件中的惟一标识符;
  • parameterType:参数类型,若是为非基本类型的pojo,则须要写出pojo的全限定类名(若是取了别名,可使用别名),若是为基本类型,能够直接写全限定类名,也能够直接写类名,若是没有则省略;

6.1.4 <delete>标签

<delete id="deleteUser" parameterType="java.lang.Integer">
    <!-- 当只有一个参数时,参数名称能够任意 -->
    DELETE FROM user WHERE id = #{id}   
</delete>

属性说明

  • id:当前select标签在当前映射配置文件中的惟一标识符;
  • parameterType:参数类型,若是为非基本类型的pojo,则须要写出pojo的全限定类名(若是取了别名,可使用别名),若是为基本类型,能够直接写全限定类名,也能够直接写类名,若是没有则省略;

6.1.5 #{}和${}的区别

相关文章
相关标签/搜索