1. 程式人生 > 其它 >Mybatis-02(log4j,註解實現增刪改查, #{}和${}的區別是什麼?,lombok)

Mybatis-02(log4j,註解實現增刪改查, #{}和${}的區別是什麼?,lombok)

Log4j

①先導包

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

②配置log4j.properites

#將等級為DEBUG的日誌資訊輸出到console和file這兩個目的地,console和file的定義在下面的程式碼
log4j.rootLogger=DEBUG,console,file

#控制檯輸出的相關設定
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n

#檔案輸出的相關設定
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n

#日誌輸出級別
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

③mybatis-config中新增setting

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

 註解實現增刪改查:

①編寫mybatis-config

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd"
> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <
property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="admin"/> </dataSource> </environment> </environments> <mappers> <mapper class="dao.UserMapper"/> </mappers> </configuration>

②編寫工具類MybatisUtils

package utils;

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.IOException;
import java.io.InputStream;

//SqlSessionFacory
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static{
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSqlSession(){
        return  sqlSessionFactory.openSession(true);//這裡有一個引數true,表示自動提交事務
    }


}

③編寫實體類User

package pojo;

public class User {
    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    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 getPassword() {
        return pwd;
    }

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

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

④編寫介面UserMapper

package dao;

import org.apache.ibatis.annotations.Select;
import pojo.User;

import java.util.List;
import java.util.Map;

public interface UserMapper {
    @Select("select * from user")
    List<User> getUserList();
    @Select("select * from user where id=#{id}")
    User getUserById(int id);
  @Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")
  int addUser(User user);
  @Delete("delete from user where id = #{id}")
  int deleteUser(User user);
  @Update("update user set name=#{name},pwd=#{pwd} where id=#{id}")
  int updateUser(User user);
}

註解實現只需將方法上添加註解,如上程式碼,然後需要在Mybatis-congfig中新增mapper對映(已在①中程式碼新增 )

如果引數有很多個,可以用以下程式碼:

    @Select("select * from user where id=#{id}")
    User getUserById(@Param("id")int id);

在引數前面加上@Param

⑤編寫測試程式碼

import dao.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.User;
import utils.MybatisUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MyTest {
    @Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();
        for (User user:
             userList) {
            System.out.println(user.toString());

        }
        User user=mapper.getUserById(1);
        System.out.println(user.toString());
    }
}

一個面試題:

#{}和${}的區別是什麼?

a、#{}是預編譯處理,${}是字串替換。

b、Mybatis 在處理#{}時,會將 sql 中的#{}替換為?號,呼叫 PreparedStatement 的 set 方法來賦值;
c、Mybatis 在處理${}時,就是把${}替換成變數的值。
d、使用#{}可以有效的防止 SQL 注入,提高系統安全性。

#將傳入的資料都當成一個字串,會對自動傳入的資料加一個雙引號。如:order by #{user_id},如果傳入的值是111,那麼解析成sql時的值為order by “111”, 如果傳入的值是id,則解析成的sql為order by “id”. 

Lombok的使用:

①下載外掛

②匯入jar包

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>

③在實體類上添加註解:

@Data
@AllArgsConstructor
@NoArgsConstructor

@Data:無參構造,get、set、tostring、hashcode,equals

@AllArgsConstructor有參構造

@NoArgsConstructor無參構造

------------恢復內容結束------------