前言
1.三层架构
mvc:在web开发中,使用mvc架构模式。m:数据,v:视图,c:控制器
c:接收请求,调用service对象,显示请求的处理结果。当前使用servlet作为控制器
v: 现在使用的是jsp,html,js。显示请求处理结果,把m中的数据显示出来
m:数据来自mysql,文件,来自网络。
mvc作用:(1)实现解耦合(2)让各模块各负其责(3)系统扩展性更好
三层架构:
1.界面层(视图层):接收用户请求,调用service,显示请求的处理结果。包含了jsp,html,servlet等对象。在control包下。
2.业务逻辑层:处理业务逻辑,使用算法处理数据,把数据返回给页面,对应的是service包,和包中很多XXXXservice类。
3.持久层;访问数据库,或者读取文件,或者访问网络获取数据。有很多XXXdao。
2.三层架构请求的处理流程
用户发起请求--->界面层--->业务逻辑层-->访问持久层---->数据库
概述
高级的JDBC,解决JDBC的缺点。
(1)注册驱动
(2)创建connecion,statement,resultset
(3)执行sql语句,得到Resultset
(4)处理resultset,把记录集中数据转为java对象,同时还能把java对象放入List集合
(5)关闭资源
(6)实现sql语句于java代码解耦合(JDBC是用java代码放在一起,业务也是在jdbc中编写)
mybaits不需要关注于JDBC的六步编程,因为框架中以及帮你编写好了,你只需要关注于sql语句编写
Mybatis官网文档:mybatis – MyBatis 3 | 入门
Mybatis入门
(1)建立数据表
(2)创建maven项目
(3)修改pom.xml:加入依赖mybatis,mysql,junnit,加入资源插件:
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到
->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!-- filtering选项 false不启用过滤器, *.property已经起到过
滤的作用了 -->
<filtering>false</filtering>
</resource>
</resources>
</build>
(4)创建实体类Student,定义属性,属性名和列名一致
package com.bjp.domain;
public class Student {
private Integer id;
private String name;
private String email;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
", age=" + age +
'}';
}
}
(5)创建Dao接口,定义操作数据库方法。
package com.bjp.dao;
import com.bjp.domain.Student;
public interface StudentDao {
//查询一个学生
Student selectstudentById(Integer id);
}
(6)创建xml文件(mapper文件),写sql语句,mybatis推荐java代码和sql语句相分离,把mapper文件定义和dao接口在同一目录。一个表一个mapper文件(接口名.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.bjp.dao.StudentDao"><!--mapper是根标签,namespace是命名空间不能为空,唯一值,推荐使用dao接口的全限定名称。
参与识别sql语句的作用
在mapper里面可以写insert,update,delete,select标签-->
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
<select id="selectstudentById" resultType="com.bjp.domain.Student"><!--select标签表示查询操作,里面是select语句
id:要执行sql语句的唯一标识,是一个自定义的字符串,推荐使用dao中方法名称
resultttype:告诉mybatis,执行sql语句,把数据赋值给那个类型的Java对象,使用的是java对象的全限定名称
把执行sql语句执行结果变成java对象-->
select id,name,email from student where id = 1001
</select>
</mapper>
(6)创建mybatis的主配置文件(xml)文件
(1)定义创建连接实例的数据源(datasource)对象
(2)指向其他mapper文件的位置
<?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">
<!--注册驱动-->
<property name="driver" value="${com.mysql.jdbc.Driver"/>
<property name="url" value="${jdbc:mysql://localhost:3306/ssm}"/>
<property name="username" value="${root}"/>
<property name="password" value="${root}"/>
</dataSource>
</environment>
</environments>
<!--指定其他mapper文件的位置,目的是找到其他文件sql语句-->
<mappers>
<!--resource值是路径,不是全限定名称-->
<mapper resource="D:\BaiduNetdiskDownload\ch01-first\src\main\java\com\bjp\dao\StudentDao.xml"/>
</mappers>
</configuration>
(7)创建测试内容
使用main方法,测试mybatis访问数据库
也可以使用junit访问数据库
@Test
public void testSelectstudentId() throws IOException {
String resource = "src/main/resources/MyBatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
Student blog = (Student) session.selectOne("com.bjp.dao.StudentDao.selectstudentById", 101);
//mapper文件中namespace.select|update|insert|标签的id属性值
}finally {
SqlSession.close();
}
}
占位符
#{studentId}就是用java中传入的值替代#{studentId}。
<?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.bjp.dao.StudentDao"><!--mapper是根标签,namespace是命名空间不能为空,唯一值,推荐使用dao接口的全限定名称。
参与识别sql语句的作用
在mapper里面可以写insert,update,delete,select标签-->
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
<select id="selectstudentById" resultType="com.bjp.domain.Student"><!--select标签表示查询操作,里面是select语句
id:要执行sql语句的唯一标识,是一个自定义的字符串,推荐使用dao中方法名称
resultttype:告诉mybatis,执行sql语句,把数据赋值给那个类型的Java对象,使用的是java对象的全限定名称
把执行sql语句执行结果变成java对象-->
select id,name,email from student where id = #{studentId}
</select>
</mapper>
@Test
public void testSelectstudentId() throws IOException {
String resource = "src/main/resources/MyBatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
Student blog = (Student) session.selectOne("com.bjp.dao.StudentDao.selectstudentById", 101);
//mapper文件中namespace.select|update|insert|标签的id属性值
传入101从java代码
}finally {
SqlSession.close();
}
}
概念
//mybaits是默认手工提交事务,insert,delete,update要加session.commit
自动提交
手动提交
Mybaits的逆向工程
之前的第一个例子就是正向工程,通过数据表创建javabean,然后通过mapper接口定义操作数据库的方法,主配置文件等。现在逆向工程是通过数据表,直接自动生成这些。
快速开始一个逆向工程:MyBatis逆向工程记录【IDEA + MySQL8.0.19】_AlaGeek的博客-CSDN博客.
mybaits与spring整合
mybaits与spring整合需要spring-mybaits整合包,三者有版本配对要求。
spring需要以下包:
mybaits需要:msql的jar包,和mybaits包。
整合需要:mybatis-spring包。