Mybatis入门(本篇文章是根据官网写的,有兴趣的可以去看看官网)
中文官网地址:https://mybatis.org/mybatis-3/zh/getting-started.html
Mybatis是一款优秀的持久层框架,是基于ORM的半自动轻量级框架,对jdbc的封装,它支持SQL、存储过程以及高级映射。 MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
半自动框架和全自动框架的区别:
-
本质区别:是否需要手动编写sql
-
全自动框架不能对sql进行优化,半自动框架需要手动修改sql所以利于优化。
mybatis是一个轻量级的框架,所谓的轻量级就是在程序运行期间所需要的的消耗资源不是很多。
ORM:(Object Relational Mapping 对象关系映射)
- O:对象模型-实体对象。
- R:关系型数据库的机构模型,数据库表。
- M:映射-将实体对象与数据表建立映射。
M怎么完成映射的:
- M是通过xml和注解对应实体和表
如上面的图,定义ORM框架,首先是在数据库中出创建了一个表,然后在java类中创建实体类,实体类的字段对应数据库表中的列名。然后通过M实现映射,使java中的表可以映射到数据库的表中。后面我们学习的时候就会感受到这个框架的内容。
如上面的图,定义ORM框架,首先是在数据库中出创建了一个表,然后在java类中创建实体类,实体类的字段对应数据库表中的列名。然后通过M实现映射,使java中的表可以映射到数据库的表中。后面我们学习的时候就会感受到这个框架的内容。
在pom.xml文件中导入相关配置
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
version表示的是mybatis的版本,可以自己进行选择。
构建SqlSessionFactory
基于mybatis的应用都是一个以SqlSessionFactory的实例为核心。SqlSessionFactory是基于SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从配置文件或xml配置文件或一个预先配置的Configuration实例来构建出SqlSessionFactory实例。 xml中构建SqlSessionFactory构建factory非常简单,建议使用类路径下的资源进行配置。也可以使用任意的输入流(InputStream)实例。mybatis有一个resource的工具类,包含了一些实用方法,从类路径或其他位置加载资源文件更容易。
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
上面是mybatis官网的代码,resource锁指向的路径是配置文件的路径,在maven中配置路径不需要这么长,只要把xml文件放入到resource文件夹里,可以直接拿取文件不需要那么详细的路径。mybatis-config.xml文件名是可以修改的,只要读取的时候读取对了就行,但是一定要让人见名思议,知道这个文件是做什么的。
xml文件配置了mybatis系统的核心配置,包括获取数据库连接实例的数据源(Datasource)以及决定事务作用于和控制方式的事务管理器(TransactionManager)。
<?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="mysql">
<!--注释使用mysql环境 -->
<environment id="mysql">
<!--使用jdbc类型事务 -->
<transactionManager type="JDBC"></transactionManager>
<!--使用连接池,用来配置数据库连接信息,property中的name属性是固定的,不需要去改 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis_db"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件 -->
<mappers>
<mapper resource="mapper/UsersMapper.xml"/>
</mappers>
</configuration>
xml头部声明,用来验证xml文档正确性。environment元素体包好了事务管理和连接池的配置。mappers元素包含了一组映射器(mapper),这些映射文件包含了sql代码和映射信息。
可以不使用xml构建SqlSessionFactory,从官网中找到。
获取SqlSession
SqlSession提供了数据库执行SQL命令所需要的方法。可以通过SqlSession实例来直接执行已经映射sql语句。
SqlSession session=sqlSessionFactory.openSession();
Blog blog=(Blog)session.selectOne("org.mybatis.example.BlogMapper.selectBlog",1);
selectOne表示查找一个对象,里面的参数1是表示在映射文件中的配置路径,也表示接口中的方法。参数2表示传递的参数。
现在有了一种更加简洁的方法——使用指定语句的参数和返回值相匹配的接口,这样代码不仅清晰而且安全,并且不用担心路径字符出错。
SqlSession session = sqlSessionFactory.openSession();
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
上面getMapper是获取的反射类,是对应映射接口的实现类。第三句直接调用的方法是接口中的方法,可以直接调用查询数据。这个方法比上面的方法要简单的多。
SQL语句实现
在mybatis中映射mysql语句有两种方式,一种是通过xml定义,一种是通过注解方式定义语句。一般来说mybatis可以利用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">
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
如上面的代码,可以配置无数个数据库映射语句。上面的配置信息命名空间为"org.mybatis.example.BlogMapper",在命名空间中定义了一个selectBlog的映射语句。我们可以通过" org.mybatis.example.BlogMapper.selectBlog"来调用映射语句。
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
除了上面的方法,我们还可以尝试下面的方法执行:
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
第二种方法可以直接调用接口中配置的方法,不需要去获取路径,,显然第二种方法是有优势的,它不依赖于字面值,更安全,而且更好的映射到sql语句。
命名空间:
命名空间有两个作用,一是利用更长的限定名将不同的语句隔离开来,二是可以实现接口绑定。一般限定名都是写的类的包名+类名,如上面的BlogMapper类的包路径为org.mybatis.example。我们指定的名字就是"org.mybatis.example.BlogMapper"。下面的语句指定的id就是对应类中的响应的方法名。
命名空间的命名规则:
全限定名–直接用于查找和使用,例如org.mybatis.example.BlogMapper.selectBlog。 短名称-- 如果全局唯一的话可以作为单独引用,如果不唯一可能会产生“短名称不唯一”的错误,这种情况下需要使用全限定名,一般我们都是用全限定名。
上面整体是使用xml配置的sql语句,下面我们使用注解方式来实现注解方式配置sql语句。
package org.mybatis.example;public interface BlogMapper {
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
使用注解方式可以使代码很简洁。但是对于更复杂的语句,注解会有些力不从心,会让注解里的sql语句更加混乱。
作用域和生命周期
SqlSessionFactoryBuilder:
这个类可以被实例化、使用和丢弃,一旦创建了SqlSessionFactory,就不在需要它了。因此SqlSessionFactoryBuilder最佳的作用域就是方法的作用域也就是局部变量。可以重复使用SqlSessionFactoryBuilder来创建多个SqlsessionFactory实例。最好不要一直保留它,以保证所有的xml解析资源可以被释放更多的事情
SqlSessionFactory:
一旦被创建就应该在运行期间一直存在,最好不要丢弃它。SqlSessionFcatory最好不要创建多次。SqlSessionFactory最佳作用域是应用作用域。这一点可以通过单例设计模或工厂设计模式来实现。
SqlSession:
每个线程都有自己的sqlSession实例。SqlSession是线程不安全的,所以不能被共享,所以他的最佳作用域是请求或方法作用域。SqlSession不要放在静态域和实例变量里。也局不能将SqlSession放在任何类型的托管作用域中,比如Servlet的HttpSession。在写SqlSession的时候最好把关闭SqlSesion的语句放在finally中,这样保证每次都能关闭。
映射器实例:
映射器是一些绑定映射语句的接口。映射器接口的实例是从SqlSession获得。技术层面上讲,任何映射器实例的最大作用域与请求他们的Sqlsession相同。但是方法作用域才是映射器实例的最合适的作用域。映射器实例应该在调用他们的方法中被获取,使用完毕后即可丢弃。映射器不需要显示的关闭。尽管在整个请求的作用域保留实例不会有什么问题,但是你会发现,管理太多的sqlsession会让你忙不过来。所以最好将映射器放在方法的作用域中。
从数据库中读取数据的实例:
首先构建项目这里使用的是maven构造内容,否者导包太麻烦了。
创建一个表,这里是ORM中的R
#创建一个数据库
CREATE DATABASE mybatis_db
#切换到创建的数据库中
USE mybatis_db
#创建一个数据表,表中有三个字段
CREATE TABLE users(
id INT,
`name` VARCHAR(50),
grende VARCHAR(20)
)DEFAULT CHARSET=utf8
在pom.xml文件中导入mybatis坐标。
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Mybatis_One</groupId>
<artifactId>com.sang</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--指定编码和版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>1.11</java.version>
<maven.compiler.source>1.11</maven.compiler.source>
<maven.compiler.target>1.11</maven.compiler.target>
</properties>
<dependencies>
<!--mybatis坐标 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!--mysql驱动坐标 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency>
<!--单元测试坐标 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
上面的主要坐标是mybatis坐标,用来操作mybatis的数据命令。
<!--mybatis坐标 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
数据库驱动坐标:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency>
创建实体类用来映射数据库中的数据:
实例类是用来映射数据库中的数据的,封装的每一个字段都是数据库的列名。这就是ORM中的O
public class Users {
//这个字段是和数据库中的字段对应的,也就是数据库中的字段叫什么名字,这里面也叫什么名字
int id;
String name;
String grende;
省略了get/set方法
省略了toString方法
}
创建Mapper.xml用来执行sql语句
建议Mapper.xml取名为数据表的名成+Mapper.xml,例如:Users表名称为UsersMapper.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">
<mapper namespace="">
<!--namespace:命名空间(与id共同确认执行语句的位置),用来指定下面语句操作的路径,一般这里边指定的是包名
resultType:返回类型,表示该语句执行完成后,会返回什么样的类型数据,一般这里是给类的路径,通过反射找到类
id:表示要执行的语句名称,对应指定类路径下的方法
-->
<select id="findAll" resultType="util.Users">
select * from users
</select>
</mapper>
上面介绍了映射SQL语句使用的是xml文件,这里就是通过xml映射实现sql语句。
创建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>
<!--环境配置 -->
<environments default="mysql">
<!--注释使用mysql环境 -->
<environment id="mysql">
<!--使用jdbc类型事务 -->
<transactionManager type="JDBC"></transactionManager>
<!--使用连接池,用来配置数据库连接信息,property中的name属性是固定的,不需要去改 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis_db"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件 -->
<mappers>
<mapper resource="mapper/UsersMapper.xml"/>
</mappers>
</configuration>
上面代码创建了数据库的配置信息内容,比如配置环境(environment)。配置互数据库连接内容(dataSource),以及配置映射文件(mappers)。
测试类
public class UserTest {
@Test
public void testfindAll() throws IOException {
//加载核心配置文件
InputStream in = Resources.getResourceAsStream("SqlMapconfig.xml");
//获取sqlsessionfactory类
SqlSessionFactory bui = new SqlSessionFactoryBuilder().build(in);
//获取sqlsession会话对象
SqlSession os = bui.openSession();
//执行sql语句,参数是Mapper.xml文件中的语句
List<Users> list = os.selectList("com.sang.findAll");
for(Users u:list) {
System.out.println(u);
}
//释放资源
os.close();
}
}
如果有写的不对之处,欢迎指正出来,谢谢