Java学习笔记之Mybatis--上

一、数据库元数据

概述:

用来定义数据的数据(或用来定义数据表的数据)

分类:

1.数据库元数据:用来获得数据库厂商的信息,驱动包的信息等

2.参数元数据:用来获取占位符的个数以及对应数据类型

3.结果集元数据:用来获取结果集中的列的数量、类型、名字

1.ParameterMetaData元数据

代码:

package com.ps.Utils;

import com.ps.Utils.jdbcUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.sql.*;

public class UtilsTest {

    private static Connection conn = null;
    private static PreparedStatement pstmt = null;
    private static Statement stmt = null;
    private static ResultSet rs = null;

    @Before
    public void Connection() throws Exception {
        conn = jdbcUtils.getConnection();
    }

    @Test
    public void testSelect() throws Exception {
        String sql = "select * from user where id=? and address=?";
        pstmt = conn.prepareStatement(sql);
        //获得参数元数据
        ParameterMetaData metaData = pstmt.getParameterMetaData();
        //通过元数据获得占位符个数和各自的类型
        int count = metaData.getParameterCount();
        for (int i = 0; i < count; i++) {
            System.out.println(i + 1 + "个问号的数据类型是:" + metaData.getParameterTypeName(i + 1));
        }
    }

    @After
    public void close() {
        jdbcUtils.Close(conn, pstmt, rs);
        jdbcUtils.Close(conn, stmt);
    }
}

报错原因:

以上代码看起来没有任何错误,但其实运行会有问题,原因在于MySQL驱动不持支这样去获取元数据

解决方案:

在MySQL连接字符串后面添加:

?generateSimpleParameterMetadata=true

元数据常用方法:

ParameterMetaData对象常用方法说明
int getParameterCount()获得占位符问号个数
String getParameterTypeName(int param)获得占位符问号的数据类型

2.ResultSetMetaData元数据

代码:

package com.ps.Utils;

import com.ps.Utils.jdbcUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.sql.*;

public class UtilsTest {

    private static Connection conn = null;
    private static PreparedStatement pstmt = null;
    private static Statement stmt = null;
    private static ResultSet rs = null;

    @Before
    public void Connection() throws Exception {
        conn = jdbcUtils.getConnection();
    }

    @Test
    public void testSelect() throws Exception {
        String sql = "select * from user";
        pstmt = conn.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        //获得结果集元数据
        ResultSetMetaData metaData = rs.getMetaData();
        //获得结果集列数
        int count = metaData.getColumnCount();
        //循环遍历
        for (int i = 0; i < count; i++) {
            //输出列名和列的类型
            System.out.println(metaData.getColumnName(i + 1)
                    + "===" + metaData.getColumnTypeName(i + 1));
        }
    }

    @After
    public void close() {
        jdbcUtils.Close(conn, pstmt, rs);
        jdbcUtils.Close(conn, stmt);
    }
}

运行结果:
在这里插入图片描述

常用方法:

ResultSetMetaData对象常用方法说明
int getColumnCount()获取列的个数
String getColumnName(int column)获得指定列的名字
String getColumnTypeName(int column)获得指定列的类型

3.利用元数据简化代码

目标:

由于数据库代码编写相同之处太多,所以利用元数据来提高代码复用,实现更加简单编写代码

代码:

   /**
     * 抽取增删改代码,实现一行编写增删改
     *
     * ...代表可变参数,可有可无,数量不限制
     * 本质是个数组,可以直接通过下标访问
     * 格式:数据类型...参数名
     *
     * @param sql
     * @param param
     * @return result
     * @throws Exception
     */
    public static int ExecuteSql(String sql, Object... param) throws Exception {
        //获得连接对象
        Connection conn = getConnection();
        //获得预编译对象
        PreparedStatement pstmt = conn.prepareStatement(sql);
        //要想实现就必须获得这个元数据
        ParameterMetaData data = pstmt.getParameterMetaData();
        //循环遍历输入
        for (int i = 0; i < data.getParameterCount(); i++) {
            pstmt.setObject(i + 1, param[i]);
        }
        //获得结果
        int i = pstmt.executeUpdate();
        //关闭连接释放资源
        Close(conn, pstmt);
        //返回结果
        return i;
    }

测试代码:

    @Test
    public void testSql() throws Exception {
        String delete = "delete from user where id =?";
        String add = "insert into user values(null,?,?,?,?)";
        String update = "update user set id=1 where id=?";
        jdbcUtils.ExecuteSql(update, 45);
    }

二、Mybatis框架介绍

框架概述:

框架就是一系列Java代码的集合,集合中的代码封装性高、可重用性和简洁性也更高

可以简化开发、提高效率、降低开发难度;

三层架构中的常用框架:

​ 表现层:SpringMvc

​ 业务层:Spring

​ 持久层:mybatis

简介:

mybatis是一个由apache组织开发的一个持久层框架,通过注解和xml配置来使用

三、Mybatis简单入门

1.准备工作

数据库创建用户表:

-- 创建用户表
create table user (
  id int primary key auto_increment,
  username varchar(20) not null,
  birthday date,
  sex char(1) default '男',
  address varchar(50)
);

-- 添加用户数据
insert into user values (null, '孙悟空','1980-10-24','男','花果山水帘洞');
insert into user values (null, '白骨精','1992-11-12','女','白虎岭白骨洞');
insert into user values (null, '猪八戒','1983-05-20','男','福临山云栈洞');
insert into user values (null, '蜘蛛精','1995-03-22','女','盤丝洞');

-- 查询用户数据
select * from user;

创建User类:

package com.ps.pojo;

public class User {
    private int id;
    private String username;
    private String birthday;
    private char sex;
    private String address;

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", birthday='" + birthday + '\'' +
                ", sex=" + sex +
                ", address='" + address + '\'' +
                '}';
    }

    public User() {

    }

    public User(String username, String birthday, char sex, String address, int id) {
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
        this.id = id;
    }

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public char getSex() {
        return sex;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

maven引入相关类库:

这里面只有mybatis和数据库驱动是必须的其他的可以没有

<?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.ps</groupId>
    <artifactId>MyBatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>

        <!--数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>

        <!--日志-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.0</version>
        </dependency>

        <!--数据库连接池-->
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>

        <!--阿里巴巴数据库连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.2</version>
        </dependency>
        
        <!-- junit测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

</project>

2.编写业务代码

编写dao接口:

package com.ps.dao;

import com.ps.pojo.User;

import java.util.List;

public interface UserMapper {
    
    List<User> findAll();
    
}

编写接口映射文件:

其实就相当于在配置文件中实现了这个接口

这个文件一般和接口放到一起,或者放到resources文件夹下相同路径下

比如接口在com.ps.dao,那么这个配置文件就放在resources下的com.ps.da下面

这个文件一般命名和接口名一样,只不过类型是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">

<!--  -->

<!--
 映射文件的作用:一个映射文件对应一个接口,一个接口可以有多个映射文件,但一般是一对一的关系
 namespace的作用:关联接口,需要配置接口的类全名字符串,需要用点来分割
 -->
<mapper namespace="com.ps.dao.UserMapper">
	<!-- 完成这个接口的编写就相当于实现了这个接口中的方法 -->
    <!-- 对于每一个sql语句都有独立的标签可以配置 -->
    <!--
    id:关联接口中的方法名
    resultType:设置返回数据的类型,如果是集合元素则配置集合元素的类型
      -->
    <select id="findAll" resultType="com.ps.pojo.User">
        select * from user
    </select>

</mapper>

编写mybatis配置文件:

这个文件一般放在src文件夹下面或者放在maven项目的resources文件夹下

命名一般为:sqlMapConfig.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>
    <!-- 
	default:设置默认数据库环境
	environments:配置数据库环境信息
	environment:配置一个数据库环境
	-->
    <environments default="develop">
        <!-- 
 		id:用来唯一标识这个环境
		-->
        <environment id="develop">
            <!--配置事务管理器-->
            <!--
            JDBC:采用JDBC的管理方式
            MANAGED:事务交给容器管理,mybatis不管理,后续会交给spring容器管理
             -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源信息 -->
            <!--
             type:设置数据源类型,常用 unpooled和pooled(前面的时候不使用连接池,后面的表示使用内置的连接池)
             -->
            <dataSource type="POOLED">
                <!-- 数据库驱动字符串 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!-- 数据库连接字符串 -->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <!-- 用户名 -->
                <property name="username" value="root"/>
                <!-- 密码 -->
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>


    <!-- 配置映射文件 -->
    <mappers>
        <!--
        resource:配置映射文件的路径,这里要使用/来分割
        url:用于配置互联网上的映射文件的路径
         -->
        <mapper resource="com.ps.dao\UserMapper.xml"></mapper>
    </mappers>

</configuration>

3.测试编写好的代码

测试代码:

package com.ps.dao;

import com.ps.pojo.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 java.io.InputStream;
import java.util.List;

public class MybatisTest {

    @Test
    public void demo01() throws Exception {
        //读取mybatis配置文件
        InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
        //创建sqlsession,sqlsession就相当于jdbc中的connection对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory build = builder.build(in);
        SqlSession session = build.openSession();
        //获得接口的实现类对象(代理对象)
        UserMapper mapper = session.getMapper(UserMapper.class);
        //调用接口中的方法
        List<User> list = mapper.findAll();
        //输出结果
        for (User user : list) {
            System.out.println(user);
        }
    }

}

运行结果:
在这里插入图片描述

4.IDEA使用maven编写读取不到配置文件

原因:

由于idea自身编译器的问题,他不会去读取maven工程下Java包下的所有配置文件,所以配置文件最好不要放到那里,

而且它给你创建了一个resource文件夹就是让你存放配置文件的。

解决方案:

1.修改maven配置,让他去读取配置文件

2.修改配置文件的位置

修改maven配置信息:

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

另外两篇文章看这里:

Java学习笔记之Mybatis–中

Java学习笔记之Mybatis–下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值