2021-10-28

Mybatis

简介

**MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。**MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
官方教程 https://mybatis.org/mybatis-3/zh/getting-started.html

1.持久层

  • 完成持久化工作的代码

  • 数据持久化:将数据在持久状态与瞬时状态转化的过程。

  • 使用MyBatis原因:简化JDBC代码,解除sql与程序代码的耦合提高可维护性,支持动态sql.

2.使用

2.1 配置文件

configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)

<!--核心配置文件-->
<configuration>
    <environments default="development">
        <!--可以创建多个数据库环境 用environment进行包裹 进行默认选择 此处默认选择development环境-->
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--mysql驱动-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!--url连接数据库 通过右侧的database选项进行数据库连接-->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

2.2 写工具类MybatisUtilis

重点
从XML中构建SqlSessionFactory获取 SqlSession

package org.example;
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;
public class MybatisUtilis {
    // 使用mybatis 第一步 :获取 sqlSessionFactory对象

    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(){
        //SQL session 完全包含了面向对象数据库执行的sql命令的所有方法
        return sqlSessionFactory.openSession();


    }
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/b6a56fe2d8af49979ac6422c8c842a92.png)



## 2.2 从XML中构建SqlSessionFactory获取 SqlSession

 - 从建造者模式的builder创建出factory获取sqlsessionfactory对象

## 2.3 执行流程解析

```java
<?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="com.xyzhang.dao.UserDao">
    <!--select查询语句-->
    <select id="getUserList" resultType="com.xyzhang.pojo.User">
        select * from mybatis.user
    </select>
</mapper>

在这里插入图片描述

  • MyBatis 提供的全部特性都可以利用基于 XML 的映射语言来实现,下文的例子可满足以上对SqlSession的调用
  • 在命名空间“com.xyzhang.dao.UserDao”中定义了一个名为“getUserList”的映射语句,这种命名允许使用指定的完全限定名“com.xyzhang.dao.UserDao.getUserList”来调用映射语句。

ListuserList=sqlSession.selectList(“com.xyzhang.dao.UserDao.getUserList”);

 该命名也可以直接映射到在命名空间中同名的 Mapper 类,并将已映射的 select 语句中的名字、参数和返回类型匹配成方法。

UserDao mapper = sqlSession.getMapper(UserDao.class); List userList = mapper.getUserList();

在这里插入图片描述

2.5 日后使用方式

只修改接口(UserMapper.java)和配置文件(resource文件下的UserMapper.xml)即可

2.51.简化开发,直接在接口上实现添加注解;

//查询全部用户
@Select("select id,name,pwd password from user")
public List<User> getAllUser();
  • 在核心配置文件上使用class绑定接口(不是配置文件),但可以与配置文件同时使用。
<!--使用class绑定接口-->
<mappers>
    <mapper class="com.kuang.mapper.UserMapper"/>
</mappers>

3.1 namespace

3.2 select:选择,查询语句

@Select("select * from user")
List<User> getUsers();
  • id:对应namespace中的方法名;
  • resultType:Sql语句执行的返回值;
  • parameterType:参数类型
  • 📌增删改需要提交事务sqlSession。commit();**也可在getSqlsession()时设置为自动提交事务(设置参数为true即可 看**源码!!!
@Test
public void addUser() {
    //通过实体类获取sqlSession实例
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    //获取映射实例
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    mapper.addUser(new User(4,"Num4","147852"));
    //提交事务才能添加成功!!!
    sqlSession.commit();
    sqlSession.close();
}

3.3 Insert

 <insert id="addUser" parameterType="com.daomain.User">
        insert into user (id,username,birthday,sex,address)values(#{id},#{username},#{birthday},#{sex},#{address});

3.4 update

<!--    更新-->
    <update id="updateUser" parameterType="pojo.User">
        update user set name=#{name},password=#{password} = where id=#{id};

    </update>

3.5 delete

<!--删除-->
    <delete id="deleteUser" parameterType="int">
        delete from user where id=#{id};

    </delete>

3.6操作的通用顺序:

1.编写接口

  1. 编写对应mapper的sql语句
  2. 测试

4.XML映射文件及注解

4.1注解:

作用:引用配置文件
db.properties文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybt?serverTimezone=GMT%2B8&amp;useUnicode=true&characterEncoding=utf8&amp;useSSL=false
username=root
password=123456
<?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">
<!--mybatis的主配置文件-->
<configuration>

    <properties resource="db.properties">
        <!--可以在引入外部文件的基础上添加属性配置-->
        <!--但当字段重复时,优先使用外部配置文件-->
        <property name="username" value="dev_user"/>
        <property name="password" value="123456"/>
    </properties>


    <!--配置环境-->
    <environments default="development">
        <!--配置mysql的环境-->
        <environment id="development">
            <!--配置事务的类型-->
            <transactionManager type="JDBC"/>
            <!--配置数据源(连接池)-->

            <dataSource type="POOLED">
                <!--配置连接数据库的4个基本信息-->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。
编写外部配置文件:

<properties resource="org/mybatis/example/config.properties">
  <!--可以在引入外部文件的基础上添加属性配置-->
  <!--但当字段重复时,优先使用外部配置文件-->
  <property name="username" value="dev_user"/>
  <property name="password" value="123456"/>
</properties>

4.2日志的具体实现

1.指定 MyBatis 所用日志的具体实现-

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

种类:
SLF4J | LOG4J【掌握】 | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING 【掌握】| NO_LOGGING

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

在Mybatis中实现哪个日志,需要在设置中指定 STDOUT_LOGGING

在这里插入图片描述

5.log4j

先导入包

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>
log4j.rootLogger=INFO,consoleAppender,logfile,MAIL
log4j.addivity.org.apache=true
#ConsoleAppender,控制台输出
#FileAppender,文件日志输出
#SMTPAppender,发邮件输出日志
#SocketAppenderSocket 日志
#NTEventLogAppenderWindow NT 日志
#SyslogAppender,
#JMSAppender,
#AsyncAppender,
#NullAppender
#文件输出:RollingFileAppender
#log4j.rootLogger = INFO,logfile
log4j.appender.logfile = org.apache.log4j.RollingFileAppender
log4j.appender.logfile.Threshold = INFO
# 输出以上的 INFO 信息
log4j.appender.logfile.File = INFO_log.html
#保存 log 文件路径
Log4j 从入门到详解
10
log4j.appender.logfile.Append = true
# 默认为 true,添加到末尾,false 在每次启动时进行覆盖
log4j.appender.logfile.MaxFileSize = 1MB
# 一个 log 文件的大小,超过这个大小就又会生成 1 个日志 # KB ,MB,GB
log4j.appender.logfile.MaxBackupIndex = 3
# 最多保存 3 个文件备份
log4j.appender.logfile.layout = org.apache.log4j.HTMLLayout
# 输出文件的格式
log4j.appender.logfile.layout.LocationInfo = true
#是否显示类名和行数
log4j.appender.logfile.layout.Titletitle:\u63d0\u9192\u60a8\uff1a\u7cfb\u7edf\u53d1\u751f\u4e86\u4e25\u91cd\u9519\u8b
ef
#html 页面的 < title >
############################## SampleLayout ####################################
# log4j.appender.logfile.layout = org.apache.log4j.SampleLayout
############################## PatternLayout ###################################
# log4j.appender.logfile.layout = org.apache.log4j.PatternLayout
# log4j.appender.logfile.layout.ConversionPattern =% d % p [ % c] - % m % n % d
############################## XMLLayout #######################################
# log4j.appender.logfile.layout = org.apache.log4j.XMLLayout
# log4j.appender.logfile.layout.LocationInfo = true #是否显示类名和行数
############################## TTCCLayout ######################################
# log4j.appender.logfile.layout = org.apache.log4j.TTCCLayout
# log4j.appender.logfile.layout.DateFormat = ISO8601
#NULL, RELATIVE, ABSOLUTE, DATE or ISO8601.
# log4j.appender.logfile.layout.TimeZoneID = GMT - 8 : 00
# log4j.appender.logfile.layout.CategoryPrefixing = false ##默认为 true 打印类别名
# log4j.appender.logfile.layout.ContextPrinting = false ##默认为 true 打印上下文信息
# log4j.appender.logfile.layout.ThreadPrinting = false ##默认为 true 打印线程名
# 打印信息如下:
#2007 - 09 - 13 14 : 45 : 39 , 765 [http - 8080 - 1 ] ERROR com.poxool.test.test -
###############################################################################
#每天文件的输出:DailyRollingFileAppender
#log4j.rootLogger = INFO,errorlogfile
log4j.appender.errorlogfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorlogfile.Threshold = ERROR
log4j.appender.errorlogfile.File = ../logs/ERROR_log
log4j.appender.errorlogfile.Append = true
#默认为 true,添加到末尾,false 在每次启动时进行覆盖
log4j.appender.errorlogfile.ImmediateFlush = true
#直接输出,不进行缓存
# ' . ' yyyy - MM: 每个月更新一个 log 日志
# ' . ' yyyy - ww: 每个星期更新一个 log 日志
# ' . ' yyyy - MM - dd: 每天更新一个 log 日志
# ' . ' yyyy - MM - dd - a: 每天的午夜和正午更新一个 log 日志
# ' . ' yyyy - MM - dd - HH: 每小时更新一个 log 日志
# ' . ' yyyy - MM - dd - HH - mm: 每分钟更新一个 log 日志
# 从入门到详解
log4j.appender.errorlogfile.DatePattern = ' . ' yyyy - MM - dd ' .log '
#文件名称的格式
log4j.appender.errorlogfile.layout = org.apache.log4j.PatternLayout
log4j.appender.errorlogfile.layout.ConversionPattern =%d %p [ %c] - %m %n %d
#控制台输出:
#log4j.rootLogger = INFO,consoleAppender
log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.Threshold = ERROR
log4j.appender.consoleAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern =%d %-5p %m %n
log4j.appender.consoleAppender.ImmediateFlush = true
# 直接输出,不进行缓存
log4j.appender.consoleAppender.Target = System.err
# 默认是 System.out 方式输出
#发送邮件:SMTPAppender
#log4j.rootLogger = INFO,MAIL
log4j.appender.MAIL = org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold = INFO
log4j.appender.MAIL.BufferSize = 10
log4j.appender.MAIL.From = yourmail@gmail.com
log4j.appender.MAIL.SMTPHost = smtp.gmail.com
log4j.appender.MAIL.Subject = Log4J Message
log4j.appender.MAIL.To = yourmail@gmail.com
log4j.appender.MAIL.layout = org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern =%d - %c -%-4r [%t] %-5p %c %x - %m %n
#数据库:JDBCAppender
log4j.appender.DATABASE = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL = jdbc:oracle:thin:@ 210.51 . 173.94 : 1521 :YDB
log4j.appender.DATABASE.driver = oracle.jdbc.driver.OracleDriver
log4j.appender.DATABASE.user = ydbuser
log4j.appender.DATABASE.password = ydbuser
log4j.appender.DATABASE.sql = INSERT INTO A1 (TITLE3) VALUES ( ' %d - %c %-5p %c %x - %m%n
' )
log4j.appender.DATABASE.layout = org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern =% d - % c -%- 4r [ % t] %- 5p % c %
x - % m % n
#数据库的链接会有问题,可以重写 org.apache.log4j.jdbc.JDBCAppendergetConnection() 使用数
据库链接池去得链接,可以避免 insert 一条就链接一次数据库

在Mybatis中的配置文件进行引用:

6.map传递参数

//使用map进行数据插入
int addUser2(Map<String,Object> map);
<insert id="addUser2" parameterType="map">
    insert into mybatis.user(id, name, pwd) values (#{id},#{name},#{pwd});
</insert>
//测试使用map增加对象
@Test
public void addUser2() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    Map<String,Object> map = new HashMap<String, Object>();
    map.put("id",6);
    map.put("name","hello");
    map.put("pwd","159357");

    mapper.addUser2(map);
    sqlSession.commit();
    sqlSession.close();
}

7.模糊查询

需要注意对查询字符串进行转义:

  1. 在sql语句中进行转义(可能会出现sql注入等情况)
select * from mybatis. user where name like "%" #{value } "%";

在传入字符串时进行转义

mapper.getUserLike("%张%");

8.分页需求

  • 客户端通过传递start(页码)pageSize(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的用法和我们的需求不一样,所以就需要我们根据实际情况去改写适合我们自己的分页语句,具体的分析如下:
  • 比如:
  • 查询第1条到第10条的数据的sql是:select * from table limit 0,10;
    ->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;
  • 查询第11条到第20条的数据的sql是:select * from table limit 10,10;
    ->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10;
  • 查询第21条到第30条的数据的sql是:select * from table limit 20,10;
    ->对应我们的需求就是查询第三页的数据:select * from table limit (3-1)*10,10;
    通过上面的分析,可以得出符合我们需求的分页sql格式是:select * from table limit (start-1)*pageSize,pageSize; 其中start是页码,pageSize是每页显示的条数。
    1.接口
//分页查询
    List<User> getUserByLimit(Map<String, Object> value); //接口
}

2.mapper.xml

<!--分页查询-->
<select id="getUserByLimit" resultType="pojo.User">
    select  *from user limit #{startIndex},#{pageSize};
</select>

3.测试

@Test
public void getUserByLimit(){
    SqlSession sqlSession= MybatisUtilis.getSqlSession();
    UserDao userDao =  sqlSession.getMapper(UserDao.class);
    Map<String,Object> map=new HashMap<String,Object>();
    map.put("startIndex",1);
    map.put("pageSize",2);
    List<User> userList=userDao.getUserByLimit(map);
    System.out.println(userList);
    //关闭sqlsession
    sqlSession.close();

}

9.动态sql

使用Mybatis注解实现sql语句,但是有些时候有些字段是空的,这时候这个空的字段就要从条件查询语句中删除,这个时候就需要用到动态Sql。

  • 注解的动态语句支持以下

  • trim

  • where

  • set

  • foreach

  • if

  • choose

  • when

  • otherwise

  • bind

public interface EmployeeMapper {
    //查询符合条件的总行数
    @Select("<script>" +
            "select count(0) from employee" +
            "<where>" +
                "<if test='name != null'>" +
                    "and name like concat('%', #{name}, '%')"+
                "</if>"+
                "<if test='minAge != null'>" +
                    "and age >= #{minAge}"+
                "</if>"+
                "<if test='maxAge != null'>" +
                    "and age <= #{maxAge}"+
                "</if>"+
            "</where>" +
            "</script>")
    Integer selectForCount(EmployeeQueryObject qo);
    
    //查询符合条件的对象
    @Select("<script>" +
            "select id, name, age from employee" +
            "<where>" +
                "<if test='name != null'>" +
                    "and name like concat('%', #{name}, '%')"+
                "</if>"+
                "<if test='minAge != null'>" +
                    "and age >= #{minAge}"+
                "</if>"+
                "<if test='maxAge != null'>" +
                    "and age <= #{maxAge}"+
                "</if>"+
            "</where>" +
            "limit #{start}, #{pageSize}" +
            "</script>")
    List<?> selectForList(EmployeeQueryObject qo);
}

10.CRUD

自动提交sql语句事件------工具类

public static SqlSession getSqlSession(){
    //SQL session 完全包含了面向对象数据库执行的sql命令的所有方法
    return sqlSessionFactory.openSession(true);


}

11.sql语句

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

@Insert("insert into user(id,name,pwd) valus(#{id},#{name},#{password})")
    int addUser(User acd);
@Update("update user set name=#{name},pwd=#{password},where id=#{id}")
    int updateUser(User user);

@Delete("delete from user where id=#{id}")
int deleteUser(@Param("id") int id);
public class MybatisTest {
@Test
   public void test(){
    SqlSession sqlSession =MybatisUtilis.getSqlSession();
  IUserDao iUserDao  =sqlSession.getMapper(IUserDao.class);
//    List<User> users=iUserDao.getUsers();

//    for (User user:users){
//
//        System.out.println(user);
//    }

    //id查询
//    User userById=iUserDao.getUserById(1);
//    System.out.println(userById);
//    sqlSession.close();
//


//    //添加用户
//  iUserDao.addUser(new User(5,"acd","123"));
//
//  //更新用户
//
//iUserDao.updateUser(new User(2,"aaa","2222"));
//删除
    iUserDao.deleteUser(2);
}
}

关于@Param()注解

  • 基本类型的参数或者String类型,需要加上。
    引用类型不需要加上。
  • 如果只有一个基本类型,可以忽略,建议大家加上。
    在sql中引用的就是我们这里的@param(“uid”)中设定的uid属性名。
  • #{}和¥{}一个可以防止预编译,第二个不可以。

12.lombok使用(略)

13.总结:(代码整合)

在这里插入图片描述
1.工具类(重要,可以搬运运用)
–MybatisUtilis类

package org.example;
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;
public class MybatisUtilis {
    // 使用mybatis 第一步 :获取 sqlSessionFactory对象

    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(){
        //SQL session 完全包含了面向对象数据库执行的sql命令的所有方法
        return sqlSessionFactory.openSession();


    }
}

2.实体类(随数据库 自编)
package pojo;—user实体类

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

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


    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 password;
    }

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

    public User() {
    }

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

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }
}

3.获取数据表类–UserDao

package dao;
import pojo.User;
import java.util.List;
import java.util.Map;
//实体类
public interface UserDao {
    //获取数据表的user
    List<User> getUserList();
//根据id查询
    User getUserByIde(int id);
    //添加数据
    int addUser(User user);
    int addUser2(User user);
    //修改用户
    int updateUser(User user);

    int deleteUser(int user);
    List<User> getUserLike(String value); //接口
//分页查询
    List<User> getUserByLimit(Map<String, Object> value); //接口
}

4.utilis

  • db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybt?serverTimezone=GMT%2B8&amp;useUnicode=true&characterEncoding=utf8&amp;useSSL=true
username=root
password=123456
  • log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
  • mybatsis-config.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">
<!--mybatis的主配置文件-->
<configuration>

    <properties resource="db.properties">

        <!--但当字段重复时,优先使用外部配置文件-->
        <property name="username" value="dev_user"/>
        <property name="password" value="123456"/>
    </properties>

<!--指定 MyBatis 所用日志的具体实现-->
<!--    <settings>-->
<!--        <setting name="logImpl" value="LOG4J"/>-->
<!--    </settings>-->

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



    <!--配置环境-->
    <environments default="development">
        <!--配置mysql的环境-->
        <environment id="development">
            <!--配置事务的类型-->
            <transactionManager type="JDBC"/>
            <!--配置数据源(连接池)-->

            <dataSource type="POOLED">
                <!--配置连接数据库的4个基本信息-->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>



</configuration>
  • userMapper类
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-mybatis.org//DTM Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace=  绑定一个对应的Dao /mapper 接口-->
<mapper namespace="dao.UserDao">
    <select id="getUserList" resultType="pojo.User">
        select * from user ;
    </select>
<!--查询-->
    <select id="getUserByIde" parameterType="int" resultType="pojo.User">
  select * from user where id=#{id} ;
    </select>
<!--    添加-->
    <insert id="addUser" parameterType="pojo.User" >
        insert into user(name,password) values(#{name},#{password});
    </insert>
    <!--    添加2-->
    <insert id="addUser2" parameterType="map" >
        insert into user(name,password) values(#{userid},#{password});
    </insert>
<!--    更新-->
    <update id="updateUser" parameterType="pojo.User">
        update user set name=#{name},password=#{password} = where id=#{id};
    </update>
<!--删除-->
    <delete id="deleteUser" parameterType="int">
        delete from user where id=#{id};
    </delete>
    <!--查询-->
    <select id="getUserLike" parameterType="int" resultType="pojo.User">
  select * from user where name like =#{value } ;
    </select>
    <select id="getUserByLimit" resultType="pojo.User">
        select  *from user limit #{startIndex},#{pageSize};
    </select>
</mapper>
  • test测试类 UserDaoTest
 package dao;

import org.apache.ibatis.session.SqlSession;
import org.example.MybatisUtilis;
import org.junit.Test;
import org.omg.CORBA.INTERNAL;
import pojo.User;

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

public class UserDaoTest {
    private Object Integer;

    @Test
    public void test(){
        //获取sqlseesion

        SqlSession sqlSession= MybatisUtilis.getSqlSession();
        UserDao userDao =  sqlSession.getMapper(UserDao.class);
        List<User> userList=userDao.getUserList();

        for (User user: userList){
            System.out.println(user);

        }
//关闭sqlsession
    //    sqlSession.close();



    }
    @Test
    public void getUserById(){
        SqlSession sqlSession= MybatisUtilis.getSqlSession();
        UserDao userDao =  sqlSession.getMapper(UserDao.class);
        System.out.println("bbb");
        User user=userDao.getUserByIde(3);
        System.out.println(user);
        //关闭sqlsession
          sqlSession.close();

    }



    //增删改需要提交
    @Test
    public void addUser(){
        SqlSession sqlSession= MybatisUtilis.getSqlSession();
        UserDao userDao =  sqlSession.getMapper(UserDao.class);
          int res =userDao.addUser(new User("HAHA","123"));
                    if(res>0){
            System.out.println("插入成功");
                    }else {
                        System.out.println("插入失败");

                    }
        //关闭sqlsession
        sqlSession.commit();//提交事件
        sqlSession.close();

    }





    //修改用户
    @Test
    public void updateUser(){
        SqlSession sqlSession= MybatisUtilis.getSqlSession();
        UserDao userDao =  sqlSession.getMapper(UserDao.class);

        userDao.updateUser(new User("hq","123"));
        //关闭sqlsession
        sqlSession.commit();//提交事件
        sqlSession.close();


    }
    //删除一个用户
    @Test
public void deleteUser(){
    SqlSession sqlSession= MybatisUtilis.getSqlSession();
    UserDao userDao =  sqlSession.getMapper(UserDao.class);
    userDao.deleteUser(1);
        System.out.println("删除成功");

sqlSession.commit();
    sqlSession.close();






}



    //增删改需要提交
    @Test
    public void addUser2(){
        SqlSession sqlSession= MybatisUtilis.getSqlSession();
        UserDao userDao =  sqlSession.getMapper(UserDao.class);
        Map<String,Object> map=new HashMap<String,Object>();
        map.put("userid",4);
        map.put("password",22222);


        //关闭sqlsession
        sqlSession.commit();//提交事件
        sqlSession.close();

    }
@Test
    public void getUserLike(){
        SqlSession sqlSession= MybatisUtilis.getSqlSession();
        UserDao userDao =  sqlSession.getMapper(UserDao.class);
        List<User> userList=userDao.getUserLike("%abc");

        for (User user:userList){

            System.out.println(user);
        }
    }
    @Test
    public void getUserByLimit(){
        SqlSession sqlSession= MybatisUtilis.getSqlSession();
        UserDao userDao =  sqlSession.getMapper(UserDao.class);
        Map<String,Object> map=new HashMap<String,Object>();
        map.put("startIndex",1);
        map.put("pageSize",2);
        List<User> userList=userDao.getUserByLimit(map);
        System.out.println(userList);
        //关闭sqlsession
        sqlSession.close();

    }

}
  • pom.xml
 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>01</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>01</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
    </dependency>

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


    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
    </dependency>

  </dependencies>

  <build>
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </resource>
    </resources>

    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值