这是mybatis官方文档https://mybatis.org/mybatis-3/zh/configuration.html

第一个例子

Mybatis实现步骤

  1. 创建mysql数据库和表
  2. 创建maven工程
  3. 修改pom.xml

1)加入依赖:mybatis依赖、MySQL驱动、junit
2)在加入资源插件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.fawde</groupId>
  6. <artifactId>ch01-mybatis-first</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <properties>
  9. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  10. <maven.compiler.source>1.8</maven.compiler.source>
  11. <maven.compiler.target>1.8</maven.compiler.target>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>4.11</version>
  18. <scope>test</scope>
  19. </dependency>
  20. <!--mybatis依赖-->
  21. <dependency>
  22. <groupId>org.mybatis</groupId>
  23. <artifactId>mybatis</artifactId>
  24. <version>3.5.1</version>
  25. </dependency>
  26. <!--mysql驱动-->
  27. <dependency>
  28. <groupId>mysql</groupId>
  29. <artifactId>mysql-connector-java</artifactId>
  30. <version>5.1.9</version>
  31. </dependency>
  32. </dependencies>
  33. <build>
  34. <!--资源插件,处理src/main/java目录中的xml-->
  35. <resources>
  36. <resource>
  37. <directory>src/main/java</directory><!--所在的目录-->
  38. <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
  39. <include>**/*.properties</include>
  40. <include>**/*.xml</include>
  41. <include>*.xml</include>
  42. </includes>
  43. <filtering>false</filtering>
  44. </resource>
  45. </resources>
  46. </build>
  47. </project>
  1. 创建实体类,定义属性,属性名和列明保持一致 ```java package com.fawde.domain;

public class Student { // 属性名和列名一样 private Integer id; private String name; private String email; private Integer age; // set ,get , toString

  1. public Integer getId() {
  2. return id;
  3. }
  4. public String getName() {
  5. return name;
  6. }
  7. public String getEmail() {
  8. return email;
  9. }
  10. public Integer getAge() {
  11. return age;
  12. }
  13. public void setId(Integer id) {
  14. this.id = id;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public void setEmail(String email) {
  20. this.email = email;
  21. }
  22. public void setAge(Integer age) {
  23. this.age = age;
  24. }
  25. @Override
  26. public String toString() {
  27. return "学生实体信息{" +
  28. "id=" + id +
  29. ", name='" + name + '\'' +
  30. ", email='" + email + '\'' +
  31. ", age=" + age +
  32. '}';
  33. }

}

  1. 5. 创建Dao接口,定义操作数据库的方法。
  2. ```java
  3. package com.fawde.dao;
  4. import com.fawde.domain.Student;
  5. import java.util.List;
  6. public interface StudentDao {
  7. //查询一个学生
  8. Student selectStudentById(Integer id);
  9. //public List <Student> selectStudents();
  10. //添加学生
  11. //返回值int:表示本次操作影响的数据库的行数
  12. int insertStudent(Student student);
  13. }
  1. 创建xml文件(mapper文件),写sql语句。

1)mybatis框架推荐把sql语句和Java代码分开
2) mapper文件:定义和dao接口在同一个目录,一个表一个mapper文件
image.png

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!-- namespace :必须有值,自定义的唯一字符串
  6. 推荐使用: dao 接口的全限定名称 -->
  7. <mapper namespace="com.fawde.dao.StudentDao">
  8. <!-- <select>: 查询数据, 标签中必须是 select 语句
  9. id: 唯一标识,sql 语句的自定义名称,推荐使用 dao 接口中方法名称,
  10. 使用名称表示要执行的 sql 语句
  11. resultType: 告诉mybatis,执行sql语句,把数据赋值给哪个类型的java对象。
  12. resultType的值现在使用的是Java对象全限定类名 -->
  13. <select id="selectStudentById" resultType="com.fawde.domain.Student">
  14. <!--要执行的 sql 语句,查询一个学生 -->
  15. <!--注意是没有分号的
  16. #{studentId}:占位符,表示从Java程序中传入过来的数据
  17. -->
  18. select id,name,email,age from student where id = #{studentId}
  19. </select>
  20. <!--添加insert-->
  21. <insert id="insertStudent">
  22. insert into student values(1003,"lifeng","lifeng@qq.com",26)
  23. </insert>
  24. </mapper>
  25. <!--
  26. 1.约束文件
  27. http://mybatis.org/dtd/mybatis-3-mapper.dtd
  28. 约束文件作用:定义和限制当前文件中可以使用的标签和属性吗,以及标签出现的顺序。
  29. 2.mapper是根标签,
  30. namespace:命名空间,必须有值,不能为空,唯一值。
  31. 推荐使用Dao接口的全限定名称。
  32. 作用:参与识别sql语句的作用。
  33. 3.在mapper的里面可以写<insert>,<update>,<delete>,<select>
  34. <insert>里面是insert语句,他表示执行insert操作......
  35. -->
  1. 创建mybatis的主配置文件(XML文件):有一个,放在resources目录下

1)定义创建连接实例的数据源(DataSource)对象
2)指定其他mapper文件的位置

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--设置日志-->
  7. <settings>
  8. <setting name="logImpl" value="STDOUT_LOGGING"/>
  9. </settings>
  10. <environments default="mydev">
  11. <environment id="mydev">
  12. <transactionManager type="JDBC"/>
  13. <!--配置数据源,创建Connection对象-->
  14. <dataSource type="POOLED">
  15. <property name="driver" value="com.mysql.jdbc.Driver"/>
  16. <property name="url" value="jdbc:mysql://localhost:3306/sqlearn?useUnicode=true&amp;characterEncoding=utf-8"/>
  17. <property name="username" value="root"/>
  18. <property name="password" value=""/>
  19. </dataSource>
  20. </environment>
  21. </environments>
  22. <!--指定其他mapper文件的位置;
  23. 其他mapper文件目的是找到其他文件的sql语句-->
  24. <mappers>
  25. <!--使用mapper的resource属性指定mapper文件的路径。
  26. 这个路径是从target/calsses路径开启的
  27. 使用注意:
  28. resource=“mapper文件的路径,使用/分割路径”
  29. 一个mapper resource指定一个mapper文件
  30. -->
  31. <mapper resource="com/fawde/dao/StudentDao.xml"/>
  32. </mappers>
  33. </configuration>
  1. 创建测试的内容。

1) 使用main方法,测试mybatis访问数据库
2) 也可以使用junit访问数据库

  1. package com.fawde;
  2. import com.fawde.domain.Student;
  3. import org.apache.ibatis.io.Resources;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  7. import org.junit.Test;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.util.List;
  11. public class MyTest {
  12. //测试mybatis执行sql语句
  13. @Test
  14. public void testSelectStudentById() throws IOException {
  15. //访问mybatis读取student数据
  16. //1.定义mybatis主配置文件的名称, 从类路径的根开始(target/clasess)
  17. String config="mybatis.xml";
  18. //2.读取这个config表示的文件
  19. InputStream in = Resources.getResourceAsStream(config);
  20. //3.创建了SqlSessionFactoryBuilder对象
  21. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  22. //4.创建SqlSessionFactory对象
  23. SqlSessionFactory factory = builder.build(in);
  24. //5.获取SqlSession对象,从SqlSessionFactory中获取SqlSession
  25. SqlSession sqlSession = factory.openSession();
  26. //6.【重要】指定要执行的sql语句的标识。
  27. // sql映射文件中的namespace + "." + select|update|insert|delete标签的id值
  28. //String sqlId = "com.bjpowernode.dao.StudentDao" + "." + "selectStudents";
  29. String sqlId = "com.fawde.dao.StudentDao.selectStudentById";
  30. //7. 重要】执行sql语句,通过sqlId找到语句
  31. // List<Student> studentList = sqlSession.selectList(sqlId);
  32. Student stu=sqlSession.selectOne(sqlId,1002);
  33. System.out.println("使用mybatis查询的一个学生:"+stu);
  34. //8.关闭SqlSession对象
  35. sqlSession.close();
  36. }
  37. @Test
  38. public void testInsertStudentById() throws IOException {
  39. String config="mybatis.xml";
  40. InputStream in = Resources.getResourceAsStream(config);
  41. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  42. SqlSessionFactory factory = builder.build(in);
  43. SqlSession sqlSession = factory.openSession();
  44. String sqlId = "com.fawde.dao.StudentDao.insertStudent";
  45. int stu=sqlSession.insert(sqlId);
  46. System.out.println("使用mybatis新增的一个学生,rows="+stu);
  47. sqlSession.close();
  48. }
  49. }

Mybatis的一些重要对象

Resources类

  1. Resources mybatis框架中的对象, 负责读取主配置文件
  1. InputStream in = Resources.getResourceAsStream("mybatis.xml");

SqlSessionFactoryBuilder

SqlSessionFactoryBuilder : 创建SqlSessionFactory对象

  1. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  2. //创建SqlSessionFactory对象
  3. SqlSessionFactory factory = builder.build(in);

SqlSessionFactory : 重量对象

SqlSessionFactory 是重量级对象, 程序创建一个对象耗时比较长,使用资源比较多。在整个项目中,有一个就够用了。

  1. public interface SqlSessionFactory {
  2. SqlSession openSession();
  3. SqlSession openSession(boolean var1);
  4. SqlSession openSession(Connection var1);
  5. SqlSession openSession(TransactionIsolationLevel var1);
  6. SqlSession openSession(ExecutorType var1);
  7. SqlSession openSession(ExecutorType var1, boolean var2);
  8. SqlSession openSession(ExecutorType var1, TransactionIsolationLevel var2);
  9. SqlSession openSession(ExecutorType var1, Connection var2);
  10. Configuration getConfiguration();
  11. }


SqlSessionFactory:接口 , 它的接口实现类是 DefaultSqlSessionFactory
image.png
SqlSessionFactory作用: 获取SqlSession对象。SqlSession sqlSession = factory.openSession();

openSession()方法说明:
1. openSession() :无参数的, 获取是非自动提交事务的SqlSession对象
2. openSession(boolean): openSession(true) 获取自动提交事务的SqlSession.
openSession(false) 非自动提交事务的SqlSession对象


SqlSession

SqlSession接口 :是通过 SqlSessionFactory获取的。
SqlSession接口的实现类DefaultSqlSession。
image.png
定义了操作数据的方法,用于执行sql语句。

selectOne() 执行sql语句,最多得到一行记录,多于一行是错误的
selectList() 执行sql语句,返回多行数据
selectMap() 执行sql语句,返回一个Map结果
insert() 执行insert语句
update() 执行update语句
delete() 执行delete语句
commit() 提交事务
rollback() 回滚事务
  1. 注意SqlSession对象不是线程安全的,使用的步骤:<br />1)在方法内部使用, 在执行sql语句之前,先使用openSession()获取SqlSession对象。<br />2)调用SqlSession的方法,执行sql语句<br />3 关闭SqlSession对象,执行SqlSession.close().<br /> 这样能保证他的使用是线程安全的。

使用工具类和模板

1)创建模板,mapper文件模板和mybatis主配置文件模板
创建模板的步骤:
image.png
创建模板
image.png
image.png