2.1 入门案例
MyBatis 开发准备
搭建 MyBatis 开发环境,实现第一个案例
2.1.1 使用 Mybatis
准备 下载 mybatis https://github.com/mybatis/mybatis-3/releases
2.1.2 搭建 MyBatis 开发环境
(1) 创建 mysql 数据库和表 数据库名 ssm ;表名 student
(2) 创建 maven 工程
在pom.xml文件中添加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>org.example</groupId> <artifactId>Mybatis-01</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> <!--Mybatis依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.1</version> </dependency> <!--Mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> </dependency> <!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <!--资源插件,处理src/main/java目录中的xml文件--> <resources> <resource> <directory>src/main/java</directory><!--所在的目录--> <includes><!--包括目录下的.properties,.xml 文件都会扫描到--> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> </project>
编写一个与数据库属性一致的实体类对象
package org.example.domain; public class Student { private Integer id; private String name; private String email; private Integer age; public Integer getId() { return id; } public String getName() { return name; } public String getEmail() { return email; } public Integer getAge() { return age; } public void setId(Integer id) { this.id = id; } public void setName(String name) { this.name = name; } public void setEmail(String email) { this.email = email; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "学生信息{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + ", age=" + age + '}'; } }
编写Dao接口StudentDao
package org.example.Dao; import org.example.domain.Student; import java.util.List; public interface StudentDao { //查询一个学生 Student selectStudentById(Integer id); }
编写Dao接口Mapper映射文件StudentDao.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:必须有值,自定义的唯一字符串 推荐使用:dao接口的全限定名 --> <mapper namespace="org.example.Dao.StudentDao"> <!-- <select>: 表示查询数据, 标签中必须是 select 语句 id: sql 语句的自定义名称,推荐使用 dao 接口中方法名称, 使用名称表示要执行的 sql 语句 resultType: 告诉mybatis,执行sql语句,把数据赋值给哪个类型的java对象。 resultType的值现在使用的java对象的全限定名称 --> <select id="selectStudentById" resultType="org.example.domain.Student"> <!--要执行的sql语句--> select * from Student where id = #{StudentId} </select> </mapper> <!-- 1.约束文件: http://mybatis.org/dtd/mybatis-3-mapper.dtd 约束文件的作用:定义和限制当前文件中可以使用的标签和属性,以及标签出现的顺序 2.mapper是根标签 namespace是命名空间,必须有值,自定义的唯一字符串 推荐使用:dao接口的全限定名 作用:参与识别sql语句的作用 3.在mapper里面可以写<insert><update><delete><select> <insert>里面是<insert>语句,表示执行insert操作 <update>里面是<update>语句 <delete>里面是<delete>语句 <select>里面是 <select>语句 -->
创建Mybatis主配置文件
项目 src/main 下创建 resources 目录,设置 resources 目录为 resources root
创建主配置文件:名称为 mybatis.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"/> <!--配置数据源:创建Connection对象--> <dataSource type="POOLED"> <!--driver:驱动内容--> <property name="driver" value="com.mysql.jdbc.Driver"/> <!--链接数据库的url--> <property name="url" value="jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="xxxxx"/> </dataSource> </environment> </environments> <!-- 指定其他mapper文件的位置 其他mapper文件的目的是找到其他文件的sql语句 --> <mappers> <!-- 使用mapper的resource属性指定的mapper文件的路径 这个路径是从target/classes路径开启的 使用注意: resource=“mapper文件的路径,使用/分割路径” 一个mapper resource指定一个mapper文件 --> <mapper resource="org/example/Dao/StudentDao.xml"/> </mappers> </configuration>
创建测试类MybatisTest
package org.example; 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.example.domain.Student; import org.junit.Test; import java.io.IOException; import java.io.InputStream; public class MyTest { @Test public void testSelectStudentById() throws IOException { //调用Mybatis某个对象的方法,执行Mapper文件的sql语句 //Mybatis核心类:SqlSessionFactory //1.定义Mybatis主配置文件的位置,从类路径开始的相对路径 String config = "Mybatis.xml"; //2.读取主配置文件,使用Mybatis框架中的Resource类 Resources使用的是import org.apache.ibatis.io.Resource InputStream in = Resources.getResourceAsStream(config); //3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuilder类的build(Inputstream)方法 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //4.获取SqlSession对象 SqlSession session = factory.openSession(); //5.指定要执行的Sql语句id //sql的id = namespace+“.”+select|update|insert|delete标签的id属性值 String sqlId = "org.example.Dao.StudentDao"+"."+"selectStudentById"; //6.通过SqlSession的方法,执行sql语句 Student student = session.selectOne(sqlId); System.out.println("使用Mybatis查询一个学生:"+student); //7.关闭SqlSession对象 session.close(); } @Test public void testSelectStudentById2() throws IOException { //调用Mybatis某个对象的方法,执行Mapper文件的sql语句 //Mybatis核心类:SqlSessionFactory //1.定义Mybatis主配置文件的位置,从类路径开始的相对路径 String config = "Mybatis.xml"; //2.读取主配置文件,使用Mybatis框架中的Resource类 Resources使用的是import org.apache.ibatis.io.Resource InputStream in = Resources.getResourceAsStream(config); //3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuilder类的build(Inputstream)方法 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //4.获取SqlSession对象 SqlSession session = factory.openSession(); //5.指定要执行的Sql语句id //sql的id = namespace+“.”+select|update|insert|delete标签的id属性值 String sqlId = "org.example.Dao.StudentDao"+"."+"selectStudentById"; //6.通过SqlSession的方法,执行sql语句 Student student = session.selectOne(sqlId,1002); System.out.println("使用Mybatis查询一个学生:"+student); //7.关闭SqlSession对象 session.close(); } }
运行结果
配置日志功能
mybatis.xml 文件加入日志配置,可以在控制台输出执行的 sql 语句和参数
在Myybatis.xml文件中<configuration>标签中加入
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
再次运行,查看结果
2.1.3 insert 操作
(1) StudentDao 接口中增加方法
int insertStudent(Student student);
(2) StudentDao.xml 加入 sql 语句
<!--添加操作insert 传入Mybatis是一个java对象,使用#{属性名}来获取属性的值 属性值放到#{}占位符的位置,Mybatis执行此属性,对应的getXXX() 例如#{id},执行getID(); --> <insert id="insertStudent"> insert into student(id,name,email,age) values (#{id},#{name},#{email},#{age}) </insert>
(3) 增加测试方法
@Test public void testInsert() throws IOException { String config = "Mybatis.xml"; InputStream in = Resources.getResourceAsStream(config); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); SqlSession session = factory.openSession(); //5.指定要执行的Sql语句id //sql的id = namespace+“.”+select|update|insert|delete标签的id属性值 String sqlId = "org.example.Dao.StudentDao"+"."+"insertStudent"; //6.通过SqlSession的方法,执行sql语句 Student student = new Student(); student.setId(1003); student.setName("王五"); student.setEmail("789@163.com"); student.setAge(20); int rows = session.insert(sqlId,student); //7.提交事务 session.commit(); System.out.println("增加记录行数"+rows); //8.关闭SqlSession对象 session.close(); }
查看结果
注意:不能添加相同的数据,否则会报错