Mybstis学习笔记
三层架构:
三层架构 | 作用 | 对应的包 | 类中的交互 | 处理的框架 |
页面层 | 和用户打交道,接收用户请求参数 | Controller包(servlet) | 用户使用界面 | Servlet——SpringMVC框架 |
业务逻辑层 | 传递数据,计算逻辑、调用数据库、获取数据 | Service包(XXXservice类) | 业务逻辑层 | Service类——spring框架 |
数据访问层 | 访问数据库,执行操作 | Dao包(XXXDao类) | 数据访问层(持久层) | Dao层——mybatis框架 |
框架就是一个模板(提供基础功能的平台),半成品的软件
Mybatis框架(sql映射框架),代码在github
1)sql mapper:SQL映射
可以把数据库中的一行数据,映射成一个java对象
2)Data Access Object(DAOs):数据访问,增删改查
Mybatis是什么?
Mybatis是一个SQL映射框架,提供数据库的操作能力,增强JABC,
Mybatis让开发人员集中精神写Sql就可以了,不必关系connection、statement、resultSet的创建,销毁,sql执行
中文解释文档
https://mybatis.org/mybatis-3/zh/getting-started.html
一、创建数据库与表
1.创建数据库,并添加数据:(这里我用的是mysql)
二、在idea中创建maven工程
1.在Idea中创建maven项目
(1)、点击File,选择New,再点击Project
(2)、具体看图,选择maven-archetype-webapp了
(3).写maven的坐标,“groupId”,“artifactId”,以及“version”,其中groupId是公司域名的反写,而artifactId是项目名或模块名,version就是该项目或模块所对应的版本号,填写完之后,点击【Next】
(4)、配置maven信息,具体操作如下图
出现错误:
Could not transfer metadata org.apache.maven.plugins:maven-archetype-plugin/maven-metadata.xml fro
三、实现步骤
(一)、准备工作
1.导入 mysql驱动
适合萌新-超详细 在IDEA中导入mysql驱动_wangyc1234的博客-CSDN博客
2.加入maven的mybatis坐标,mysql驱动的坐标
<!--mybatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--mySQL的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
</dependency>
出现错误:
Cannot resolve plugin org.apache.maven.plugins:maven-war-plugin
解决:
IDEA日常填坑:Cannot resolve plugin org.apache.maven.plugins:maven-war-plugin_^Being^-CSDN博客
3.创建实体类,student——保存表中的一行数据的
package com.dyxpowernode.domain;
//推荐和表名一致
public class Student {
//定义属性,要求属性名和类名保存一致
public Integer id;
public String name;
public String email;
public Integer 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;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
public Integer getAge() {
return age;
}
@java.lang.Override
public java.lang.String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
", age=" + age +
'}';
}
}
4.创建持久层的dao接口——定义操作数据库的方法
package com.dyxpowernode.dao;
import com.dyxpowernode.domain.Student;
//这是一个接口
public interface StudentDao {
//查询student表的所有数据
public List<Student> selectStudents();
}
5.创建一个mybatis使用的配置文件:
叫做sql映射文件:写SQL语句的,一般一个表一个sql映射文件。这个文件是xml文件
1.在接口所在的目录中
2.文件的名称和接口保持一致
( )
<?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.dyxpowernode.dao.StudentDao">
<!--
select:表示查询操作,
id:是你要执行的sql语句的唯一标识,mybatis会使用这个id的值来查找要执行的sql语句,可以自定义,但是要求接口中的方法名称
resultType:表示结果类型的是sql执行后得到的ResulSet,遍历这个ResulSet得到的java对象的类型
值写的是类型的全限定名称
-->
<select id="selectStudents" resultType="com.dyxpowernode.domain.Student">
select id,name,email,age from student order by id
</select>
</mapper>
<!--
sql映射文件写SQL语句的,mybatis会执行这些SQL
1.指定约束文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
mybatis-3-mapper.dtd是约束文件的名称
2.约束文件的作用:
用来限制和检查在当前文件中出现的标签、属性必须符合mybatis中定义的规则
3.mapper是当前文件的根标签
namespace是命名空间,课自定义,要求使用dao接口的全限定名称
4.当前文件中可以使用特定的标签,表示数据的特定操作
<select>:执行查询
<update>:表示执行更新数据库的操作,也就是说在update标签中,写的是SQL语句
<insert>:表示插入为,放入的是insert语句
<delete>:表示删除,执行delete语句
-->
6.创建一个mybatis的主配置文件:
一个项目就一个主配置文件 主配置文件提供了数据库的连接信息和SQL映射文件的位置信息
在src.main.resources下创建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="com.dyx.dao.StudnetDao">
<!-- <select id="selectBlog" resultType="Blog"> 1一个接口对应一个 sql的id,2 数据库名没改
select * from Blog where id = #{id}
</select>-->
<!--
select:表示查询操作,
id:是你要执行的sql语句的唯一标识,mybatis会使用这个id的值来查找要执行的sql语句,可以自定义,但是要求接口中的方法名称
resultType:表示结果类型的是sql执行后得到的ResulSet,遍历这个ResulSet得到的java对象的类型
值写的是类型的全限定名称
-->
<select id="selectStudents" resultType="com.dyx.daomain.Student">
select id,name,email,age from student order by id
</select>
<!--插入操作-->
<insert id="insertStudent" >
insert into student values (#{id},#{name},#{email},#{age})
</insert>
</mapper>
<!--
sql映射文件写SQL语句的,mybatis会执行这些SQL
1.指定约束文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
mybatis-3-mapper.dtd是约束文件的名称
2.约束文件的作用:
用来限制和检查在当前文件中出现的标签、属性必须符合mybatis中定义的规则
3.mapper是当前文件的根标签
namespace是命名空间,课自定义,要求使用dao接口的全限定名称
4.当前文件中可以使用特定的标签,表示数据的特定操作
<select>:执行查询
<update>:表示执行更新数据库的操作,也就是说在update标签中,写的是SQL语句
<insert>:表示插入为,放入的是insert语句
<delete>:表示删除,执行delete语句
-->
点击运行
运行后生成的
在pom.xml中加入
<!--在build内-->
<build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
出现错误:
Unrecognised tag: 'mirror' (position: START_TAG seen ...</mirror>
解决:
配置maven镜像不起作用 Unrecognised tag: 'mirror' (position: START_TAG seen ...</mirror> - 简书
在mybatis.xml中更改(可以指定多个)
7、创建工具类
package com.dyx.utils;
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 java.io.IOException;
import java.io.InputStream;
public class MyBatisUtils {
public static SqlSessionFactory factory = null;
static {
String config="mybatis.xml";//需要和你的项目中的文件名一致
try {
InputStream in = Resources.getResourceAsStream(config);
//创建SQLSessionFactory对象,使用SQLSessionFactoryBuilder
factory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取SqlSession的方法
public static SqlSession getSqlSession(){
SqlSession sqlSession = null;
if(factory != null){
sqlSession = factory.openSession();//非自动提交事务
}
return sqlSession;
}
}
(二)、显示,增加,删除,
package com.dyx.dao;
public interface StudnetDao {
//显示方法
java.util.List<com.dyx.daomain.Student> selectStudents();
//添加方法
int insertStudent(com.dyx.daomain.Student student);
}
显示、添加
package com.dyx;
import com.dyx.dao.StudentDao;
import com.dyx.pojo.Student;
import com.dyx.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class TestMyBatis {
@Test
public void testSelectStudents(){
/**
* 使用mybatis的动态代理机制,使用SQLSession.getMapper(dao接口)
*/
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
//调用dao方法,来执行数据库的操作
List<Student> students = dao.selectStudents();
for(Student stu: students) {
System.out.println("学生="+stu);
}
}
@Test
public void testInsertStudent(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
//调用dao方法,来执行数据库的操作
Student student = new Student();
student.setId(1008);
student.setName("张飞");
student.setEmail("zhangfei@qq.com");
int nums = dao.insertStudent(student);
sqlSession.commit();
System.out.println("添加对象的数量:"+nums);
}
}