我们要
使用Mapper代理方式完成Mybatis入门
第一步:在mysql中创建一张user1表,并添加数据。
create table user1
(id int primary key auto_increment,name varchar(20) not null,sex char default '男',address varchar(20)
);
insert into user1 (id, name, sex, address) VALUE (null,'小红','女','天津'),(null,'阿发','男','北京'),(null,'卡恩','男','海南'),(null,'阿福','女','山东');
select id, name, sex, address from user1;
在java代码中编写一个user1类与该表相对应
java">public class user1 {private Integer id;private String name;private String sex;private String address;public user1() {}public user1(Integer id, String name, String sex, String address) {this.id = id;this.name = name;this.sex = sex;this.address = address;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}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 getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "user1{" +"id=" + id +", name='" + name + '\'' +", sex='" + sex + '\'' +", address='" + address + '\'' +'}';}
}
第二步:在Maven工程中pom.xml文件中导入坐标(即我们需要的依赖)
这是完整的pom.xml文件,我们导入了Junit,Mysql,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.hhh</groupId><artifactId>maven_day1</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- mysql依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!--junit依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!--mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.1</version></dependency></dependencies></project>
第三步:编写Mybatis的核心配置文件--->替换连接信息,解决硬编码问题
在Maven工程中的Resource目录下创建一个名为mybatis-config.xml的核心配置文件
在此文件下我们需要写入连接数据库的四大参数,和配置映射文件关联的参数
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><!--设置默认的环境development,也可以配置多环境开发--><environment id="development"><transactionManager type="JDBC"/><!--使用mybatis自带的连接池POOLED--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/mysql_day2"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--配置映射文件关联的参数--><mappers>//相关参数一会写</mappers>
</configuration>
第四步:Resource目录下创建一个映射文件,我们取名为UserMapper.xml,内容一会写
第五步:定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放在同一个目录下
Mapper接口创建在java代码块中
java">//dao层
public interface UserMapper {/*** 功能:查询所有用户数据* @return*/public List<user1> findAllUser();}
现在我们要思考一个问题,Mapper接口在java代码块中,映射文件在Resource目录中,该怎么让他们在同一个目录下?
我们要在Resource目录中创建一个目录:com/hhh/dao (使用"."的话,不是同一个目录,要使用"/")
然后把映射文件拖到Resource目录下的com.hhh.dao包
验证,查看target目录:
可以发现他们已经处于同一个目录
第六步:编写SQL映射文件,namespace属性的值设置为Mapper接口的路径
id是Mapper接口里的方法名字,resultType就是封装的类型
在文本中写select语句
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.hhh.dao.UserMapper"><!--编写sql查询语句--><select id="findAllUser" resultType="com.hhh.pojo.user1">/*返回的结果封装到user1对象*/select id, name, sex, address from user1</select></mapper>
第七步:我们可以编写代码了
我们在java代码块中编写代码
要使用的API
SqlSessionFactory:工厂类,就是为了创建SqlSession对象
SqlSession:和数据库交互的类(执行SQL语句)
大致步骤
1.加载核心配置文件,获取SqlSessionFactory对象
2.获取SqlSession对象
3.通过SqlSession的getMapper()方法获取Mapper接口的代理对象
4.调用代理对象的方法完成sql的执行
5.释放资源
//代理对象会对UserMapper的方法进行增强,通过与它同名的xml文件(SQL映射文件)获取内容(SQL语句),因为Mapper接口已经和xml文件处于同一个目录,且xml文件的namespace属性值是Mapper接口的路径(关联)
java">public class MybatisTest {@Testpublic void testFindAllUser() throws IOException {//核心配置文件路径String resource = "mybatis-config.xml";//核心配置文件//基于配置文件路径,创建字节输入流对象InputStream inputStream = Resources.getResourceAsStream(resource);//创建SqlSessionFactory工厂类对象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//利用工厂类,创建一个SqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession();//利用SqlSession,创建一个代理类对象(注意,不是SqlSession被代理,是UserMapper类对象被代理)UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//使用代理对象,调用方法查询用户数据List<user1> allUser = userMapper.findAllUser();
//代理对象会对UserMapper的方法进行增强,通过与它同名的xml文件(SQL映射文件)获取内容(SQL语句)for (user1 u : allUser) {System.out.println(u);}}
}
运行之前我们还要在核心配置文件中加载映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><!--设置默认的环境development,也可以配置多环境开发--><environment id="development"><transactionManager type="JDBC"/><!--使用mybatis自带的连接池POOLED--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/mysql_day2"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--配置映射文件关联的参数--><mappers><!--扫描mapper--><mapper resource="com/hhh/dao/UserMapper.xml"/></mappers>
</configuration>
结果:
核心配置文件的补充
配置文件中各个标签的顺序
<!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>
properties标签:加载外部的资源配置文件,properties标签在第一位
属性:resource 指定要引入的外部配置文件路径
在核心配置文件中,通过:${key}方式引入外部配置文件的数据,key是键值对的键
我们重新在Resource目录下创建一个jdbc.properties文件,用来保存连接数据库的四大参数
这是jdbc.properties文件的内容
java">jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mysql_day2
jdbc.username=root
jdbc.password=123456
所以我们在核心配置文件中引入该文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>//引入外部文件<properties resource="jdbc.properties"></properties><environments default="development"><!--设置默认的环境development,也可以配置多环境开发--><environment id="development"><transactionManager type="JDBC"/><!--使用mybatis自带的连接池POOLED--><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/> //通过${key}访问<property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--配置映射文件关联的参数--><mappers><!--扫描mapper--><mapper resource="com/hhh/dao/UserMapper.xml"/></mappers>
</configuration>
settings标签
防止数据库中有的字段名带有下划线,我们可以在settings标签中开启驼峰映射
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties resource="jdbc.properties"></properties><!--开启驼峰映射:把数据表中名字带有下划线的字段名,变成驼峰命名格式,例如:user_name=>username或userName--><settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings><environments default="development"><!--设置默认的环境development,也可以配置多环境开发--><environment id="development"><transactionManager type="JDBC"/><!--使用mybatis自带的连接池POOLED--><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--配置映射文件关联的参数--><mappers><!--扫描mapper--><mapper resource="com/hhh/dao/UserMapper.xml"/></mappers>
</configuration>
typeAliases标签:起别名
子标签:package
属性:name:指定扫描的包
<typeAliases><!-- <typeAlias type="com.hhh.pojo.user1" alias="user1"></typeAlias>--><!--如果pojo包下有很多类,哪么要写很多行,我们换另一种方法--><!--扫描指定的包,把包下的所有类,都起了别名。别名格式:全部小写或者和类名一致,就是把前面的包名去掉--><package name="com.hhh.pojo"/></typeAliases>
这样一来,在映射文件中,resultType的值就可以从com.hhh.pojo.user1改成user1了
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--映射文件--><!--利用username把当前映射文件与Mapper接口关联-->
<mapper namespace="com.hhh.dao.UserMapper"><!--编写sql查询语句--><select id="findAllUser" resultType="user1">/*返回的结果封装到user1对象*/select id, name, sex, address from user1</select></mapper>
mappers标签:提供了关联加载映射文件的配置功能;
使用方式:
1.先加载xml映射文件,再通过映射文件取关联Mapper接口
<mapper resource="UserMapper.xml"/> 从resource下加载映射文件
说明:如果项目基于xml的开发模式,建议使用方式1
2.加载接口,再通过接口关联映射文件
条件:1.接口名和映射文件名保持一致 2.路径保持一致
批量加载class:<package name="接口在的包路径">
说明:如果基于注解开发的话,使用方式2
<!--配置映射文件关联的参数--><mappers><!--扫描mapper--><!--<mapper resource="com/hhh/dao/UserMapper.xml"/>--><!--指定要扫描的所有Mapper接口的包路径--><package name="com.hhh.dao"/></mappers>