「Mybatis系列」Mybatis入門

認識MyBatis

mybatis參考網址:http://www.mybatis.org/mybati...html

Github源碼地址:https://github.com/mybatis/my...java

Mybatis是什麼

MyBatis 是一款優秀的持久層框架,它支持定製化SQL、存儲過程以及高級映射。MyBatis 避免了幾乎全部的 JDBC代碼和手動設置參數以及獲取結果集,它可使用簡單的XML註解來配置和映射SQL信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。mysql

Mybatis的由來

  • MyBatis 本是apache的一個開源項目iBatis。
  • 2010年這個項目由apache software foundation 遷移到了google code,而且更名爲MyBatis 。
  • 2013年11月遷移到Github。

ORM是什麼

對象-關係映射(OBJECT/RELATIONALMAPPING,簡稱ORM),是隨着面向對象的軟件開發方法發展而產生的。用來把對象模型表示的對象映射到基於SQL 的關係模型數據庫結構中去。這樣,咱們在具體的操做實體對象的時候,就不須要再去和複雜的 SQL 語句打交道,只需簡單的操做實體對象的屬性和方法 。ORM 技術是在對象和關係之間提供了一條橋樑,前臺的對象型數據和數據庫中的關係型的數據經過這個橋樑來相互轉化。git

ORM框架和MyBatis的區別

對比項 Mybatis Hibernate
市場佔有率
適合的行業 互聯網 電商 項目 傳統的(ERP CRM OA)
性能
Sql靈活性
學習門檻
Sql配置文件 全局配置文件、映射文件 全局配置文件、映射文件
ORM 半自動化 徹底的自動化
數據庫無關性

編碼流程

  1. 編寫全局配置文件:xxxConfig.xml
  2. POJO類
  3. 映射文件:xxxMapper.xml
  4. 編寫dao代碼:xxxDao接口、xxxDaoImpl實現類
  5. 單元測試類

需求

一、根據用戶id查詢一個用戶信息github

二、根據用戶名稱模糊查詢用戶信息列表sql

三、添加用戶數據庫

項目搭建

  • 建立maven工程:mybatis-demo
  • POM文件
<dependencies>
        <!-- mybatis依賴 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!-- mysql依賴 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.35</version>
        </dependency>

        <!-- 單元測試 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
  • SqlMapConfig.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>
    <properties resource="db.properties"></properties>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${db.driver}" />
                <property name="url" value="${db.url}" />
                <property name="username" value="${db.username}" />
                <property name="password" value="${db.password}" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserMapper.xml" />
    </mappers>
</configuration>
  • 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="test">
</mapper>
  • PO類
public class User {

    private int id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    // getter\setter方法
}

需求實現

查詢用戶

映射文件

<!-- 根據id獲取用戶信息 -->
<select id="findUserById" parameterType="int" resultType="com.kkb.mybatis.po.User">
    select * from user where id = #{id} 
</select>

<!-- 根據名稱模糊查詢用戶列表 -->
<select id="findUserByUsername" parameterType="java.lang.String" 
            resultType="com.kkb.mybatis.po.User">
     select * from user where username like '%${value}%' 
</select>

配置說明:apache

- parameterType:定義輸入參數的Java類型,
 - resultType:定義結果映射類型。
 - #{}:至關於JDBC中的?佔位符
 - #{id}表示使用preparedstatement設置佔位符號並將輸入變量id傳到sql。
 - ${value}:取出參數名爲value的值。將${value}佔位符替換。    
    
注意:若是是取簡單數量類型的參數,括號中的參數名稱必須爲value

dao接口和實現類

public interface UserDao {
    public User findUserById(int id) throws Exception;
  public List<User> findUsersByName(String name) throws Exception;
}
  • 生命週期(做用範圍)
  1. sqlsession:方法級別
  2. sqlsessionFactory:全局範圍(應用級別)
  3. sqlsessionFactoryBuilder:方法級別
public class UserDaoImpl implements UserDao {
    //注入SqlSessionFactory
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
        this. sqlSessionFactory = sqlSessionFactory;
    }
    
    private SqlSessionFactory sqlSessionFactory;
    
    @Override
    public User findUserById(int id) throws Exception {
        SqlSession session = sqlSessionFactory.openSession();
        User user = null;
        try {
            //經過sqlsession調用selectOne方法獲取一條結果集
            //參數1:指定定義的statement的id,參數2:指定向statement中傳遞的參數
            user = session.selectOne("test.findUserById", id);
            System.out.println(user);    
        } finally{
            session.close();
        }
        return user;
    }
    
    
    @Override
    public List<User> findUsersByName(String name) throws Exception {
        SqlSession session = sqlSessionFactory.openSession();
        List<User> users = null;
        try {
            users = session.selectList("test.findUsersByName", name);
            System.out.println(users);        
        } finally{
            session.close();
        }
        return users;
    }
}

測試代碼

public class MybatisTest {
    
    private SqlSessionFactory sqlSessionFactory;
    
    @Before
    public void init() throws Exception {
        SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        sqlSessionFactory = sessionFactoryBuilder.build(inputStream);
    }

    @Test
    public void testFindUserById() {
        UserDao userDao = new UserDaoImpl(sqlSessionFactory);
        User user = userDao.findUserById(22);
        System.out.println(user);
    }
    @Test
    public void testFindUsersByName() {
        UserDao userDao = new UserDaoImpl(sqlSessionFactory);
        List<User> users = userDao.findUsersByName("老郭");
        System.out.println(users);
    }
}

{}和${}區別

  • 區別1
#{} :至關於JDBC SQL語句中的佔位符? (PreparedStatement)

${}  : 至關於JDBC SQL語句中的鏈接符合 + (Statement)
  • 區別2
#{} : 進行輸入映射的時候,會對參數進行類型解析(若是是String類型,那麼SQL語句會自動加上’’)

${}  :進行輸入映射的時候,將參數原樣輸出到SQL語句中
  • 區別3
#{} : 若是進行簡單類型(String、Date、8種基本類型的包裝類)的輸入映射時,#{}中參數名稱能夠任意

${}  : 若是進行簡單類型(String、Date、8種基本類型的包裝類)的輸入映射時,${}中參數名稱必須是value
  • 區別4
${} :存在SQL注入問題 ,使用OR 1=1 關鍵字將查詢條件忽略

添加用戶

#{}:是經過反射獲取數據的---StaticSqlSource session

${}:是經過OGNL表達式會隨着對象的嵌套而相應的發生層級變化 --DynamicSqlSourcemybatis

映射文件

<!-- 添加用戶 -->
    <insert id="insertUser" parameterType="com.kkb.mybatis.po.User">
      insert into user(username,birthday,sex,address) 
      values(#{username},#{birthday},#{sex},#{address})
    </insert>

dao接口和實現類

public interface UserDao {
    public void insertUser(User user) throws Exception;
}
public class UserDaoImpl implements UserDao {
    //注入SqlSessionFactory
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
        this. sqlSessionFactory = sqlSessionFactory;
    }
    
    private SqlSessionFactory sqlSessionFactory;
    
    @Override
    Public void insertUser(User user) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            sqlSession.insert("test.insertUser", user);
            sqlSession.commit();
        } finally{
            session.close();
        }    
    }
}

測試代碼

@Override
    Public void insertUser(User user) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            sqlSession.insert("insertUser", user);
            sqlSession.commit();
        } finally{
            session.close();
        }
        
    }

主鍵返回

<insert id="insertUser" parameterType="com.kkb.mybatis.po.User">
        <!-- selectKey將主鍵返回,須要再返回 -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select LAST_INSERT_ID()
        </selectKey>
       insert into user(username,birthday,sex,address)
        values(#{username},#{birthday},#{sex},#{address});
    </insert>

添加selectKey標籤實現主鍵返回。

  • keyProperty:指定返回的主鍵,存儲在pojo中的哪一個屬性
  • order:selectKey標籤中的sql的執行順序,是相對與insert語句來講。因爲mysql的自增原理,執行完insert語句以後纔將主鍵生成,因此這裏selectKey的執行順序爲after。
  • resultType:返回的主鍵對應的JAVA類型
  • LAST_INSERT_ID():是mysql的函數,返回auto_increment自增列新記錄id值。
相關文章
相關標籤/搜索