欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

简单的mybatis+maven实现IDEA控制台增删改查

程序员文章站 2022-07-12 22:38:05
...
  • 简单的mybatis+maven实现IDEA控制台增删改查

  • 什么是mybatis?
  • MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。



  • “MyBatis是半自动化ORM”
  • 这里的“半自动化”,是相对 Hibernate 等提供了全面的数据库封装机制的“全自动化”ORM 实现而言,“全自动”ORM 实现了 POJO 和数据库表之间的映射,以及 SQL 的自动生成和执行。而 MyBatis 的着力点,则在于 POJO 与 SQL 之间的映射关系。也就是说,MyBatis 并不会为程序员在运行期自动生成 SQL 执行。具体的 SQL 需要程序员编写,然后通过映
  • 射配置文件,将 SQL 所需的参数,以及返回的结果字段映射到指定 POJO。使用 ibatis 提供的 ORM 机制,对业务逻辑实现人员而言,面对的是纯粹的 Java 对象,这一层与通过 Hibernate 实现 ORM 而言基本一致,而对于具体的数据操作,Hibernate会自动生成 SQL 语句,而 MyBatis 则要求开发者编写具体的 SQL 语句。相对 Hibernate 等“全自动”ORM 机制而言,ibatis 以 SQL 开发的工作量和数据库移植性上的让步,为系统设计提供了更大的*空间。作为“全自动”ORM 实现的一种有益补充,MyBatis 的出现显得别具意义。
  • ————注:上方理论部分摘抄字【https://www.w3cschool.cn/mybatis/】w3cschool 与书籍 ibatis开发指南 想了解的朋友可以翻阅
  • MyBatis的优势:
  •                 1.消除大量的JDBC冗余代码
  •                 2.低学习线路,学习相对简单
  •                 3.友好的Spring集成支持
  •                 3.友好的第三方缓存类集成支持
  •                 4.良好的性能
  • MyBatis:缺点
  •                                                                1. 数据库移植性不好,不同的数据库需要写不同SQL
  •             2.缓存机制不佳

  • MyBatis:核心概念
  •                             核心对象    核心配置文件  sql映射文件

  • 本人初学者:如某些写的不对请见谅,学习中
  • 让自己一眼看懂记得清,每段代码都分部写的,代码一下打完很容易出错,而且出错后挑错也是一大功
  • 首先我们创建一个数据库名字可以自己改变
  •      CREATE DATABASE `water_margin`
  • 需要创建一个数据表

CREATE TABLE `hero` 
(
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(32) NOT NULL,
  `sex` CHAR(2),
  `designation` VARCHAR(64),
  reaking INT(10),
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
  • 人物信息个方面自己添加
  • 简单的mybatis+maven实现IDEA控制台增删改查

  • 接下来我们要创建一个maven项目了
  • 简单的mybatis+maven实现IDEA控制台增删改查
  • 简单的mybatis+maven实现IDEA控制台增删改查

  • 需要创建这些包和文件
  • 简单的mybatis+maven实现IDEA控制台增删改查

  • 配置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>cn.jdbc</groupId>
        <artifactId>mybatis10</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.10</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.2.8</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.28</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.12</version>
            </dependency>
    
        </dependencies>
        <build>
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                    </includes>
                </resource>
            </resources>
        </build>
    
    </project>
    

  • 创建一个database.properties文件,名字可更改
  • 简单的mybatis+maven实现IDEA控制台增删改查
  • 创建log4j.properties日志文件异常的时候日志会存在log4j日志文件中
  • 简单的mybatis+maven实现IDEA控制台增删改查
  • log4j.rootLogger=DEBUG,CONSOLE,file
    log4j.logger.cn.smbms.dao=debug
    log4j.logger.com.ibatis=debug
    log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
    log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
    log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
    log4j.logger.java.sql.Connection=debug
    log4j.logger.java.sql.Statement=debug
    log4j.logger.java.sql.PreparedStatement=debug
    log4j.logger.java.sql.ResultSet=debug
    log4j.logger.org.tuckey.web.filters.urlrewrite.UrlRewriteFilter=debug
    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
    log4j.appender.Threshold=error
    log4j.appender.CONSOLE.Target=System.out
    log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
    log4j.appender.CONSOLE.layout.ConversionPattern= [%p] %d %c - %m%n
    log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.file.DatePattern=yyyy-MM-dd
    log4j.appender.file.File=log.log
    log4j.appender.file.Append=true
    log4j.appender.file.Threshold=error
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
    log4j.logger.com.opensymphony.xwork2=error
    
  • 这个日志在网上很好找↑↑

  • 创建Name.java实体类

package cn.jdbc.entity;

public class Name {
    private Integer id;//id
    private Integer reaking;//排名
    private String  name;//姓名
    private String sex;//性别
    private String desigNation;//称号

    @Override
    public String toString() {
        return "Name{" +
                "id=" + id +
                ", reaking=" + reaking +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", desigNation='" + desigNation + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

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

    public Integer getReaking() {
        return reaking;
    }

    public void setReaking(Integer reaking) {
        this.reaking = reaking;
    }




    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getDesigNation() {
        return desigNation;
    }

    public void setDesigNation(String desigNation) {
        this.desigNation = desigNation;
    }
}

                           配置TuserMapper.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="cn.jdbc.dao.TuserMapper">
    <resultMap id="userMap" type="cn.jdbc.entity.Name">
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        <result property="reaking" column="reaking"></result>
        <result property="desigNation"  column="designation"></result>


    </resultMap>
     <!--显示总人数-->
    <select id="queryCount" resultType="int">
        SELECT COUNT(*) from `hero`
    </select>
</mapper>

                      配置 mybatis-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">
<configuration>

    <properties resource="database.properties"></properties>
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>

    <typeAliases>
        <package name="cn.jdbc.entity.Name"></package>
    </typeAliases>

   <environments default="dvr">

       <environment id="dvr">
           <!--transationManater是事务管理器  选择jdbc获取事务-->
           <transactionManager type="JDBC"></transactionManager>
           <!--数据源有POOLED 和UNPOLED也可自定义数据源-->
           <dataSource type="POOLED">

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

               <property name="url" value="${jdbc.url}"></property>
               <property name="username" value="${jdbc.username}"></property>
               <property name="password" value="${jdbc.password}"></property>
           </dataSource>
       </environment>
   </environments>
    <mappers>
        <!--mappers是映射器,把mapper文件加入到配置文件中-->
        <mapper resource="cn/jdbc/dao/TuserMapper.xml"></mapper>
    </mappers>
</configuration>

                  创建测试类,用老方法掉用看效果TuserTest.java

这种方法代码没有经过优化,看起来比较杂乱,为了让像我一样的初学者能看懂,我后边会慢慢贴出优化后的代码
public class TuserTest {
    @Test
    //查询用户总数
    //第一种老方法输出,未优化前
    public void queryCountTest() {
        SqlSession sqlSession = null;

        try {
            //获取mybatis-config.xml的输入流
            InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
            //创建SqlSessionFactoryBuilder工厂
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            //sqlSessionFactory读取配置文件
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
            //开启sqlSession,执行mapper中的操作
            sqlSession = sqlSessionFactory.openSession();
            //把mapper文件引入到mybatis-config.xml中
            int n = sqlSession.selectOne("cn.jdbc.dao.TuserMapper.queryCount");
            System.out.println(n);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            sqlSession.close();
        }
    }
}

       

         优化代码创建MybatisUtil.java类,把上边重复的代码放进去

package cn.jdbc.util;

import jdk.internal.util.xml.impl.Input;
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 MybatisUtil {
    private  static SqlSessionFactory sqlSessionFactory;


    static {
        try {
            //公用的代码
            InputStream inputStream=Resources.getResourceAsStream("mybatis-config.xml");
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //开启sqlSession,执行mapper中的操作
    public static SqlSession createSqlSession(){
        
        return sqlSessionFactory.openSession();
    }
    //关闭资源
    public static void closeSqlSession(SqlSession sqlSession){
        if(sqlSession!=null){
            sqlSession.close();
        }
    }
}

                         创建接口TuserMapper

注:TuserMapper接口必须和TuserMapper.xml文件名一样

package cn.jdbc.dao;

import cn.jdbc.entity.Name;

import java.util.List;

public interface TuserMapper {
    //查询全部用户信息
    List<Name> queryAll();

    //模糊查询,查询通过用户名查询用户信息
    List<Name> getUserListByUserName(String name);
    //模糊查询,多参数查询用实体类进行入参
    List<Name> getUserListByUserNameAndNickName(Name name);
    //修改数据
    public Integer updateTuser(Name name);
    //删除用户数据
    Integer deleteTuserByid(Integer id);

    //插入数据
    Integer addTuser(Name name);
}

                  在TuserMapper.xml写一个查询sql语句

注:写在mapper标签内
 <!--显示全部人员信息-->
    <select id="queryAll" resultMap="userMap">
           SELECT * FROM `hero`
    </select>
测试的两种方法1.直接类里调用 2.直接调用接口中的方法     测试类
 @Test
        //获取全部用户信息
        //简化版
        public void queryALLTest(){
            SqlSession sqlSession=null;


                sqlSession=MybatisUtil.createSqlSession();
                //第一种方法  通过路径获取信息
              //  List<Tuser> n=sqlSession.selectList("cn.jdbc.dao.TuserTest.queryAll");
                //第二种方法  通过接口返回信息引入映射文件中
                List<Name> n=sqlSession.getMapper(TuserMapper.class).queryAll();
                if(n!=null){
                    for (Name tuser : n) {
                        System.out.println(tuser);
                    }
                }
    }

                                               添加

<!--插入一条数据-->
    <insert id="addTuser" parameterType="cn.jdbc.entity.Name" useGeneratedKeys="true" keyProperty="id">
        insert into hero (name, reaking, designation)
        values (#{name}, #{reaking}, #{desigNation})
</insert>

                                        测试

 @Test
    //添加
    public void addTuser(){
        SqlSession sqlSession=null;
        Name name =new Name();
        name.setReaking(11);
        name.setDesigNation("扑天雕");
        name.setName("李应");

        int rows=0;

        sqlSession = MybatisUtil.createSqlSession();
        rows=sqlSession.getMapper(TuserMapper.class).addTuser(name);
        sqlSession.commit();
        if(rows>0){
            System.out.println("添加成功");
        }else{
            System.out.println("添加失败");
        }
        MybatisUtil.closeSqlSession(sqlSession);
    }

                                           修改

  <!--修改数据-->
    <update id="updateTuser" parameterType="cn.jdbc.entity.Name">
      UPDATE hero SET
       name=#{name},
       designation=#{desigNation},
       reaking=#{reaking}
       WHERE
       id=#{id}
    </update>
                            测试
  //修改
    public void testUpdateTuser(){
        SqlSession sqlSession=null;
        Name name =new Name();
        name.setReaking(10);
        name.setName("柴进");
        name.setDesigNation("排行第十");
        name.setId(10);

        int rows=0;

        sqlSession = MybatisUtil.createSqlSession();
        rows=sqlSession.getMapper(TuserMapper.class).updateTuser(name);
        sqlSession.commit();
        if(rows>0){
            System.out.println("修改成功");
        }else{
            System.out.println("修改失败");
        }
        MybatisUtil.closeSqlSession(sqlSession);
    }

                        删除

 <!--通过id删除用户信息-->
    <delete id="deleteTuserByid" parameterType="Integer">
        delete from hero where id=#{id}
    </delete>
                        测试
 @Test
    //删除
    public void testDeletTuserByid(){
        SqlSession sqlSession=null;
        int delete=0;
        sqlSession = MybatisUtil.createSqlSession();
        delete=sqlSession.getMapper(TuserMapper.class).deleteTuserByid(11);
        sqlSession.commit();
        if(delete>0){
            System.out.println("删除成功");
        }else{
            System.out.println("删除失败");
        }
        MybatisUtil.closeSqlSession(sqlSession);
    }

几种查询方式,列了两种

   <!--根据用户名称查询用户列表 模糊查询(单参数查询)-->
    <select id="getUserListByUserName" parameterType="String" resultMap="userMap">
    SELECT * FROM hero WHERE name LIKE CONCAT('%',#{name},'%')
    </select>
    <!--根据用户名称查询用户列表 模糊查询(多参数查询用实体类进行入参)-->
    <select id="getUserListByUserNameAndNickName" resultMap="userMap">
             SELECT * FROM hero
             WHERE name LIKE CONCAT('%',#{name},'%')
             AND designation LIKE CONCAT('%',#{desigNation},'%')

    </select>
测试代码

 @Test
    //模糊查询,查询通过用户名查询用户信息
    public void testGetUserListByuserNameTest() {
        SqlSession sqlSession = null;
        sqlSession = MybatisUtil.createSqlSession();
        List<Name> list = sqlSession.getMapper(TuserMapper.class).getUserListByUserName("宋江");
        if (null != list) {
            for (Name name : list) {
                System.out.println(name);
            }
        }
        MybatisUtil.closeSqlSession(sqlSession);

    }
    @Test
    //模糊查询,多参数查询用实体类进行入参
    public void testGetUserByUserListByUserNameAndNickName(){
        SqlSession sqlSession=null;

        List<Name> list=null;
        Name tuser =new Name();
        tuser.setName("林冲");
        tuser.setDesigNation("豹子头");

        sqlSession = MybatisUtil.createSqlSession();
        list=sqlSession.getMapper(TuserMapper.class).getUserListByUserNameAndNickName(tuser);
        if(null!=list){
            for (Name tuser1 : list) {
                System.out.println(tuser1);
            }
        }
        MybatisUtil.closeSqlSession(sqlSession);
    }

代码到此结束

mybatis图:

简单的mybatis+maven实现IDEA控制台增删改查

typeAliases映射类型:

简单的mybatis+maven实现IDEA控制台增删改查

resultType和resultMap

简单的mybatis+maven实现IDEA控制台增删改查

typeHandlers应用

简单的mybatis+maven实现IDEA控制台增删改查

自定义typeHandlers

简单的mybatis+maven实现IDEA控制台增删改查


结语:第一次写博客,尽然写了一夜,至努力的自己





相关标签: Mybatis