記錄MyBatis的搭建過程

MyBatis是一個持久層的框架,mybatis可以將向 preparedStatement中的輸入?yún)?shù)自動進行輸入映射,將查詢結果集靈活映射成java對象即輸出映射。

PART_ONE:環(huán)境搭建和配置文件編寫
1.準備基本的user類和數(shù)據(jù)庫user表

package entiy;

import java.io.Serializable;

public class User implements Serializable {
    
    private int id;
    private String name;
    private String address;
    
    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 String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", address=" + address + "]";
    }
    
    

}

2.在MyBatis官網(wǎng)中下載其jar包


image.png

將jar包導入到工程中。
2.編寫SqlMapConfig.xml,這個文件配置基本的數(shù)據(jù)庫連接信息和之后需要的mappers信息。這個文件需要放在資源文件的根下,或者在使用的時候表明位置

<?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="db.properties"></properties>
    <!-- 和spring整合后 environments配置將廢除-->
    <environments default="development">
        <environment id="development">
        <!-- 使用jdbc事務管理,事務控制由mybatis-->
            <transactionManager type="JDBC" />
        <!-- 數(shù)據(jù)庫連接池,由mybatis管理-->
            <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>
        <!--配置單個xml文件-->
        <!--<mapper resource="sqlmap/User.xml"/>
        <mapper resource="mapperxml/UserMapper.xml"/>-->
        
        <!-- 配置mapper接口class的方式 -->
        <!--<mapper class="Mapper.UserMapper"/> -->
        
        <!-- 批量導入的方式 -->
        <package name="Mapper"/>
        
    </mappers>
    
</configuration>

3.編寫user類對應的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">

<!-- namespace命名空間,作用就是對sql進行分類化管理,理解sql隔離 
注意:使用mapper代理方法開發(fā),namespace有特殊重要的作用
-->

<mapper namespace="Mapper.UserMapper">

    <!-- 在 映射文件中配置很多sql語句 -->
        <!-- 需求:通過id查詢用戶表的記錄 -->
        <!-- 通過 select執(zhí)行數(shù)據(jù)庫查詢
        id:標識 映射文件中的 sql
        將sql語句封裝到mappedStatement對象中,所以將id稱為statement的id
        parameterType:指定輸入 參數(shù)的類型,這里指定int型 
        #{}表示一個占位符號
        #{id}:其中的id表示接收輸入 的參數(shù),參數(shù)名稱就是id,如果輸入 參數(shù)是簡單類型,#{}中的參數(shù)名可以任意,可以value或其它名稱
        
        resultType:指定sql輸出結果 的所映射的java對象類型,select指定resultType表示將單條記錄映射成的java對象。
         -->
    <select id="findUserById" parameterType="int" resultType="entiy.User">
        select * from t_user where id =#{value}
    </select>
    
    <!--用戶名模糊查詢用戶,${}表示拼接字符串,如果只需要傳入簡單類型,里面只能傳value-->
    <select id="findUserByName" parameterType="String" resultType="entiy.User">
        select * from t_user where name like '%${value}%'
    </select>
    
    <!-- 添加用戶,#{}中對應User中的變量 -->
    <insert id="addUser" parameterType="entiy.User">
        <!--查詢剛插入的ID,只對sql的自增適用,id是保存在user中的意思-->
        <selectKey keyProperty="id" order="AFTER" resultType="String">SELECT LAST_INSERT_ID()</selectKey>
        
        <!--插入UUID-->
        <!--<selectKey keyProperty="id" order="BEFORE" resultType="String">SELECT UUID()</selectKey>-->
        insert into t_user (name,address) values (#{name},#{address})
    </insert>
    
    <!--刪除用戶-->
    <delete id="deleteUserById" parameterType="int">
        delete from t_user where id =#{id}
    </delete>
    
    <!-- 更新用戶 -->
    <update id="updateUser" parameterType="entiy.User">
        update t_user set name=#{name},address=#{address} where id=#{id}
    </update>
    
    <!-- 用戶綜合查詢 -->
    <select id="findUserList" parameterType="entiy.UserQueryVo" resultType="entiy.UserCustom">
        select * from t_user 
        <where>
            <if test="usercustom!=null">
                <if test="usercustom.address!=null and usercustom.address!=''">
                    and address = #{usercustom.address}
                </if>   
            </if>
        </where>
        
    </select>
    
    <!--自定義的resultMap-->
    <resultMap type="entiy.User" id="userResultMap">
        <id column="id_" property="id"/>
        <result column="name_" property="name"/>
    </resultMap>
    
    <!-- 字段查詢 -->
    <select id="findUserResultMap" parameterType="int" resultMap="userResultMap" >
        select id id_,name name_ from t_user where id = #{id}
    </select>
</mapper>

PART_TWO:基本的CRUD實現(xiàn),之后還有dao和Mapper的兩種方式來實現(xiàn)。

package test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.annotation.Resource;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;

import entiy.User;

public class domain {
    
    @Test
    public void testselect() throws IOException {
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //創(chuàng)建SqlsessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通過工廠得到sqlsession
        SqlSession sqlsession = sessionFactory.openSession();
        //通過sqlsession操作數(shù)據(jù)庫,第一個參數(shù)是User.xml的方法,第二參數(shù)是需要傳入的值
        User user = sqlsession.selectOne("test.findUserById", 1);
        System.out.println(user);
        sqlsession.close();
    }
    
    @Test
    public void testselectByName() throws IOException {
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //創(chuàng)建SqlsessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通過工廠得到sqlsession
        SqlSession sqlsession = sessionFactory.openSession();
        //通過sqlsession操作數(shù)據(jù)庫,第一個參數(shù)是User.xml的方法,第二參數(shù)是需要傳入的值

        List<User> users =  sqlsession.selectList("test.findUserByName", "胖");
        System.out.println(users);
        
        sqlsession.close();
    }
    
    @Test
    public void testinsertuser() throws IOException {
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //創(chuàng)建SqlsessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通過工廠得到sqlsession
        SqlSession sqlsession = sessionFactory.openSession();
        //通過sqlsession操作數(shù)據(jù)庫,第一個參數(shù)是User.xml的方法,第二參數(shù)是需要傳入的值
        
        User test = new User();
        test.setName("傻強");
        test.setAddress("廣州");

        sqlsession.insert("test.addUser",test);
    
        sqlsession.commit();
        System.out.println(test.getId());
        sqlsession.close();
    }
    
    @Test
    public void testdeletuserbyid() throws IOException {
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //創(chuàng)建SqlsessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通過工廠得到sqlsession
        SqlSession sqlsession = sessionFactory.openSession();
        //通過sqlsession操作數(shù)據(jù)庫,第一個參數(shù)是User.xml的方法,第二參數(shù)是需要傳入的值
        
        sqlsession.delete("test.deleteUserById",5);
    
        sqlsession.commit();
        sqlsession.close();
    }
    
    @Test
    public void testupdateuser() throws IOException {
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //創(chuàng)建SqlsessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通過工廠得到sqlsession
        SqlSession sqlsession = sessionFactory.openSession();
        //通過sqlsession操作數(shù)據(jù)庫,第一個參數(shù)是User.xml的方法,第二參數(shù)是需要傳入的值
        
        User test = sqlsession.selectOne("test.findUserById", 3);
        test.setName("沖鋒舟");
        
        sqlsession.update("test.updateUser", test);
    
        sqlsession.commit();
        sqlsession.close();
    }
    

}

PART_THREE:使用dao來實現(xiàn)CRUD操作
1.dao文件


image.png

2.UserDao.java

package dao;

import entiy.User;

public interface UserDao {
    
    public User selectUserById(int id);

}
3.UserDaoImpl.java
package dao;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import entiy.User;

public class UserDaoImpl implements UserDao {
    
    private SqlSessionFactory sqlSessionFactory;
    
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    @Override
    public User selectUserById(int id) {
        SqlSession sqlsession = sqlSessionFactory.openSession();
        User user = sqlsession.selectOne("test.findUserById", id);
        return user;
    }
}

備注:SqlSessionFactory是單線程的以節(jié)約資源,SqlSession是多線程的,因為其線程不安全。

PART_FOUR:使用Mapper(類似dao只是不用寫實現(xiàn)類)來實現(xiàn)CRUD操作
開發(fā)規(guī)范:

1、在mapper.xml中namespace等于mapper接口地址
2、mapper.java接口中的方法名和mapper.xml中statement的id一致
3、mapper.java接口中的方法輸入?yún)?shù)類型和mapper.xml中statement的parameterType指定的類型一致。
4、mapper.java接口中的方法返回值類型和mapper.xml中statement的resultType指定的類型一致。

1.文件結構



2. 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">

<!-- namespace命名空間,作用就是對sql進行分類化管理,理解sql隔離 
注意:使用mapper代理方法開發(fā),namespace有特殊重要的作用
-->

<mapper namespace="Mapper.UserMapper">

    <!-- 在 映射文件中配置很多sql語句 -->
        <!-- 需求:通過id查詢用戶表的記錄 -->
        <!-- 通過 select執(zhí)行數(shù)據(jù)庫查詢
        id:標識 映射文件中的 sql
        將sql語句封裝到mappedStatement對象中,所以將id稱為statement的id
        parameterType:指定輸入 參數(shù)的類型,這里指定int型 
        #{}表示一個占位符號
        #{id}:其中的id表示接收輸入 的參數(shù),參數(shù)名稱就是id,如果輸入 參數(shù)是簡單類型,#{}中的參數(shù)名可以任意,可以value或其它名稱
        
        resultType:指定sql輸出結果 的所映射的java對象類型,select指定resultType表示將單條記錄映射成的java對象。
         -->
    <select id="findUserById" parameterType="int" resultType="entiy.User">
        select * from t_user where id =#{value}
    </select>
    
    <!--用戶名模糊查詢用戶,${}表示拼接字符串,如果只需要傳入簡單類型,里面只能傳value-->
    <select id="findUserByName" parameterType="String" resultType="entiy.User">
        select * from t_user where name like '%${value}%'
    </select>
    
    <!-- 添加用戶,#{}中對應User中的變量 -->
    <insert id="addUser" parameterType="entiy.User">
        <!--查詢剛插入的ID,只對sql的自增適用,id是保存在user中的意思-->
        <selectKey keyProperty="id" order="AFTER" resultType="String">SELECT LAST_INSERT_ID()</selectKey>
        
        <!--插入UUID-->
        <!--<selectKey keyProperty="id" order="BEFORE" resultType="String">SELECT UUID()</selectKey>-->
        insert into t_user (name,address) values (#{name},#{address})
    </insert>
    
    <!--刪除用戶-->
    <delete id="deleteUserById" parameterType="int">
        delete from t_user where id =#{id}
    </delete>
    
    <!-- 更新用戶 -->
    <update id="updateUser" parameterType="entiy.User">
        update t_user set name=#{name},address=#{address} where id=#{id}
    </update>
    
    <!-- 用戶綜合查詢 -->
    <select id="findUserList" parameterType="entiy.UserQueryVo" resultType="entiy.UserCustom">
        select * from t_user 
        <where>
            <if test="usercustom!=null">
                <if test="usercustom.address!=null and usercustom.address!=''">
                    and address = #{usercustom.address}
                </if>   
            </if>
        </where>
        
    </select>
    
    <!--自定義的resultMap-->
    <resultMap type="entiy.User" id="userResultMap">
        <id column="id_" property="id"/>
        <result column="name_" property="name"/>
    </resultMap>
    
    <!-- 字段查詢 -->
    <select id="findUserResultMap" parameterType="int" resultMap="userResultMap" >
        select id id_,name name_ from t_user where id = #{id}
    </select>
</mapper>
3.UserMapper.java(這個名字必須和對應的xml相同)
package Mapper;

import java.util.List;

import entiy.User;
import entiy.UserCustom;
import entiy.UserQueryVo;

public interface UserMapper {
    
    public User findUserById(int id);
    
    public List<User> findUserByName(String name);
    
    public void addUser(User user);
    
    public void deleteUserById(int id);
    
    public List<UserCustom> findUserList(UserQueryVo userQueryVo);
    
    public List<User> findUserResultMap(int id);

}
4.測試類
package test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;

import Mapper.UserMapper;
import entiy.User;
import entiy.UserCustom;
import entiy.UserQueryVo;

public class mapperTest {
    //mapper查詢id用戶
    @Test
    public void testMapper() throws IOException {
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //創(chuàng)建SqlsessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        
        SqlSession sqlSession = sessionFactory.openSession();
        
        UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
        User test = usermapper.findUserById(2);
        System.out.println(test);
    }
    
    //mapper名字查詢用戶集
    @Test
    public void testfindbyname() throws IOException {
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //創(chuàng)建SqlsessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        
        SqlSession sqlSession = sessionFactory.openSession();
        
        UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = usermapper.findUserByName("胖");
        System.out.println(users);
    }
    
    //mapper用戶綜合查詢
        @Test
        public void testfindList() throws IOException {
            String resource = "SqlMapConfig.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            //創(chuàng)建SqlsessionFactory
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            
            SqlSession sqlSession = sessionFactory.openSession();
            
            UserQueryVo userQueryVo = new UserQueryVo();
            UserCustom userCustom = new UserCustom();
            userCustom.setAddress("珠海");
            userQueryVo.setUsercustom(userCustom);
            System.out.println(userQueryVo.getUsercustom().getAddress());
            
            UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
            List<UserCustom> userCustoms = usermapper.findUserList(userQueryVo);
            System.out.println(userCustoms);
        }
        
    //resultMap字段查詢
        @Test
        public void testfindUserResultMap() throws IOException {
            String resource = "SqlMapConfig.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            //創(chuàng)建SqlsessionFactory
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            
            SqlSession sqlSession = sessionFactory.openSession();
            
            UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
            List<User> users = usermapper.findUserResultMap(2);
            System.out.println(users);
        }
}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 1.1mybatis下載 mybaits 的代碼由github.com 管理,地址:https://github....
    暖熊熊閱讀 881評論 0 5
  • 今天是新年的第一天,我感覺有些有些風氣真的讓人很厭惡,盡管說這是老一輩留下來的習俗,我本不應該對此多加言語。但是有...
    憶_江_南閱讀 124評論 0 0
  • 最近知乎上有很多的學生來問我關于高中學習方法的問題,關鍵是提問的時候都幾乎是一致性的商量好了似的,在學習方法前面加...
    渡舟弱水閱讀 406評論 1 0
  • 又是一個無法休整的周末,薈聚網(wǎng)的田野調(diào)查組需要對吉林白山市長白縣的“放山娃”食品進行考察,去發(fā)現(xiàn)各種美味食材。清晨...
    心語_f8a1閱讀 487評論 0 0
  • 同樣一株花草在不同的地方就有了不同的光景。 往往植物是沒有辦法選擇的,只能跟隨栽種的土壤生長。人卻不同,出生在一個...
    美清閱讀 347評論 0 0