MyBatis学习笔记1
0、什么是MyBatis?
MyBatis它是一款半自动的ORM(Object Relation Mapping,对象关系映射)持久层框架,具有较高的SQL灵活性,动态SQL。(框架就是一个模板,一个软件)
1、MyBatis入门
使用maven构建的实现步骤
- MySQL中创建一个student表
create table
user
.student
(
id
int(10) not null auto_increment comment ‘学号’,
name
VARCHAR(5) not null COMMENT ‘姓名’,
age
VARCHAR(3) not null COMMENT ‘年龄’,
Primary key(id
)
)engine=innodb default charset=utf8
-
把MyBatis和Mysql驱动的坐标放入到maven项目下的POM.xml中
-
创建JAVABean类,名字建议与表名一致(Student),类的属性名与表的列名保持一致
-
创建dao层,dao下建一个StudentDao接口和StudentDao.xml (Sql映射文件)
-
StudentDao.xml (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="com.lcc.dao.StudentDao">
<!--
sql的映射文件 ,一个dao一个sql映射文件
<select>是查询语句。
id:是要执行sql的唯一标识,推荐使用dao接口中的方法。
resultType:告诉MyBatis,执行sql语句,把数据赋值给哪个类型的Java对象
namespace:命名空间,唯一值,使用Dao接口的全限定名
-->
<!--select语句-->
<select id="queryStudents" resultType="com.lcc.pojo.Student">
select id,name,age from user.student order by id
</select>
<!--insert语句-->
<insert id="insertStudent">
insert into user.student values(#{id},#{name},#{age})
</insert>
</mapper>
-
创建一个MyBatis主配置文件 MyBatis.xml ,放到resource目录下
-
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>
<!--控制MyBatis全局行为-->
<settings>
<!--设置MyBatis输出日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--环境配置:数据库的连接信息-->
<environments default="development">
<!--environment 一个数据库的配置环境,
id 唯一标识,自定义,表示环境的名称-->
<environment id="development">
<!--
transactionManager :mybatis的事务类型
type:jdbc(使用jdbc中的connection对象的commit.rollback做事务处理)
-->
<transactionManager type="JDBC"/>
<!--dataSource 数据源,连接数据库的
type 表示数据源的类型 ,POOLED表示使用数据库连接池
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/user?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--指定其他mapper文件的位置,找到其他mapper文件中的sql语句-->
<mappers>
<!--resource属性是指定mapper文件的路径
从target/classes(类路径)开始
D:\javaCode\MyBatisDemo\MyBatis0004\target\classes\(类路径)com\lcc\dao\StudentDao.xml
-->
<mapper resource="com\lcc\dao\StudentDao.xml"/>
</mappers>
</configuration>
- **创建测试类StudentTest
package com.lcc;
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.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class StudentTest{
@Test
public void insert() throws IOException {
//访问MyBatis获取Student数据
//1、定义MyBatis主配置文件的名称,从类路径的根开始()
String config = "MyBatis.xml";
//2、读取Config表示的文件
InputStream resource = Resources.getResourceAsStream(config);
//3、创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
//4、获取SqlSessionFactory对象
SqlSessionFactory sessionFactory = factoryBuilder.build(resource);
//5、【重要】获取SqlSession
SqlSession sqlSession = sessionFactory.openSession();
//6、【重要】指定要执行sql语句的标识,sql映射文件中的namespace+"."+标签的id值(执行的sql标签的id值)
String sqlId = "com.lcc.dao.StudentDao"+"."+"queryStudents";
//7、执行sql,输出sql结果
sqlSession.selectList(sqlId).forEach(stu -> System.out.println(stu));
//8、关闭sqlSession
sqlSession.close();
}
}
3、主要类
- Resources 作用:主要就是读取主配置文件MyBatis.xml
//1、定义MyBatis主配置文件的名称,从类路径的根开始()
String config = "MyBatis.xml";
//2、读取Config表示的文件
InputStream resource = Resources.getResourceAsStream(config);
- SqlSessionFactoryBuilder 作用:使用它的
build()
方法获得SqlSessionFactory
对象
//3、创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
//4、获取SqlSessionFactory对象
SqlSessionFactory sessionFactory = factoryBuilder.build(resource);
- SqlSessionFactory 作用:通过他的openSession()方法获取非自动提交的
SqlSession
对象;当openSession(true)
参数为true时,获取自动提交的SqlSession
对象;当openSession(false)
参数为true时,获取非自动提交的SqlSession
对象
//4、获取SqlSessionFactory对象
SqlSessionFactory sessionFactory = factoryBuilder.build(resource);
//5、(重要)获取SqlSession
SqlSession sqlSession = sessionFactory.openSession();
- SqlSession 接口中定义了操作类的方法,但是SqlSession不是线程安全的,当执行sql之后需要手动关闭
//5、(重要)获取SqlSession对象
SqlSession sqlSession = sessionFactory.openSession();
//6、『重要』指定要执行sql语句的标识,sql映射文件中的namespace+"."+标签的id值(执行的sql标签的id值)
String sqlId = "com.lcc.dao.StudentDao"+"."+"queryStudents";
//7、执行sql,输出sql结果
sqlSession.selectList(sqlId).forEach(stu -> System.out.println(stu));
//8、关闭sqlSession
sqlSession.close();