一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情。
下载mybatis
链接:blog.MyBatis.org 下载省略,可以百度看看其他文章
开发mybatuis文件的模板
1.创建maven项目,包括如下
2.pom.xml
百度:mvnrepository.com 然后在里面找,MyBatis,mysql-connect-java依赖类,并且在pom里面加入build属性
3.打开数据库,添加我们想要的数据和表
参考 mysql数据库习题2 - 掘金 (juejin.cn)
4.在实体类包下根据数据库字段创建实体类,包括setget方法,tostring方法(数据库字段==类属性)
5.在mapper的xxxMapper.xml里面添加sql映射文件
SQL 映射文件(XxxMapper.xml)的基础模板如下(以 select 查询操作为例),代码详见如下程序清单:
<?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="{namespace}">
<select id="{id}" parameterType="{ptype}" resultType="{rtype}">
SQL语句,如select * from student where stuNo=#{stuNo}
</select>
</mapper>
映射文件中主要的元素及属性含义如下:
1.命名空间
<mapper namespace="{namespace}">
用 namespace 属性给此映射文件设置一个命名空间,通常使用 xxx.xxx.xxx 的形式,而且就是映射文件的路径名转换而来。例如,映射文件的路径是 org/lanqiao/mapper/StudentMapper.xml,那么 namespace 的值就是org.lanqiao.mapper.StudentMapper。
2.查询标签
<select id="{id}" parameterType="{ptype}" resultType="{rtype}">
SQL语句,如select * from student where stuNo=#{stuNo}
</select>
id:唯一标识符。程序可以通过 “命名空间+唯一的标识符”(namespace+id)来定位此 select 标签中的 SQL 语句。
parameterType:传入 SQL 语句中的参数类型。例如,SQL 语句中的 stuNo=#{stuNo} 需要传入一个 int 型的 stuNo 时,就可以通过 parameterType="int" 将输入参数的类型设置为 int。
resultType:SQL 语句查询的返回类型。例如,select * from student … 返回的是一个学生的全部信息,可以用学生对象集合来保存,因此返回类型应该是 List<Student> 类型。但在 MyBatis 中,无论返回值是一个对象还是一个集合,resultType 都只能设置为对象或集合元素的类型,而不能是集合类型
除了查询标签 <select> 以外,还有增加 <insert>、修改 <update>、删除 <delete> 等标签。
6.配置文件 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>
<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="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml" />
</mappers>
</configuration>
其中主要的元素及属性含义如下:
多环境配置
<environments default="development">
default:指定一个环境 id,与子元素 <environment> 的 id 属性值对应。
environments:可以为同一个 MyBatis 项目配置多种不同的数据库环境,如开发环境、测试环境、工作环境等。因此在 MyBatis 中,
可以使用相同的 SQL 映射来操作不同环境的数据库。但要注意,虽然允许配置多种不同的环境,但在使用时,environments 只能选择唯一的一个环境
,即通过 environments 元素的 default 属性来指定默认使用的 environment 的 id 值。
这样可以方便开发者快速地在不同数据库环境之间切换。此外,每个数据库环境(environment 元素)在程序中对应着一个 SqlSessionFactory 对象。
前述在测试类 TestMyBatis.java 中,通过配置文件 mybatis-config.xml
创建的 SqlSessionFactory 对象,就是根据数据库环境 environment 元素的内容产生的,如下:
String resource = "mybatis-config.xml";
//加载MyBatis的配置文件
Reader reader = Resources.getResourceAsReader(resource);
//创建SqlSession 的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
以上,是根据 environments 元素中 default 属性指定的数据库环境而产生的
SqlSessionFactory 对象。除此以外,还可以在 Java 代码中显式指定数据库环境 id,如下:
SqlSessionFactory sessionFactory
= new SqlSessionFactoryBuilder().build(reader,"development");
即通过 build() 方法的第二个参数,将数据库的环境id 指定为 development 所代表的 environment。
具体环境配置
<environment> 是 <environments> 的子元素,表示具体的数据库环境,
它又有 <transactionManager> 和 <dataSource> 两个子元素,用于配置该数据库环境的事务管理和数据源参数。
事务管理器,语法如下:
<transactionManager type="JDBC" />
type:指定事务管理器类型。在 MyBatis 中有两种事务管理器类型:
JDBC:使用 JDBC 的提交和回滚来管理事务,即利用 java.sql.Connection
对象完成对事务的提交 commit()、回滚 rollback()、关闭 close() 等
MANAGED:MyBatis 自身不会去管理事务,而是把事务托管给容器
(比如 Spring、JBOSS、Weblogic 容器)。默认情况会关闭连接,若不想关闭则需要如下配置:
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
数据源,语法如下:
<dataSource type="POOLED">
type:指定数据源类型。MyBatis 中有三种数据源类型:
UNPOOLED:每次被请求时简单打开和关闭连接,需要配置属性如下表所示:
属 性 名 简 介
driver JDBC 驱动的 Java 全类名
url 数据库的 JDBC URL 地址
username 登录数据库的用户名
password 登录数据库的密码
defaultTransactionIsolationLevel 默认事务隔离级别
POOLED:数据库连接池类型,它使得数据库连接可被复用,不必在每次请求时都去创建一个新的连接。
JNDI:从 tomcat 等容器中获取数据源。
映射文件
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml" />
</mappers>
mappers:用于罗列 SQL 映射文件
mapper 的 resource 属性:SQL 映射文件(XxxMapper.java)的相对路径
7.编写test
@Test public void testStudent() throws IOException {
String resource = "mybatis-config.xml";
//加载 MyBatis 的配置文件
Reader reader = Resources.getResourceAsReader(resource);
//创建 SqlSession 的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建能够执行 SQL 映射文件中 SQL 语句的 SqlSession 对象
SqlSession session = sessionFactory.openSession();
//指定 SQL 语句对应的标识字符串:namespace+id
String statement = "mapper.XXXMapper.里面mapper的id";
//执行查询
实体类 名字 = session.selectOne(参数);
session.close(); } }
实例:开发第一个基于 MyBatis 的程序
首先我们在终端输入以下命令,新建一个 Maven 项目,groupId 为:xxx; artifactId 为: MyBatisDemo01。
mvn archetype:generate -DgroupId=xxx -DartifactId=MyBatisDemo01 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -Dversion=0.0.1-SNAPSHOT
创建文件 Student.java、StudentMapper.xml、mybatis-config.xml、TestMyBatis.java
pom文件
项目框架搭建完成,我们需要配置 pom.xml 文件。在 pom.xml 文件中配置 mybatis 和 mysql-connector-java 依赖,如下代码所示:
<?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>org.lanqiao</groupId>
<artifactId>MyBatisDemo01</artifactId>
<version>1.0-SNAPSHOT</version>
<name>MyBatisDemo01</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<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>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
创建数据
CREATE DATABASE IF NOT EXISTS `MyBatisDemo`;
USE `MyBatisDemo`;
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`stuNo` int(10) NOT NULL,
`stuName` varchar(50) NOT NULL,
`stuAge` tinyint,
`graName` varchar(50) NOT NULL,
PRIMARY KEY (`stuNo`) )
ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `student` values (31, '张三', 23, '1班');
insert into `student values (32, '李四', 24, '2班');
insert into `student` values (34, '王五', 25, '3班');
insert into `student` values (36, '赵六', 26, '4班');
insert into `student` values (37, '孙琪', 27, '五班');
编写student类
public class Student{
//学号
private int stuNo;
//姓名
private String stuName;
//年龄
private int stuAge;
//年级
private String graName;
public Student(){ }
public Student(int stuNo, String stuName, int stuAge, String graName) {
this.stuNo = stuNo;
this.stuName = stuName;
this.stuAge = stuAge;
this.graName = graName;
}
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo)
{
this.stuNo = stuNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName)
{ this.stuName = stuName; }
public int getStuAge() {
return stuAge;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
public String getGraName() {
return graName;
} public void setGraName(String graName) {
this.graName = graName;
}
//为了方便地输出对象中的内容,重写toString()方法
@Override
public String toString() {
return "学号:"+this.stuNo+"\t姓名:"+this.stuName +"\t年龄:"+this.stuAge+"\t年级:"+this.graName;
}
}
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="mapper.StudentMapper">
<select id="queryStudentByNo" parameterType="int"
resultType="xxx.entity.Student">
select * from student where stuNo=#{stuNo}
</select>
</mapper>
说明:在 SQL 映射文件中,SQL 语句(如 select * from …)的最后一般不加分号 “;”。
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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver"
value="com.mysql.cj.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/MyBatisDemo?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="" />
</dataSource>
</environment>
</environments>
<!-- 在配置文件(mybatis-config.xml)中注册SQL映射文件(StudentMapper.xml)-->
<mappers>
<mapper resource="mapper/StudentMapper.xml" />
</mappers>
</configuration>
TestMyBatis.java 代码如下。
import ...
public class TestMyBatis {
@Test
public void testStudent() throws IOException {
String resource = "mybatis-config.xml";
//加载 MyBatis 的配置文件
Reader reader = Resources.getResourceAsReader(resource);
//创建 SqlSession 的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建能够执行 SQL 映射文件中 SQL 语句的 SqlSession 对象
SqlSession session = sessionFactory.openSession();
//指定 SQL 语句对应的标识字符串:namespace+id
String statement = "mapper.StudentMapper.queryStudentByNo";
//执行查询,返回一个学号为 32 的 Student 对象
Student student = session.selectOne(statement, 32);
System.out.println(student);
session.close();
}
}