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 #{}和${}的區別

相關文章
相關標籤/搜索