MyBatis+Maven极简项目测试

一、环境配置

1. IDEA下载

IDEA下载界面链接

IDEA下载界面
可以根据系统选择下载的版本,然后进行安装。

2. Maven下载

Maven下载界面链接

Maven下载界面
可以根据需要选择下载的版本,下载好之后解压到某个位置即可。

3. MySQL下载

MySQL下载界面链接

在这里插入图片描述
可以根据系统选择下载的版本,然后进行安装,用户名和密码要记住。

4. 设置

Win10系统环境变量设置

  1. 右击 :此电脑 —>属性—>高级系统设置—>环境变量
    环境变量配置

  2. 系统变量 中选择 新建,在弹出的界面中填入变量名和变量值,点击 确定

    变量名:一般为 Maven_Home ,也可以自行设计。

    变量值:点击 浏览目录 选择 Maven 文件夹下的 bin 目录即可,也可以手敲。

配置界面

  1. 选择 :用户变量中的path ,点击 编辑 —>新建—>填入”%Maven_Home%“—>确定
    path配置

测试并设置Maven

  1. 快捷键 Win+R —>填入 cmd —>回车写入mvn -v
    在这里插入图片描述
    弹出Maven版本号等相关信息表明配置成功。

  2. 在Maven根目录下新建文件夹 repository:依赖仓库,项目的依赖都会自动下载存放到该文件夹中。
    也可以设置其他路径,一般都会设置在Maven根目录下。
    在这里插入图片描述

  3. 编辑conf—>settings.xml文件:配置依赖获取源,仓库,jdk版本等信息。注释部分是官方解释和模板格式,可根据实际情况进行修改!

    在<localRepository>标签下填入repository文件夹地址,设置依赖仓库

    <localRepository>D:\Maven\repository</localRepository>
    

    在<mirrors>下新建标签<mirror>设置依赖下载镜像,可加速jar包下载速度!

     <mirrors>
    <mirror>
      <id>alimaven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
    </mirror>
    <mirror>
      <id>aliyunmaven</id>
      <mirrorOf>*</mirrorOf>
      <name>阿里云公共仓库</name>
      <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
      </mirrors>
    

    在<profiles>下新建<profile>标签,设置jdk版本等信息

     <profiles>
    <profile>
      <id>JDK-1.8</id>
      <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
      </activation>
      <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
      </properties>
    </profile>
    </profiles>
    

IDEA中的Maven设置

选择File—>Settings—>Build,Execution,Deployment—>Build Tools—>Maven

Maven中的IDEA设置
Maven home directory:本地Maven文件目录

User setting file:本地Maven的settings.xml文件

Local repository:本地依赖库

二、简单项目搭建测试

  1. MySQL语句运行,创建本次项目数据库端需要。

    /*
    SQLyog Ultimate v9.60 
    MySQL - 5.1.73-community : Database - memmana
    *********************************************************************
    */
    
    /*!40101 SET NAMES utf8 */;
    
    /*!40101 SET SQL_MODE=''*/;
    
    /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
    /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
    CREATE DATABASE /*!32312 IF NOT EXISTS*/`memmana` /*!40100 DEFAULT CHARACTER SET utf8 */;
    
    USE `memmana`;
    
    /*Table structure for table `admin` */
    
    DROP TABLE IF EXISTS `admin`;
    
    CREATE TABLE `admin` (
      `username` varchar(20) CHARACTER SET utf8 COLLATE utf8_estonian_ci NOT NULL,
      `password` char(32) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    /*Data for the table `admin` */
    
    insert  into `admin`(`username`,`password`) values ('admin','21232f297a57a5a743894a0e4a801fc3');
    
    /*Table structure for table `news` */
    
    DROP TABLE IF EXISTS `news`;
    
    CREATE TABLE `news` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `contentTitle` varchar(40) NOT NULL,
      `contentPage` varchar(80) NOT NULL,
      `publishDate` date NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
    
    /*Data for the table `news` */
    
    insert  into `news`(`id`,`contentTitle`,`contentPage`,`publishDate`) values (1,'1:Web开发基础及Java EE开发环境搭建','http://www.wustwzx.com/javaee/sy/wkd2018/sy1.html','2015-10-24'),(2,'2:使用JSP技术开发Web项目','http://www.wustwzx.com/javaee/sy/wkd2018/sy2.html','2015-10-15'),(3,'3:Servlet组件、使用MVC模式开发Web项目','http://www.wustwzx.com/javaee/sy/wkd2018/sy3.html','2015-10-15'),(4,'4:MyBatis框架','http://www.wustwzx.com/javaee/sy/wkd2018/sy4.html','2015-10-15'),(5,'5:Spring MVC框架','http://www.wustwzx.com/javaee/sy/wkd2018/sy5.html','2015-10-15'),(6,'6:Spring框架','http://www.wustwzx.com/javaee/sy/wkd2018/sy6.html','2015-10-15'),(7,'7:使用SSM整合开发Web项目','http://www.wustwzx.com/javaee/sy/wkd2018/sy7.html','2015-12-01'),(8,'8:Spring Boot框架','http://www.wustwzx.com/javaee/sy/wkd2018/sy8.html','2015-12-01');
    
    /*Table structure for table `user` */
    
    DROP TABLE IF EXISTS `user`;
    
    CREATE TABLE `user` (
      `username` char(20) NOT NULL,
      `password` varchar(20) NOT NULL,
      `realname` char(10) DEFAULT NULL,
      `mobile` char(11) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      PRIMARY KEY (`username`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    /*Data for the table `user` */
    
    insert  into `user`(`username`,`password`,`realname`,`mobile`,`age`) values ('chenjiu','777','陈久','13700000009',99),('lisi','222','李四','13700000004',44),('qianqi','555','钱七','13700000007',77),('sunba','666','孙八','13700000008',88),('wangwu','333','王五','13700000005',55),('zhangsan','111','张三','13700000003',33),('zhaoliu','444','赵六','13700000006',66);
    
    /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
    /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
    /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
    /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
    
    
  2. 选择File—>New—>Project,选中Maven—>Next
    在这里插入图片描述
    选中:create from archetype 后可以根据实际选择使用各种项目的目录框架。

  3. 填入项目名和项目位置
    在这里插入图片描述

  4. 目录结构分析
    在这里插入图片描述

    main—>java:各种层次的Java源代码,本次实验将使用到dao(数据操作层)、 model(实体层)、untils(工具类)。

    resources:数据配置源,存放配置文件和映射文件等。

    test—>java:测试类。

    pom.xml:Maven的依赖配置。

  5. 创建包和文件夹

  6. 创建类和数据源(示例操作User表)

    在这里插入图片描述

  7. pom.xml编写

    添加<dependencies>便签并创建 <dependency>依赖标签

    <?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.lx</groupId>
        <artifactId>MyBatisMavenTest</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.4</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.19</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
    </project>
    

    <dependencies>依赖集

    <dependency>依赖,jar包的官网一般会提供写法
    <groupId>组名
    <artifactId>jar包名
    <version>版本号

    如果jar包没有自动导入,可以点击maven的刷新!

    在这里插入图片描述

  8. jdbc.properties编写

    	driver=com.mysql.cj.jdbc.Driver
        url=jdbc:mysql://localhost:3306/memmana?serverTimezone=UTC
        n=root
        p=root
    

    driver:驱动名称

    url:数据库链接,?后是连接参数,不同机器可能需要加不同的参数

    n:用户名

    p:密码

  9. 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="jdbc.properties"/>
        <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="${n}"/>
                    <property name="password" value="${p}"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="mapper/UserMapper.xml"/>
            <!--如果在mapper映射文件中namespace引入映射接口,那么就会与Class的注入映射语句冲突-->
            <mapper resource="mapper/UserMapper2.xml"/>
            <!--<mapper class="cn.lx.mapper.UserMapper"/>-->
        </mappers>
    </configuration>
    

    <properties resource="jdbc.properties"/>引入外部properties文件

    <environments default="development"> 环境配置

    <environment id="development">
    <transactionManager type="JDBC"/>事务管理方式为JDBC类型
    <dataSource type="POOLED">获取jdbc.properties文件中的数据库链接参数

    <mapper resource="mapper/UserMapper.xml"/>注册sql操作xml文件
    <mapper class="cn.lx.mapper.UserMapper"/>注册sql操作类文件

  10. UserMapper.xml和UserMapper2.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.lx.mybatis">
        <select id="findAll" resultType="cn.lx.model.User">
            select * from user
        </select>
    </mapper>
    
    <?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">
    <!--实际就是将接口定义的方法相关的SQL引入到XML中实现-->
    <mapper namespace="cn.lx.mapper.UserMapper">
        <select id="findUserByAge" resultType="cn.lx.model.User">
            select * from user where age in(
            <foreach collection="list" item="age" separator=",">
                #{age}
            </foreach>
            )
        </select>
    </mapper>
    

    <mapper namespace="cn.lx.mybatis">映射标签,namespace为其包括的所有sql语句提供一个统一组名。如果namespace引入的是某个映射接口,其作用相当于注入类映射到Mybatis框架中,需要注意的是SQL语句的id必须和接口对应的方法名相同!

    <select id="findAll" resultType="cn.lx.model.User">查询标签,id是其标识号,resultType表明结果类型。
    调用该方法用cn.lx.mybatis.findAll即可

  11. UserMapper编写

    package cn.lx.mapper;
    
    import cn.lx.model.User;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    
    public interface UserMapper {
    
        @Select("select * from user order by age")
        public List<User> findAll();
    
        List<User> findUserByAge(List<Integer> list);
    }
    
    

    @Select、@Update、@Delete、@Insert等注解原理和通过xml文件相差不多。只不过这种方式看起来的比较简洁,简单项目推荐注解,复杂的还是XML映射比较好。
    增删改等操作需要commit()方法进行事务提交

  12. MyBatisUntils.java编写

    package cn.lx.untils;
    
    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 MyBatisUntils {
        //MyBatis核心SqlSessionFactory,每个应用都有一个SqlSessionFactory,用于获取映射文件的反射对象SqlSession
        private static SqlSessionFactory sqlSessionFactory = null;
    
        /*静态获取SqlSessionFactory对象
         * Resources.getResourceAsStream("映射文件名") 得到InputStream对象
         * new SqlSessionFactoryBuilder().build(InputStream对象) 得到SqlSessionFactory
         * 记得关流
         * */
        static {
            InputStream inputStream = null;
            try {
                String resource = "mybatis-config.xml";
                inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
    
        //获得SqlSession对象,使用SqlSessionFactory对象.openSession()
        public static SqlSession getSqlSession() {
            return sqlSessionFactory.openSession();
        }
    
        //关闭SqlSession对象,使用SqlSession对象.close()
        public static void closeSqlSession(SqlSession session) {
            if (null != session)
                session.close();
        }
    }
    
    
  13. User.java编写

    package cn.lx.model;
    
    public class User {
        //字段属性,根据表的列名设计
        private String username;  //类属性
        private String password;
        private String realname;
        private String mobile;
        private int age;
    
        //Getter和Setter方法
        public void setUsername(String username) {  //setXXX方法
            this.username = username;
        }
    
        public String getUsername() {  //getXXX方法
            return username;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setRealname(String realname) {
            this.realname = realname;
        }
    
        public String getRealname() {
            return realname;
        }
    
        public void setMobile(String mobile) {
            this.mobile = mobile;
        }
    
        public String getMobile() {
            return mobile;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public int getAge() {
            return age;
        }
    
        //有参构造函数重载形式
        public User(String username, String password) {
            this.username = username;
            this.password = password;
        }
    
    
        public User(String username) {
            this.username = username;
        }
    
        public User(String username, String password, String realname, String mobile, int age) {
            this.username = username;
            this.password = password;
            this.realname = realname;
            this.mobile = mobile;
            this.age = age;
        }
    
        //无参构造函数,不可省略
        public User() {
    
        }
    
        //重写toString(),自定义输出对象本身时的格式
        @Override
        public String toString() {
            return "User [username=" + username + ", password=" + password
                    + ", realname=" + realname + ", mobile=" + mobile
                    + ", age=" + age + "]";
        }
    }
    
  14. UserDao.java编写

    package cn.lx.dao;
    
    import cn.lx.model.User;
    
    import java.util.List;
    
    public interface UserDao {
        //定义数据操作
        public List<User> findAll();
    }
    
  15. UserDaoImpl.java编写

    package cn.lx.dao.impl;
    
    import cn.lx.dao.UserDao;
    import cn.lx.model.User;
    import cn.lx.untils.MyBatisUntils;
    import org.apache.ibatis.session.SqlSession;
    
    import java.util.List;
    
    public class UserDaoImpl implements UserDao {
        //获取SqlSession对象
        private SqlSession sqlSession = MyBatisUntils.getSqlSession();
    
        //实现findAll方法
        @Override
        public List<User> findAll() {
            //调用UserMapper映射文件的方法
            return sqlSession.selectList("cn.lx.mybatis.findAll");
        }
    
        //关闭SqlSession对象
        public String close() {
            sqlSession.close();
            if (sqlSession == null) {
                return "close succeed";
            } else {
                return "close fail";
            }
        }
    }
    
  16. UserTest.java编写

    import cn.lx.dao.impl.UserDaoImpl;
    import cn.lx.mapper.UserMapper;
    import cn.lx.untils.MyBatisUntils;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class UserTest {
        //获取UserDao接口的实现类
        UserDaoImpl userDaoImpl = new UserDaoImpl();
        SqlSession sqlSession=MyBatisUntils.getSqlSession();
    
        //@Test测试注解,可以直接执行该方法,不用再main函数中
        @Test
        public void testFindAll() {
            //调用findAll方法并输出
            userDaoImpl.findAll().forEach(System.out::println);
            //关闭SqlSession对象
            userDaoImpl.close();
        }
        @Test
        public void testFindAllInterfaceMapper(){
            //接口方式映射Sql语句
            sqlSession.getMapper(UserMapper.class).findAll().forEach(System.out::println);
        }
        @Test
        public void testFindUserByAgeInterfaceMapperXml(){
            //Xml引入映射接口,完成两种方法融合
            List<Integer> list = new ArrayList<>();
            list.add(33);list.add(66);list.add(99);
            sqlSession.getMapper(UserMapper.class).findUserByAge(list).forEach(System.out::println);
        }
    }
    

    输出结果
    在这里插入图片描述

总结
首先配置Maven和MyBatis的xml文件
然后编写Sql映射文件
工具类可以不用,但每次都要执行同样语句会很麻烦
根据表创建实体类和操作接口以及其实现
最后进行测试
Author
小葳宝贝最爱吃饭
posted @ 2021-04-12 20:26  小葳宝贝最爱吃饭  阅读(99)  评论(0)    收藏  举报