一、Mybatis入门

目录

一、mybatis框架介绍

1.1 什么是框架?

1.2 mybatis的介绍

        MyBatis 是一款优秀的持久层Dao框架,它支持定制化 SQL、存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Java实体类)映射成数据库中的记录.

1.3 为什么要使用mybatis

(1)引入mybatis和mysql的jar

 三、初学者可能遇到的典型错误

 四、lombok插件

五、使用mybatis完成crud(增删改查)

六、mybatis优化

 6.2 添加sql日志

七、添加模板(非常方便)


一、mybatis框架介绍

1.1 什么是框架?

框架就是别人搭建好的某些功能,你只需要引用该框架并加入自己的业务代码。就好比盖房子,有了别人搭建好的结构,一个月就能盖好几层。

使用框架的好处:可以提高我们的开发效率。

1.2 mybatis的介绍

        MyBatis 是一款优秀的持久层Dao框架,它支持定制化 SQL、存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML注解来配置和映射原生信息,将接口和 Java 的 POJOs(Java实体类)映射成数据库中的记录.

1.3 为什么要使用mybatis

        可以简化jdbc的操作以及占位符赋值以及查询结果集的封装
二、如何使用mybatis

(1)引入mybatis和mysql的jar

在我们的maven的java工程中的pom.xml文件中,引入我们的jar(不会的可以参考我的文章----maven的使用)。效果如下:

 注意:引入完jar以后,千万不要忘记了刷新maven (刷新方法也在那一章博客里)

(2) 创建mybatis的配置文件(可以直接复制)

        在resources下新建一个mybatis的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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="#{driver}"/>
                <property name="url" value="#{url}"/>
                <property name="username" value="#{root}"/>
                <property name="password" value="#{password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--注册mapper配置文件(mapper文件路径配置)
          url:网络上的映射文件
          注意:映射配置文件位置要和映射器位置一样,如:映射器在com.mycode.dao里,
                那么配置文件就应该在resources的com/mycode/dao目录下,否则会报
                Could not find resource com.mycode.dao.UserMapper.xml类似错误
      -->
    <mappers>
        <!--下面编写mapper映射文件↓↓↓↓↓ 参考格式:<mapper resource="dao/UserMapper.xml"/> -->
        <mapper resource=""></mapper>
    </mappers>
</configuration>

        注意修改这些地方(非常重要):映射文件不懂得可以等到第五步会讲到

 最终完整的例子:

(3) 创建数据库和表

        在Navicat中新建一个数据库和表,例如我上面的url中写的库名是mybatis,如果你想用你已经有的库和表的话就忽略此步。(Mysql相关的知识可以详见我的博客----Mysql基础部分)

(4) 创建实体类

        JDBC中的知识点。需要我们在entity包下新建一个实体类,这个实体类的类名就是你想用的数据库中的表名。里面的私有属性为你的列名。并且写上get和set方法以及同String方法

public class User {
    private int userid;
    private String username;
    private String realname;
 
    public User() {
    }
 
    public User(String username, String realname) {
        this.username = username;
        this.realname = realname;
    }
 
    public User(int userid, String username, String realname) {
        this.userid = userid;
        this.username = username;
        this.realname = realname;
    }
 
    @Override
    public String toString() {
        return "User{" +
                "userid=" + userid +
                ", username='" + username + '\'' +
                ", realname='" + realname + '\'' +
                '}';
    }
 
    public int getUserid() {
        return userid;
    }
 
    public void setUserid(int userid) {
        this.userid = userid;
    }
 
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        this.username = username;
    }
 
    public String getRealname() {
        return realname;
    }
 
    public void setRealname(String realname) {
        this.realname = realname;
    }
}

(5) 创建mybatis和数据库的映射文件(同样可以直接复制)

在resources下建立mapper文件夹,并在文件夹中建立文件:XxxMapper.xml(Xxx为你的实体名)

  在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为映射的根节点,用来管理DAO接口
    namespace指定DAO接口的完整类名,表示mapper配置文件管理哪个DAO接口(包.接口名)
    mybatis会依据这个接口动态创建一个实现类去实现这个接口,而这个实现类是一个Mapper对象
 -->
<mapper namespace="包名.类名">
    <!--
        id = "接口中的方法名"
        #{} :表示占位符,等价于 ? 这是mybatis框架的语法 
        parameterType = "接口中传入方法的参数类型"
        resultType = "返回实体类对象:包.类名"  处理结果集 自动封装
        注意:sql语句后不要出现";"号
    -->
    <!-- 查询  根据id查询用户信息
            select标签用于查询的标签
                id:标签的唯一标识
                resultType:定义返回的类型 把sql查询的结果封装到哪个实体类中
           #{} :表示占位符,等价于 ? 这是mybatis框架的语法    
     -->
</mapper>

   注意修改这些地方(非常重要)

 <mapper>标签下的sql写法:

<mapper namespace="lrs.user">
    <!--
        id = "接口中的方法名"
        #{} :表示占位符,等价于 ? 这是mybatis框架的语法 
        parameterType = "接口中传入方法的参数类型"
        resultType = "返回实体类对象:包.类名"  处理结果集 自动封装
        注意:sql语句后不要出现";"号
    -->
    <!-- 查询  根据id查询用户信息
            select标签用于查询的标签
                id:标签的唯一标识
                resultType:定义返回的类型 把sql查询的结果封装到哪个实体类中
           #{} :表示占位符,等价于 ? 这是mybatis框架的语法    
     -->
    <!-- 例子 -->
    <select id="selectOne" resultType="User">
        select * from tb_user where userid= #{userid}
    </select>
</mapper>

(6) 测试mybatis

        可以在这里建一个测试类,名字不要与”Test“重复(避免与junit冲突)。所以我们在测试之前可以在pom.xml文件中引入junit的jar,刷新以后再写测试。

测试代码如下所示:

package com.test;
 
import com.lrs.entity.User;
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 org.junit.Test;
import org.omg.CORBA.PUBLIC_MEMBER;
 
import java.io.IOException;
import java.io.Reader;
import java.util.List;
 
/**
 * @作者:刘壬杉
 * @创建时间 2022/5/31
 **/
public class Test01 {
    @Test  //测试根据id查询
    public void testSelectOne() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        Object o = session.selectOne("lrs.user.findById", 1);
        System.out.println(o);
        session.close();
    }
   
}

 三、初学者可能遇到的典型错误

(1)命名空间(namespa)使用了关键字

 (2)如下图所示:

可能产生此bug的原因:1)selectOne方法时statement+id, 写错了    2)你没有把映射文件注册到配置文件上

(3)xml文件不正确

根据提示查看自己的.xml文件是否书写错误并改正错误

4) 属性名正确

 四、lombok插件

 它可以帮你生成实体类的get和set方法 而且可以帮你生成构造方法。重写toString方法

插件引入步骤:

  • idea安装lombok插件。(只需安装一次,如果已经安装直接跳到下一步)
  • 在pom.xml中引入lombok的依赖
  • 在实体类上添加lombok注解。

        现在我们就可以很简介的书写我们的实体类了,只需要加入注解即可完成set,get,有参构造,无参构造和toString方法。

@Data  //set和get方法以及toString方法
@NoArgsConstructor //无参构造
@AllArgsConstructor //全部参数构造函数
public class User {
    private int userid;
    private String username;
    private String realname;
 
}

五、使用mybatis完成crud(增删改查)

在UserMapper中写入sql的代码:

<mapper namespace="lrs.user">
    <!--
        id = "接口中的方法名"
        parameterType = "接口中传入方法的参数类型"
        resultType = "返回实体类对象:包.类名"  处理结果集 自动封装
        注意:sql语句后不要出现";"号
            查询:select标签
            增加:insert标签
            修改:update标签
            删除:delete标签
    -->
    <!-- 查询  根据id查询用户信息
            select标签用于查询的标签
                id:标签的唯一标识
                resultType:定义返回的类型 把sql查询的结果封装到哪个实体类中
           #{} :表示占位符,等价于 ? 这是mybatis框架的语法
     -->
    <!-- 添加
            parameterType:参数类型
                #{必须和属性对应}
     -->
    <!-- 删除 -->
    <!-- 查询所有 -->
    <select id="findById" resultType="User" >
        select * from tb_user where userid = #{id}
    </select>
    <select id="selectAll" resultType="User">
        select * from tb_user
    </select>
    <insert id="add" parameterType="User">
        insert into tb_user values(null,#{username},#{realname})
    </insert>
    <delete id="delete" parameterType="int">
        delete from tb_user where userid = #{userid}
    </delete>
    <update id="update" parameterType="User">
        update tb_user set username=#{username},realname=#{realname} where userid=#{userid}
    </update>
</mapper>

     测试部分的代码:

package com.test;
 
import com.lrs.entity.User;
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 org.junit.Test;
import org.omg.CORBA.PUBLIC_MEMBER;
 
import java.io.IOException;
import java.io.Reader;
import java.util.List;
 
/**
 * @作者:刘壬杉
 * @创建时间 2022/5/31
 **/
public class Test01 {
    @Test
    public void testSelectOne() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        Object o = session.selectOne("lrs.user.findById", 1);
        System.out.println(o);
        session.close();
    }
    @Test
    public void testSelectAll() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        List<User> list = session.selectList("lrs.user.selectAll");
        System.out.println(list);
        session.close();
    }
    @Test
    public void testAdd() throws IOException {
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        User user = new User();
        user.setUsername("lm");
        user.setRealname("黎明");
        int insert = session.insert("lrs.user.add", user);
        System.out.println(insert);
        session.commit(); //必须提交
        session.close();
    }
    @Test
    public void testDelete() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        int delete = session.delete("lrs.user.delete", 8);
        System.out.println(delete);
        session.commit();
        session.close();
    }
    @Test
    public void testUpdate() throws Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        User user = new User(9,"wjk","王俊凯");
        int update = session.update("lrs.user.update", user);
        System.out.println(update);
        session.commit();
        session.close();
    }
}

 注意: 当我们对数据库里的表做删除修改添加的时候,也就是需要改变表里的数据的时候,一定不要忘记了加上提交(session.commit();),不然数据库里的内容不会发生改变。像查询方法就不需要写这一行代码,因为查询的时候没有改动表内容

六、mybatis优化

在mybatis.xml文件中配置文件:

<typeAliases>
        <!--单独为某个实体类起别名 -->
         <typeAlias type="com.ykq.entity.User" alias="u"/>
        <!--为指定包下的实体类起别名该别名就是实体类名-->
         <package name="com.ykq.entity"/>
    </typeAliases>

 6.2 添加sql日志

未来在你的项目上线以后,需要sql日志来帮助我们维护我们的项目,他可以方便我们查询sql语句以及占位符处传入的参数是否正确,是我们修改bug的好帮手!

        步骤:

  • 在po.xml中添加日志的jar.
  •  		<!--log4j-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>

    添加日志的文件配置------  log4j.properties   必须以这样命名!不能随便乱起名。在文件中复制下面的代码

  • 简洁版:

log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

     详细版:

#将等级为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=D:/qy151/log/qy151.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后,我们知道,在mybatis.xml和XxxMapper.xml文件中,有很多我们需要复制的代码,那么我们可以将这些代码作为一个模板,以后再new这些文件的时候可以直接new你的模板,然后再修改相关内容,可以大大节省我们的时间!

 

最后点击OK或者Apply即可。以后在new的时候直接选择模板

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值