文章目录
一、数据库元数据
概述:
用来定义数据的数据(或用来定义数据表的数据)
分类:
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>
另外两篇文章看这里: