Mybatis 的基本使用

mybatis的基本使用


mybatis一般可使用兩種配置方式,一種代理方式,一種非代配置

  • 數據庫表字段
    設計
  • 需要的jar
    這裏寫圖片描述
  • 包結構
    這裏寫圖片描述

  • 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:一般用來讀取資源文件
    -->
    <properties resource="jdbc.properties" />
    <!--
      創建別名,在爲實體創建別名後 在mapper文件中 使用parameterType是可直接寫實體類名
      而不是全類名
    -->
    <typeAliases>
        <package name="com.bjlemon.mybatis.domian"/>
    </typeAliases>
    <environments default="mybatis_1">
        <environment id="mybatis_1">
            <!--有2種屬性值-->
            <transactionManager type="JDBC"/>
            <!--有3種屬性值-->
            <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>

      <!--
        指定mapper文件的位置,mapper和packge標籤兩種方法
       -->
    <mappers>
        <mapper resource="com/bjlemon/mybatis/mapper/userMapper.xml"/>
    </mappers>
</configuration>
  • 實體類User.java
package com.bjlemon.mybatis.domian;

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

public class User implements Serializable{
    private Integer id;
    private String name;
    private  String password;
    private Float salary;
    private Date birthday;

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Float getSalary() {
        return salary;
    }

    public void setSalary(Float salary) {
        this.salary = salary;
    }

    public Date getBirthday() {
        return birthday;
    }

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(id, user.id) &&
                Objects.equals(name, user.name) &&
                Objects.equals(salary, user.salary) &&
                Objects.equals(birthday, user.birthday);
    }

    @Override
    public int hashCode() {

        return Objects.hash(id, name, salary, birthday);
    }

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

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="mybatis_in_action">
    <!--
        此處使用的爲非代理模式,則namespce值爲用戶自定義,在需要使用相關SQL語句時,需要爲namespace+SQL ID
        parameterType:參數類型
        resultType:結果類型
    -->
    <insert id="insert" parameterType="User">
        INSERT  INTO
             mybatis_user(user_name,user_password,user_salary,user_birthday)
         VALUE
               (#{name},#{password},#{salary},#{birthday})
    </insert>
    <select id="findAll" resultType="User">
        SELECT
            user_id id ,
            user_name name,
            user_password password ,
            user_salary salary ,
            user_birthday birthday
        FROM
            mybatis_user
    </select>
</mapper>

UserService接口

package com.bjlemon.mybatis.service;

import com.bjlemon.mybatis.domian.User;

import java.util.List;

public interface UserService {
    void addUser(User user);
    List<User> findAllUserList();
}

UserService實現類

package com.bjlemon.mybatis.service.impl;

import com.bjlemon.mybatis.domian.User;
import com.bjlemon.mybatis.service.UserService;
import com.bjlemon.mybatis.util.MybatisUtils;
import org.apache.ibatis.session.SqlSession;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

public class UerServiceImpl implements UserService{
    @Override
    public void addUser(User user) {
        SqlSession sqlSession = null;
        if (user == null) {
            throw new IllegalArgumentException("");
        }
        try{
            sqlSession = MybatisUtils.getSqlSession();
        /*
           如何mapper文件使用不是代理模式 則此處需要寫成
           namespace+方法名
           使用的爲代理模式時,則可以直接使用方法名
         */
            sqlSession.insert("mybatis_in_action.insert", user);
            sqlSession.commit();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            MybatisUtils.clolseSqlSession();
        }

    }

    @Override
    public List<User> findAllUserList() {
        SqlSession sqlSession = null;
        List<User> userList = Collections.emptyList(); // 避免空指針異常

        try{
            sqlSession = MybatisUtils.getSqlSession();
            userList = sqlSession.selectList("mybatis_in_action.findAll");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            MybatisUtils.clolseSqlSession();
        }
            return  userList;
    }
}

mybatis的sqlSession的創建

  1. 得到SqlSessionFactoryBuilder
  2. 讀取配置文件
  3. 由SqlSessionFactoryBuilder到SqlSessionFactory
  4. 由SqlSessionFactory得到SqlSession
package com.bjlemon.mybatis.util;

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 java.io.InputStream;
public class MybatisUtils {
    private static  SqlSessionFactoryBuilder builder;
    private static SqlSessionFactory sqlSessionFactory;
    //使得sqlSession線程安全
    private  static  ThreadLocal<SqlSession> sqlSessionHolder = new ThreadLocal<>();
    static {
        try{
            builder = new SqlSessionFactoryBuilder();
            // 讀取配置文件
           // InputStream in=MybatisUtils.class.getResourceAsStream("/mybatis.xml");
            InputStream resource = Resources.getResourceAsStream("mybatisConfig.xml");
            sqlSessionFactory = builder.build(resource);
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    /**
     * 保證sqlSesssion線程安全
     * @return
     */
    public  static SqlSession getSqlSession(){
        SqlSession sqlSession = sqlSessionHolder.get();
        if (sqlSession == null){
            sqlSession = sqlSessionFactory.openSession();
            sqlSessionHolder.set(sqlSession);
        }
        return  sqlSession;
    }

    public  static  void clolseSqlSession(){
        SqlSession sqlSession = sqlSessionHolder.get();
        if (sqlSession != null){
            sqlSession.close();
            sqlSessionHolder.remove();
        }
    }
}

測試

package com.bjlemon.mybatis.service.impl;

import com.bjlemon.mybatis.domian.User;
import com.bjlemon.mybatis.service.UserService;
import org.junit.Before;
import org.junit.Test;


import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import static org.junit.Assert.*;

public class UerServiceImplTest {
    private UserService userService;
    @Before
    public void setUp() throws Exception {
        this.userService = new UerServiceImpl();
    }

    @Test
    public void addUser() {
        User user = new User();
        user.setBirthday(new Date());
        user.setPassword("121312313123");
        user.setName("1231");
        user.setSalary(12.33F);
        this.userService.addUser(user);
    }

    @Test
    public  void testSelect(){
        List<User> list = this.userService.findAllUserList();
        for (User user: list){
            System.out.println(user);
        }
    }
}

PS: 僅日常筆記整理,有錯誤請指出,噴子繞路

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章