天天看點

Mybatis入門1.簡介2.第一個mybatis程式3.CRUD(增删改查)4.使用注解開發5.log4j

[toc]

1.簡介

1-1什麼是mybatis

MyBatis 是一款優秀的持久層架構,它支援自定義 SQL、存儲過程以及進階映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設定參數和擷取結果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為資料庫中的記錄。

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

iBATIS一詞來源于“internet”和“abatis”的組合,是一個基于Java的持久層架構。iBATIS提供的持久層架構包括SQL Maps和Data Access Objects(DAOs)

如何使用mybatis?

  • github倉庫下載下傳
  • maven

<!--

https://mvnrepository.com/artifact/org.mybatis/mybatis

-->

<dependency>

    <groupId>org.mybatis</groupId>

    <artifactId>mybatis</artifactId>

    <version>3.5.7</version>

</dependency>

  • mybatis中文文檔

1-2.持久層簡介

資料持久化

持久化:就是将程式的資料在持久狀态和瞬時狀态時轉換的過程

記憶體:斷電即失---記憶體轉換到硬碟就是持久化

資料庫(JDBC)IO檔案持久化(由于IO浪費資源,是以誕生了資料庫)

為什麼需要持久化

持久化技術封裝了資料通路細節,為大部分業務邏輯提供面向對象的API。

● 通過持久化技術可以減少通路資料庫資料次數,增加應用程式執行速度;

● 代碼重用性高,能夠完成大部分資料庫操作;

● 松散耦合,使持久化不依賴于底層資料庫和上層業務邏輯實作,更換資料庫時隻需修改配置檔案而不用修改代碼。

持久層

Dao層,Service層,Controller層

  • 完成持久化的代碼塊
  • 層界限十分明顯

    [quote]狹義的了解: “持久化”僅僅指把域對象永久儲存到資料庫中;廣義的了解,“持久化”包括和資料庫相關的各種操作(持久化就是将有用的資料以某種技術儲存起來,将來可以再次取出來應用,資料庫技術,将記憶體資料一檔案的形式儲存在永久媒體中(磁盤等)都是持久化的例子.)。

    ● 儲存:把域對象永久儲存到資料庫。

    ● 更新:更新資料庫中域對象的狀态。

    ● 删除:從資料庫中删除一個域對象。

    ● 加載:根據特定的OID,把一個域對象從資料庫加載到記憶體。

    ● 查詢:根據特定的查詢條件,把符合查詢條件的一個或多個域對象從資料庫加載内在存中。

1-3.為什麼需要mybatis

mybatis做好了自動封裝資料對象這件事

實際上在mybatis的應用場景裡面,開發者要的就是自動封裝,把sql查詢結果轉化為指定的java對象,這就足夠了。

  • 簡單友善
  • 減少備援,解耦合
  • 自動化
  • 容易上手
  • 提供映射标簽,支援對象與資料庫的orm字段關系映射
  • 提供對象關系映射标簽,支援對象關系組建維護
  • 提供xml标簽,支援編寫動态sql。
  • 使用的人(公司)多

    技術沒有高低之分,關鍵還在個人。

2.第一個mybatis程式

思路:搭建環境-->導入mybatis-->編寫代碼-->運作

2-1.搭建環境

搭建資料庫

用sql語句或者可視化工具建立資料庫,在這裡建議用sql語句

CREATE DATABASE ConfessionWall;

USE ConfessionWall;

-- 使用者表

CREATE TABLE IF NOT EXISTS userTbl(

userId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

userName VARCHAR(200) NOT NULL,

userAvatarId VARCHAR(500) NOT NULL,

userNickName VARCHAR(200),

userPassword VARCHAR(200) NOT NULL,

userQuestion VARCHAR(200),

userAge INT,

userSex VARCHAR(20),

userMajor VARCHAR(100),

userClass VARCHAR(100)

);

建立普通maven項目

建立maven項目删除結構,建立子項目;

在父項目的pom.xml中導入依賴

    <!--父工程-->

    <!--導入依賴-->

    <dependencies>

        <!--mysql驅動-->

        <!--

https://mvnrepository.com/artifact/mysql/mysql-connector-java

        <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

            <version>8.0.26</version>

        </dependency>

        <!--mybatis-->

            <groupId>org.mybatis</groupId>

            <artifactId>mybatis</artifactId>

            <version>3.5.7</version>

        <!--junit-->

https://mvnrepository.com/artifact/junit/junit

            <groupId>junit</groupId>

            <artifactId>junit</artifactId>

            <version>4.13.2</version>

            <scope>test</scope>

    </dependencies>

2-2.建立一個子產品

  • 編寫mybatis核心配置檔案

在resources下建立檔案mybatis-config.xml

注意在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核心配置檔案-->

<configuration>

    <!--環境(可以配置多個環境)-->

    <environments default="development">

        <environment id="development">

            <!--事務管理-->

            <transactionManager type="JDBC"/>

            <!--資料源-->

            <dataSource type="POOLED">

                <!--driver-->

                <property name="driver" value="${driver}"/>

                <!--url-->

                <property name="url" value="${url}"/>

                <!--資料庫名-->

                <property name="username" value="${username}"/>

                <!--資料庫密碼-->

                <property name="password" value="${password}"/>

            </dataSource>

        </environment>

    </environments>

    <!--配置映射mapper.xml-->

    <mappers>

        <mapper resource="mapper/UserMapper.xml"/>

    </mappers>

</configuration>

  • 編寫mybatis工具類

com.baize.utils.MybatisUtil.java

/**

 * SqlSessionFactory--sqlSession

 */

public class MybatisUtil {

    private static SqlSessionFactory sqlSessionFactory;

    /*

    static方法會在類中自動運作

     */

    static {

        try {

            //使用mybatis 第一步:擷取sqlSessionFactory對象

            String resource = "mybatis-config.xml";

            InputStream inputStream = Resources.getResourceAsStream(resource);

            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    //既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的執行個體。

    // SqlSession 提供了在資料庫執行 SQL 指令所需的所有方法。

    // 你可以通過 SqlSession 執行個體來直接執行已映射的 SQL 語句。例如:

    public static SqlSession getSqlSession(){

        SqlSession sqlSession = sqlSessionFactory.openSession();

        return sqlSession;

}

2-3.編寫代碼

  • 實體類

 * 實體類

public class User {

    private int id;

    private String name;

    private String sex;

    private String tell;

    private String addr;

    private int money;

    public User(int id, String name, String sex, String tell, String addr, int money) {

        this.id = id;

        this.name = name;

        this.sex = sex;

        this.tell = tell;

        this.addr = addr;

        this.money = money;

    public User() {}

    public int getId() {

        return id;

    public void setId(int id) {

    public String getName() {

        return name;

    public void setName(String name) {

    public String getSex() {

        return sex;

    public void setSex(String sex) {

    public String getTell() {

        return tell;

    public void setTell(String tell) {

    public String getAddr() {

        return addr;

    public void setAddr(String addr) {

    public int getMoney() {

        return money;

    public void setMoney(int money) {

    @Override

    public String toString() {

        return "User{" +

                "id=" + id +

                ", name='" + name + '\'' +

                ", sex='" + sex + '\'' +

                ", tell='" + tell + '\'' +

                ", addr='" + addr + '\'' +

                ", money=" + money +

                '}';

  • Dao接口

 * 等價與之後的mapper

public interface UserDao {

    List<User> getUserList();

  • 接口實作類

    沒有mybatis之前

 * 沒有mybatis時的寫法

public class UserDaoImpl implements UserDao{

    public List<User> getUserList() {

        //執行sql

        String sql = "";

        //傳回結果集

        //******

        return null;

有了mybatis之後

<!DOCTYPE mapper

        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace綁定一個對應的dao/mapper接口-->

<mapper namespace="com.baize.dao.UserDao">

    <!--

        查詢語句

        id 對應查詢名字

        resultType傳回值類型

    -->

    <select id="getUserList" resultType="com.baize.entity.User">SELECT * FROM customer_table</select>

</mapper>

2-4.測試

在綠色檔案夾中相同位置編寫測試類(需要有junit)

 * 測試類

public class UserDaoTest {

    @Test

    public void test(){

        //獲得SqlSession對象

        SqlSession sqlSession = MybatisUtil.getSqlSession();

        //執行sql(方式一:getmapper)

//        UserDao userMapper = sqlSession.getMapper(UserDao.class);

//        List<User> userList = userMapper.getUserList();

        //方式2:(不推薦使用)

        List<User> users = sqlSession.selectList("com.baize.dao.UserDao.getUserList");

        for (User user:users) {

            System.out.print(user.getName());

        //關閉sqlSession

        sqlSession.close();

3.CRUD(增删改查)

UserDao(UserMapper.java)

    //擷取全部使用者

    //根據id查詢使用者

    User getUserById(int id);

    //增加一個使用者

    int addUser(User user);

    //修改一個使用者

    int updateUser(User user);

    //删除一個使用者

    int deleteUser(int id);

UserMapper.xml

    <select id="getUserList" resultType="com.baize.entity.User">

        SELECT * FROM customer_table

    </select>

    <select id="getUserById" resultType="com.baize.entity.User" parameterType="int">

        SELECT * FROM customer_table WHERE id = #{id}

    <!--對象中的屬性可以直接取出來-->

    <insert id="addUser" parameterType="com.baize.entity.User">

        INSERT INTO customer_table (id, name, sex, tell, addr, money) values(#{id},#{name},#{sex},#{tell},#{addr},#{money})

    </insert>

    <update id="updateUser" parameterType="com.baize.entity.User">

        UPDATE customer_table SET money=#{money},addr = #{addr} where id = #{id}

    </update>

    <delete id="deleteUser" parameterType="int">

        DELETE FROM customer_table where id = #{id}

    </delete>

UserDaoTest

package com.baize.dao;

import com.baize.entity.User;

import com.baize.utils.MybatisUtil;

import org.apache.ibatis.session.SqlSession;

import org.junit.Test;

import java.util.List;

        //方式2:

    /**

     * 根據id查詢使用者

    public void getUserById(){

        UserDao userDao = sqlSession.getMapper(UserDao.class);

        User user = userDao.getUserById(1);

        System.out.println(user.toString());

    public void addUser(){

        User user = new User(229,"張三","NAN","18271837181","BeiJing",2000);

        int result = userDao.addUser(user);

        //增删改需要 送出事務

        sqlSession.commit();

        System.out.println(result);

    public void updateUser(){

        User user = new User();

        user.setId(1);

        user.setAddr("shanghai");

        user.setMoney(3000);

        int result = userDao.updateUser(user);

    public void deleteUser(){

        int result = userDao.deleteUser(1);

4.使用注解開發

4-1.mybatis 的常用注解說明

@Insert:實作新增 

@Update:實作更新 

@Delete:實作删除 

@Select:實作查詢 

@Result:實作結果集封裝 

@Results:可以與@Result 一起使用,封裝多個結果集 

@ResultMap:實作引用@Results 定義的封裝 

@One:實作一對一結果集封裝 

@Many:實作一對多結果集封裝 

@SelectProvider: 實作動态 SQL 映射 

@CacheNamespace:實作注解二級緩存的使用

這裡以查詢為例:(因為其他的和之前的映射的寫法相同)

UserMapper.java

public interface UserMapper {

    @Select("SELECT * FROM customer_table")

    List<User> userList();

MybatisUtil.java

mybatis-config.xml

在這裡,我們使用引入外部檔案的方式引入資料庫配置

    <!-- 引入外部配置檔案-->

    <properties resource="jdbcConfig.properties"/>

    <!--配置别名-->

<!--    <typeAliases>-->

<!--        <package name="com.baize"></package>-->

<!--    </typeAliases>-->

    <!--配置UserMapper-->

        <mapper class="com.baize.dao.UserMapper"/>

jdbcConfig.properties

username=root

url=jdbc:mysql://localhost:3306/customer_db?serverTimezone=GMT&useSSL=true&useUnicode=true&characterEncoding=UTF-8

driver=com.mysql.cj.jdbc.Driver

password=12345678

dao層不再舉例,和之前相同

以上就是使用注解開發的方式,當然在工作過程中這種方法隻适用于簡單的sql

5.log4j

Log4j是一種非常流行的日志架構,最新版本是2.x。

特點:

  • 控制日志資訊輸送的目的地是控制台、檔案、GUI元件,甚至是套接口伺服器、NT的事件記錄器、UNIX Syslog守護程序等;
  • 控制每一條日志的輸出格式;
  • 通過定義每一條日志資訊的級别,我們能夠更加細緻地控制日志的生成過程
  • 可以通過一個配置檔案來靈活地進行配置,而不需要修改應用的代碼。
  1. 導入log4j的包
https://mvnrepository.com/artifact/log4j/log4j

            <groupId>log4j</groupId>

            <artifactId>log4j</artifactId>

            <version>1.2.17</version>

  1. log4j.properties

log4j.rootLogger=DEBUG,console,dailyFile,im

log4j.additivity.org.apache=true

# 控制台(console)

log4j.appender.console=org.apache.log4j.ConsoleAppender

log4j.appender.console.Threshold=DEBUG

log4j.appender.console.ImmediateFlush=true

log4j.appender.console.Target=System.err

log4j.appender.console.layout=org.apache.log4j.PatternLayout

log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 日志檔案(logFile)

log4j.appender.logFile=org.apache.log4j.FileAppender

log4j.appender.logFile.Threshold=DEBUG

log4j.appender.logFile.ImmediateFlush=true

log4j.appender.logFile.Append=true

log4j.appender.logFile.File=D:/logs/log.log4j

log4j.appender.logFile.layout=org.apache.log4j.PatternLayout

log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 復原檔案(rollingFile)

log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender

log4j.appender.rollingFile.Threshold=DEBUG

log4j.appender.rollingFile.ImmediateFlush=true

log4j.appender.rollingFile.Append=true

log4j.appender.rollingFile.File=D:/logs/log.log4j

log4j.appender.rollingFile.MaxFileSize=200KB

log4j.appender.rollingFile.MaxBackupIndex=50

log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout

log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 定期復原日志檔案(dailyFile)

log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender

log4j.appender.dailyFile.Threshold=DEBUG

log4j.appender.dailyFile.ImmediateFlush=true

log4j.appender.dailyFile.Append=true

log4j.appender.dailyFile.File=D:/logs/log.log4j

log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd

log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout

log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 應用于socket

log4j.appender.socket=org.apache.log4j.RollingFileAppender

log4j.appender.socket.RemoteHost=localhost

log4j.appender.socket.Port=5001

log4j.appender.socket.LocationInfo=true

# Set up for Log Factor 5

log4j.appender.socket.layout=org.apache.log4j.PatternLayout

log4j.appender.socket.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# Log Factor 5 Appender

log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender

log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000

# 發送日志到指定郵件

log4j.appender.mail=org.apache.log4j.net.SMTPAppender

log4j.appender.mail.Threshold=FATAL

log4j.appender.mail.BufferSize=10

log4j.appender.mail.From = [email protected]

log4j.appender.mail.SMTPHost=mail.com

log4j.appender.mail.Subject=Log4J Message

log4j.appender.mail.To= [email protected]

log4j.appender.mail.layout=org.apache.log4j.PatternLayout

log4j.appender.mail.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 應用于資料庫

log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender

log4j.appender.database.URL=jdbc:mysql://localhost:3306/test

log4j.appender.database.driver=com.mysql.jdbc.Driver

log4j.appender.database.user=root

log4j.appender.database.password=

log4j.appender.database.sql=INSERT INTO LOG4J (Message) VALUES('=[%-5p] %d(%r) --> [%t] %l: %m %x %n')

log4j.appender.database.layout=org.apache.log4j.PatternLayout

log4j.appender.database.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 自定義Appender

log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender

log4j.appender.im.host = mail.cybercorlin.net

log4j.appender.im.username = username

log4j.appender.im.password = password

log4j.appender.im.recipient = [email protected]

log4j.appender.im.layout=org.apache.log4j.PatternLayout

log4j.appender.im.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

3.配置log4j為日志的實作

    <settings>

        <!--标準的日志工廠的實作-->

        <setting name="logImpl" value="LOG4J"/>

    </settings>

        <mapper class=""/>

  1. 簡單使用
  2. 在要使用log4j的類中導入包
  3. 日志對象為目前類的Class

static Logger logger = Logger.getLogger(Test.class);

  1. log4jTest

import org.apache.log4j.Logger;

public class Test {

    //

    static Logger logger = Logger.getLogger(Test.class);

    @org.junit.Test

    public void TestLog4j(){

        logger.info("info:進入了log4j");

        logger.debug("debug:進入了log4j");

        logger.error("error:進入了log4j");