使用mybatis连接数据库-

使用mybatis连接数据库-

实现mybatis连接数据库的步骤:

1.建表

2.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>com.cqust</groupId>
  <artifactId>ch02-动态代理</artifactId>
  <version>1.0-SNAPSHOT</version>

 


  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</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.5.1</version>
    </dependency>



    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.9</version>
    </dependency>
  </dependencies>

  <build>

    <resources>
      <resource>
        <!--指定去哪拷贝-->
        <directory>src/main/java</directory>
        <includes>
          <!--指定拷贝什么文件-->
          <include>**/*.xml</include>
            <include>**/*.properties</include>
        </includes>
      </resource>
      <!--当配置了src/main/java下的就不会拷贝resource下的文件了所以还需要配置一下-->

    </resources>

  </build>

</project>

3.创建实体类在domain包下

package com.cqust.domain;

/**
 *实体类属性要求和表中的名字一致,类型也一致
 */
public class Dept {
    private Integer deptno;
    private String dname;
    private String loc;

    public Dept(Integer deptno, String dname, String loc) {
        this.deptno = deptno;
        this.dname = dname;
        this.loc = loc;
    }

    public Integer getDeptno() {
        return deptno;
    }

    public void setDeptno(Integer deptno) {
        this.deptno = deptno;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public String getLoc() {
        return loc;
    }

    public void setLoc(String loc) {
        this.loc = loc;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptno=" + deptno +
                ", dname="" + dname + """ +
                ", loc="" + loc + """ +
                "}";
    }
}

4.创建dao接口

package com.cqust.dao;

import com.cqust.domain.Dept;

import java.util.List;

/**
 * 定义访问数据库的方法,增删改查
 */
public interface DeptDao {
    public List<Dept> selectDept();
    public int insertDept(Dept dept);
    public int deleteDept(Integer deptno);
    public int updateDept(Dept dept);




}

5.创建mybatis配置文件
sql映射文件,写sql语句的,一个表一个sql映射文件,在接口所在的目录下
文件名和接口一致

<?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.cqust.dao.DeptDao">
    <!--sql映射文件写sql语句的
        namespace:接口的全限定名称
        id:执行sql的唯一标识
        resultType:结果类型,是sql语句执行后得到resultSet,遍历数组得到
        每个java对象的类型
    -->


    <select id="selectDept" resultType="com.cqust.domain.Dept">
        select deptno,dname,loc from dept
    </select>
    <insert id="insertDept">
        insert into dept (deptno,dname,loc) values (#{deptno},#{dname},#{loc})
    </insert>
    <delete id="deleteDept">
        delete from dept where deptno = #{deptno}
    </delete>
    <update id="updateDept">
        update dept set dname = #{dname},loc=#{loc} where deptno = #{deptno}
    </update>




</mapper>

6.创建主配置文件:
一个项目一个主配置文件,提供数据库连接信息,和sql映射文件的信息

<?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>

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <environments default="myenv"><!--default值为一个env的id-->
        <environment id="myenv">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/cqust_db2"/>
                <property name="username" value="root"/>
                <property name="password" value="hch1"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/cqust/dao/DeptDao.xml"/>
        <!--一个mapper标签指定一个sql映射文件
            路径从类路径开始classes
        -->
    </mappers>
</configuration>
<!--mybatis的主配置文件:定义了数据库连接信息,sql映射文件位置信息。-->

7.将创建SqlSession进行了封装

package com.cqust.util;

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 = null;
    static {
        String config = "mybatis.xml";
        InputStream in = null;
        try {
            in = Resources.getResourceAsStream(config);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
         sqlSessionFactory =  sqlSessionFactoryBuilder.build(in);
    }
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = null;
        if (sqlSessionFactory != null){
            sqlSession = sqlSessionFactory.openSession(true);
        }
        return sqlSession;

    }
}

8.测试类:

package com.cqust;

import com.cqust.dao.DeptDao;
import com.cqust.domain.Dept;
import com.cqust.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class MyTest {
    @Test
    public void testSelectDept(){
        SqlSession sqlSession =  MyBatisUtil.getSqlSession();
        DeptDao deptDao =  sqlSession.getMapper(DeptDao.class);
        System.out.println("==="+deptDao);//org.apache.ibatis.binding.MapperProxy@a86356
        List<Dept> deptList =  deptDao.selectDept();
        for (Dept dept : deptList) {
            System.out.println(dept);
        }
        sqlSession.close();

    }

9.查询结果:

工程结构:

总结:整个项目需要注意的小知识点!!!

(1).如果xml文件在运行时没有或者找不到,看是不是没有配置插件

<resource>
  <!--指定去哪拷贝-->
  <directory>src/main/java</directory>
  <includes>
    <!--指定拷贝什么文件-->
    <include>**/*.xml</include>
      <include>**/*.properties</include>
  </includes>
</resource>
<!--当配置了src/main/java下的就不会拷贝resource下的文件了所以还需要配置一下-->

如果没有配置可能会存在找不到xml,可以先在target目录中找一下,如果很多方法都试过还是不行

直接暴力复制粘贴就行。把工程下的xml文件复制到target目录下的指定位置。

(2).有两个xml文件一个在classes下,一个在,dao下,这是比较容易出错的地方。

(3).DeptDao deptDao = sqlSession.getMapper(DeptDao.class);

这里我们直接获取到代理对象来执行方法,接口的实现类交给mybatis来做,这里直接使用就可以了,不用关心底层原理。