MyBatis配置記不住,看這裏快速上手

準備工作

在學習Mybatis之前,先需要做一些準備工作,以方便後面測試。

  • 使用Maven依賴相關jar包
  • 配置Log4j日誌文件
  • 準備好用於測試的數據庫
  • 創建實體類

MyBatis相關Jar包

<dependencies>
    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>

    <!--junit-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>

    <!--log4j-->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

    <!--mysql-->
   <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.46</version>
    </dependency>
</dependencies>

Log4j日誌文件

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

創建數據庫

-- 創建數據庫
CREATE DATABASE mybatistest;

-- 使用數據庫
USE mybatistest;

-- 創建數據庫表
CREATE TABLE user(
	id INT PRIMARY KEY AUTO_INCREMENT,
	uname VARCHAR(20),
	usex VARCHAR(20)
);

-- 添加數據
INSERT INTO user(uname,usex) VALUES('張三','男');
INSERT INTO user(uname,usex) VALUES('李四','女');

-- 查詢user表
SELECT * FROM user;

創建User類

public class User {
    private Integer id;
    private String uname;
    private String usex;

    public Integer getId() {
        return id;
    }

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

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getUsex() {
        return usex;
    }

    public void setUsex(String usex) {
        this.usex = usex;
    }
}

MyBatis相關配置文件

創建jdbc.properties文件

# 驅動類
driver=com.mysql.jdbc.Driver
# mysql數據庫url地址
url=jdbc:mysql://localhost:3306/mybatistest
# 用戶名
username=root
# 密碼
password=root

創建UserMapper映射文件

<?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.itheima.dao.UserDao">
    <!--查詢一個學生-->
    <select id="selectUserById" resultType="com.itheima.domain.User" parameterType="Integer">
        select * from user where id=#{id}
    </select>

    <!--查詢所有學生-->
    <select id="selectAllUser" resultType="com.itheima.domain.User">
        select * from user
    </select>

    <!--添加一個學生-->
    <select id="addUser" parameterType="com.itheima.domain.User">
        insert into User(uname,usex) values(#{uname},#{usex})
    </select>

    <!--刪除一個學生-->
    <delete id="deleteUser" parameterType="Integer">
        delete from user where id=#{id}
    </delete>

    <!--修改一個學生-->
    <update id="updateUser" parameterType="com.itheima.domain.User">
        update user set uname=#{uname},usex=#{usex} where id=#{id}
    </update>
</mapper>

創建MyBatis-config.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>
	<!-- 引用config.properties文件中的jdbc配置信息-->
    <properties resource="com/mybatis/jdbc.properties"/>
    <!-- MyBatis可以配置成適應多種環境-->
    <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="com/itheima/mybatis/UserMapper.xml"/>
    </mappers>
</configuration>

舊版本MyBatis執行sql映射

讀取配置文件

//讀取配置文件
InputStream in = Resources.getResourceAsStream("com/itheima/mybatis/mybatis-config.xml");
//根據配置文件構建SqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
//通過SqlSessionFactory創建SqlSession
SqlSession ss = ssf.openSession();

執行sql映射

創建一個測試類,分別對增加、刪除、修改、查詢等方法進行測試

public class UserDaoTest {
    private SqlSession ss = null;
    /*執行在每次@Test運行之前,用於加載MyBatis-config配置文件*/
    @Before
    public void init() {
        try {
            //讀取配置文件
            InputStream in = Resources.getResourceAsStream("com/itheima/mybatis/mybatis-config.xml");
            //根據配置文件構建SqlSessionFactory
            SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
            //通過SqlSessionFactory創建SqlSession
            ss = ssf.openSession();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    /*測試添加*/
    @Test
    public void testAdd() {
        //添加一個用戶
        User user = new User();
        user.setUname("王五");
        user.setUsex("女");
        int count = ss.insert("com.itheima.dao.UserDao.addUser", user);
        System.out.println(count+":"+(count > 0 ? "添加成功" : "添加失敗"));
        ss.commit();
    }

    /*測試查詢*/
    @Test
    public void testSelect() {
        //查詢多個用戶
        List<User> list = ss.selectList("com.itheima.dao.UserDao.selectAllUser");
        for (User o : list) {
            System.out.println(o);
        }
        ss.commit();
        System.out.println("-----------------------");
        User o = ss.selectOne("com.itheima.dao.UserDao.selectUserById", 1);
        System.out.println(o);
    }

    /*測試修改*/
    @Test
    public void testUpdate(){
        User user=new User();
        user.setId(1);
        user.setUname("柳巖");
        user.setUsex("女");
        int count = ss.update("com.itheima.dao.UserDao.updateUser", user);
        System.out.println(count+":"+(count>0?"修改成功":"修改失敗"));
        ss.commit();
    }

    /*刪除修改*/
    @Test
    public void testDelete(){
        int count = ss.update("com.itheima.dao.UserDao.deleteUser", 3);
        System.out.println(count+":"+(count>0?"刪除成功":"刪除失敗"));
        ss.commit();
    }
}

新版本MyBatis執行sql映射

在老版的MayBatis中執行sql映射的代碼寫起來比較麻煩,如添加用戶代碼如下

/*添加用戶*/
@Test
public void testAdd() {
    User user = new User();
    user.setUname("王五");
    user.setUsex("女");
  	//添加用戶
    int count = ss.insert("com.itheima.mapper.UserMapper.addUser", user);
    System.out.println(count+":"+(count > 0 ? "添加成功" : "添加失敗"));
    ss.commit();
}

不過現在有了一種更簡潔的方式 ——使用正確描述每個語句的參數和返回值的接口(比如 UserMapper.class),你現在不僅可以執行更清晰和類型安全的代碼,而且還不用擔心易錯的字符串字面值以及強制類型轉換。

定義UserMapper接口

public interface UserMapper {
    /*查詢所有的User*/
    public List<User> selectAllUser();
    /*通過id查詢一個User*/
    public User selectUserById(Integer id);
    /*添加一個User*/
    public int addUser(User user);
    /*通過id刪除一個User*/
    public int deleteUser(Integer id);
    /*修改一個User*/
    public int updateUser(User user);
}

注意UserMapper接口中的方法的參數和返回值要和UserMapper.xml映射文件中配置的參數和返回值保持一致

定義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.itheima.dao.UserDao">
    <!--查詢一個學生-->
    <select id="selectUserById" resultType="com.itheima.domain.User" parameterType="Integer">
        select * from user where id=#{id}
    </select>

    <!--查詢所有學生-->
    <select id="selectAllUser" resultType="com.itheima.domain.User">
        select * from user
    </select>

    <!--添加一個學生-->
    <insert id="addUser" parameterType="com.itheima.domain.User">
        insert into User(uname,usex) values(#{uname},#{usex})
    </insert>

    <!--刪除一個學生-->
    <delete id="deleteUser" parameterType="Integer">
        delete from user where id=#{id}
    </delete>

    <!--修改一個學生-->
    <update id="updateUser" parameterType="com.itheima.domain.User">
        update user set uname=#{uname},usex=#{usex} where id=#{d}
    </update>
</mapper>

創建測試類並執行

public class UserDaoTest2 {
    /*測試添加*/
    @Test
    public void testAdd() {
        //讀取配置文件
        SqlSession ss =null;
        try {
            InputStream in = Resources.getResourceAsStream("com/itheima/mybatis/mybatis-config.xml");
            SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
            ss= ssf.openSession();
            UserDao mapper = ss.getMapper(UserDao.class);
            //創建一個用戶
            User user = new User();
            user.setUname("趙六");
            user.setUsex("男");
            //添加一個用戶
            Integer i = mapper.addUser(user);
        } catch (IOException e) {
            e.printStackTrace();
            ss.rollback();
            System.out.println("添加失敗,事務已經回滾");
        }finally {
            ss.commit();
            System.out.println("事務已經提交,添加成功");
        }
    }

    /*測試查詢*/
    @Test
    public void testSelect() {
        //讀取配置文件
        try {
            InputStream in = Resources.getResourceAsStream("com/itheima/mybatis/mybatis-config.xml");
            SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
            SqlSession ss = ssf.openSession();
            UserDao mapper = ss.getMapper(UserDao.class);

            //查詢所有用戶
            List<User> users = mapper.selectAllUser();
            for (User user : users) {
                System.out.println(user);
            }
            System.out.println("---------------");

            //查詢一個用戶
            User user = mapper.selectUserById(1);
            System.out.println(user);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /*測試修改*/
    @Test
    public void testUpdate(){
        //讀取配置文件
        SqlSession ss=null;
        try {
            InputStream in = Resources.getResourceAsStream("com/itheima/mybatis/mybatis-config.xml");
            SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
            ss=ssf.openSession();
            UserDao mapper = ss.getMapper(UserDao.class);

            //修改用戶
            User user=new User();
            user.setId(1);
            user.setUname("大鵬");
            user.setUsex("男");

            //修改用戶
            mapper.updateUser(user);
        } catch (IOException e) {
            e.printStackTrace();
            ss.rollback();//回滾事務
            System.out.println("出現異常,回滾事務");
        }finally {
            ss.commit(); //提交事務
            System.out.println("正常執行,事務已經提交");
        }
    }

    /*刪除修改*/
    @Test
    public void testDelete(){
        //讀取配置文件
        SqlSession ss=null;
        try {
            InputStream in = Resources.getResourceAsStream("com/itheima/mybatis/mybatis-config.xml");
            SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
            ss=ssf.openSession();
            UserDao mapper = ss.getMapper(UserDao.class);

            //修改用戶
            mapper.deleteUser(2);
        } catch (IOException e) {
            e.printStackTrace();
            ss.rollback();//回滾事務
            System.out.println("出現異常,回滾事務");
        }finally {
            ss.commit(); //提交事務
            System.out.println("正常執行,事務已經提交");
        }
    }
}

MyBatis核心配置小結

MyBatis的核心配置文件的文檔的頂層結構如下:

configuration(配置)
    properties(屬性)
    settings(設置)
    typeAliases(類型別名)
    typeHandlers(類型處理器)
    objectFactory(對象工廠)
    plugins(插件)
    environments(環境配置)
    	environment(環境變量)
    		transactionManager(事務管理器)
    		dataSource(數據源)
    databaseIdProvider(數據庫廠商標識)
    mappers(映射器)

properties(屬性)

jdbc.properties文件

# 驅動類
driver=com.mysql.jdbc.Driver
# mysql數據庫url地址
url=jdbc:mysql://localhost:3306/mybatistest
# 用戶名
username=root
# 密碼
password=root

mybatis-config.xml中引入jdbc.properties文件

<configuration>
	<!-- 引用config.properties文件中的jdbc配置信息-->
    <properties resource="com/mybatis/jdbc.properties"/>
</configuration>

typeAliases(類型別名)

類型別名是爲 Java 類型設置一個短的名字,存在的意義僅在於用來減少類完全限定名的冗餘

<typeAliases>
  <typeAlias alias="user" type="com.itheima.User"/>
</typeAliases>

在使用com.itheima.User的地方都可以使用user代替

<mapper namespace="com.itheima.dao.UserDao">
    <!--查詢一個學生-->
    <select id="selectUserById" resultType="user" parameterType="Integer">
        select * from user where id=#{id}
    </select>
</mapper>

environments(環境配置)

<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC">
      <property name="..." value="..."/>
    </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>
注意這裏的關鍵點:
    默認使用的環境 ID(比如:default="development")。
    每個 environment 元素定義的環境 ID(比如:id="development")。
    事務管理器的配置(比如:type="JDBC")。
    數據源的配置(比如:type="POOLED")。
    默認的環境和環境 ID 是自解釋的,因此一目瞭然。 你可以對環境隨意命名,但一定要保證默認的環境 ID 要匹配其中一個環境 ID。

mappers(映射器)

使用相對於類路徑的資源引用

<!-- 使用相對於類路徑的資源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

使用映射器接口實現類的完全限定類名

<!-- 使用映射器接口實現類的完全限定類名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章