MyBatis框架基础
Posted 再来半包
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis框架基础相关的知识,希望对你有一定的参考价值。
框架
框架概述
软件开发常用结构
三层架构
三层架构包含的三层:
界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)
三层的职责
1、界面层(表示层、视图层):主要功能是接收用户的数据,显示请求的处理结果。使用web页面和用户交互,手机app也就是表示层的,用户再app中操作,业务逻辑在服务器端处理。(jsp,html,servlet)
2、业务逻辑层:接收表示传递过来的数据,检查数据,计算业务逻辑,调用数据访问层获取数据。
3、数据访问层:与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库中
三层对应的包
界面层:controller包(servlet)
业务逻辑层:service包(XXXService类)
数据访问层:dao包(XXXDao类)
三层的处理请求的交互:
用户–>界面层–>业务逻辑层–>数据访问层–>DB数据库
三层对应的处理框架
界面层----servlet----springmvc(框架)
业务逻辑层----service类----spring(框架)
数据访问层----dao类----mybatis(框架)
框架
框架是一个舞台,一个模板
模板:
1、规定好了一些条款,内容
2、加入自己的东西
框架是一个模板
1、框架中定义好了一些功能,这些功能是可用的。
2、可以加入项目中自己的功能,这些功能可以利用框架中写好的功能。
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种认为,框架是可被应用开发者定制的应用骨架、模板。
简单的说框架其实就是半成品软件,就是一组组件,供你使用完成你自己的系统。从另一个角度来说框架是一个舞台,你在舞台上做表演。在框架基础上加入你要完成的功能。
框架安全的,可复用的,不断升级的软件
框架的特点:
1、框架一般不是全能的,不能做所有事情
2、框架是针对某一个领域有效。特长在某一个方面,比如mybatis做数据库操作强,但是它不能做其他的。
3、框架是一个软件
JDBC的缺陷
1、代码比较多,开发效率低
2、需要关注Connection,Statement,ResultSet对象创建和销毁
3、对ResultSet查询的结果,需要自己封装为List
4、重复的代码比较多些
5、业务代码和数据库的操作混在一起
mybatis框架
一个框架,早期叫做ibatis,代码在github上
mybatis是 MyBatis SQL Mapper Framework for Java (sql映射框架)
1)sql mapper:sql映射
可以把数据库表中的一行数据 映射为一个Java对象。
一行数据可以看做一个Java对象,操作这个对象,就相当于操作表中的数据
2)data access object(DAOs):数据访问,对数据库执行增删改查。
mybatis提供了哪些功能:
1、提供了创建Connection,Statement,ResultSet的能力,不用开发人员创建这些对象了
2、提供了执行sql语句的能力,不用你执行sql
3、提供了循环sql,把sql的结果转为Java对象,List集合的能力
while(rs.next()){
Student stu=new Student();
stu.setId(rs.getInt("id"));
stu.setName(rs.getString("name"));
stu.setAge(rs.getInt("age"));
//从数据库取出数据转为Student对象,封装到List集合
stuList.add(stu);
}
4、提供了关闭资源的能力,不用你关闭Connection,Statement,ResultSet
开发人员做的是:提供sql语句
最后是:开发人员提供sql语句–mybatis处理sql—开发人员得到List集合或Java对象(表中的数据)
总结:
mybatis是一个sql映射框架,提供的数据库的操作能力。增强的JDBC,
使用mybatis让开发人员集中精力写sql就行了,不必关系Connection,Statement,ResultSet的创建,销毁,sql的执行。
mybatis使用步骤
ch01-hello-mybatis:第一个入门的mybatis例子
实现步骤:
1、新建的student表
2、加入maven的mybatis坐标,mysql驱动的坐标
3、创建实体类,Student—保存表中一行数据
4、创建持久层的dao接口,定义操作数据库的方法
5、创建一个mybatis使用的配置文件
叫做sql映射文件:写sql语句的。一般一个表一个sql映射文件
这个文件是xml文件。
1、写在接口所在的目录中,
2、文件名称和接口保持一致
6、创建mybatis的主配置文件:
一个项目就一个主配置文件。
主配置文件提供了数据库的连接信息和sql映射文件的位置信息
7、创建使用mybatis类
通过mybatis访问数据库
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="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{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:是约束文件的名称,扩展名是dtd的。
2、约束文件的作用:限制,检查,在当前文件中出现的标签,属性必须符合mybatis的要求
3、mapper 是当前文件的根标签,必须的
namespace:叫做命名空间,唯一值的,可以自定义的字符串
要求你使用dao接口的全限定名称。(接口的绝对路径)
4、在当前文件中,可以使用特定的标签,表示数据库的特定操作。
<select>
:表示执行查询 , select语句
<update>
:表示更新数据库的操作,就是说在<update>
标签中 写的update sql语句
<insert>
:表示插入,放的是insert语句
<delete>
:表示删除,执行的delete语句
标签中的属性
select表示查询操作
id:你要执行的sql语句的唯一标识,mybatis会使用这个id的值来找到药执行的sql语句可以自定义,但是要求你使用接口中的方法名称。
resultType:表示结果类型的,是sql语句执行后得到的ResulSet,遍历这个ResultSet得到的Java对象的类型
值写的是类型的全限定名称
mybatis主配置文件
<?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"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
mybatis的主配置文件:主要定义了数据库的配置信息,sql映射文件的位置
1、约束文件
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
mybatis-3-config.dtd:约束文件的名称
2、configuration:根标签
环境配置:数据库的连接信息
<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">
<!--driver,user,username,password 是固定的,不能自定义-->
<!--数据库的驱动类名-->
<property name="driver" value="${driver}"/>
<!--连接数据库的url字符串-->
<property name="url" value="${url}"/>
<!--访问数据库的用户名称-->
<property name="username" value="${username}"/>
<!--访问数据库的密码-->
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
default:必须和某个environment的id值一样。告诉mybatis使用哪个数据库的连接信息。访问哪个数据库
<!-- sql mapper(sql映射文件)的位置-->
<mappers>
<!-- 一个mapper标签指定一个文件的位置
从类路径开始的路径信息。 target/clasess(类路径)-->
<mapper resource="com\\hr\\qjb\\dao\\StudentDao.xml"/>
</mappers>
</configuration>
测试类
public class MyApp {
public static void main(String[] args) throws IOException {
//访问mybatis读取student数据
//1、定义mybatis主配置文件的名称,从类路径的根开始
String config="mybatis.xml";
//2、读取这个config表示的文件
InputStream in = Resources.getResourceAsStream(config);
//3、创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//4、创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//5、【重要】创建SqlSession对象,从SqlSessionFactory中获取SqlSession
SqlSession sqlSession =factory.openSession();
//6、指定要执行sql语句的标识。sql映射文件中的namesapce+"."+标签的id值
String sqlId="com.hr.qjb.dao.StudentDao"+"."+"selectStudents";
//7、执行sql语句,通过sqlId找到语句
List<Student> studentList =sqlSession.selectList(sqlId);
//8、输出结果
//for (Student student : studentList) {
//System.out.println(student);
//}
//lambda表达式语法
studentList.forEach(student -> System.out.println(student));
//9、关闭SqlSession对象
sqlSession.close();
}
}
如果xml文件没有到target文件下解决方案
1、第一种:点击右边maven Lifecvcle中的clean清除一下target,再点击compile,编译一下
2、第二种:点击左上角的Build,点击Rebuild project,在执行一下代码
3、第三种:直接将配置文件拷贝到target相应的目录下
查询数据库实例
首先创建Dao接口,并且定义查询方法
StudentDao
public interface StudentDao {
//查询student表的所有数据
public List<Student> selectStudents();
}
创建实体类,用来接收数据库中的每一条数据
Student
//推荐和表名一致,容易记忆
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 +
'}';
}
public Student(Integer id, String name, String email, Integer age) {
this.id = id;
this.name = name;
this.email = email;
this.age = age;
}
public Student() {
}
}
编写StudentDao.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">
<!--3、mapper 是当前文件的根标签,必须的
namespace:叫做命名空间,唯一值的,可以自定义的字符串
要求你使用dao接口的全限定名称。(接口的绝对路径)-->
<mapper namespace="com.hr.qjb.dao.StudentDao">
<!--select表示查询操作
id:你要执行的sql语句的唯一标识,mybatis会使用这个id的值来找到药执行的sql语句可以自定义,但是要求你使用接口中的方法名称。
resultType:表示结果类型的,是sql语句执行后得到的ResulSet,遍历这个ResultSet得到的Java对象的类型
值写的是类型的全限定名称-->
<select id="selectStudents" resultType="com.hr.qjb.domain.Student">
select id,name,email,age from student order by id
</select>
</mapper
配置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">
<!-- mybatis-3-config.dtd:约束文件的名称
2、configuration:根标签
环境配置:数据库的连接信息
-->
<configuration>
<!-- settings:控制mybatis全局行为-->
<settings>
<!-- 设置mybatis输出日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--default:必须和某个environment的id值一样。告诉mybatis使用哪个数据库的连接信息。访问哪个数据库-->
<environments default="mydev">
<!--environment:一个数据库信息的配置,环境
id:一个唯一值,自定义,表示环境的名称-->
<environment id="mydev">
<!--
transactionManager:mybatis的事务类型
type:JDBC(表示使用JDBC中的Connection对象的commit,rollback做事务处理)
-->
<transactionManager type="JDBC"/>
<!--dataSource:表示数据源,连接数据库的
type:表示数据源的类型,POOLED表示使用连接池-->
<dataSource type="POOLED">
<!--driver,user,username,password 是固定的,不能自定义-->
<!--数据库的驱动类名-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--连接数据库的url字符串-->
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
<!--访问数据库的用户名称-->
<property name="username" value="root"/>
<!--访问数据库的密码-->
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- sql mapper(sql映射文件)的位置-->
<mappers>
<!-- 一个mapper标签指定一个文件的位置
从类路径开始的路径信息。 target/clasess(类路径)-->
<mapper resource="com\\hr\\qjb\\dao\\StudentDao.xml"/>
</mappers>
</configuration>
最后测试类
MyApp
public class MyApp {
public static void main(String[] args) throws IOException {
//访问mybatis读取student数据
//1、定义mybatis主配置文件的名称,从类路径的根开始
String config="mybatis.xml";
//2、读取这个config表示的文件
InputStream in = Resources.getResourceAsStream(config);
//3、创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//4、创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//5、【重要】创建SqlSession对象,从SqlSessionFactory中获取SqlSession
SqlSession sqlSession =factory.openSession();
//6、指定要执行sql语句的标识。sql映射文件中的namesapce+"."+标签的id值
String sqlId="com.hr.qjb.dao.StudentDao.selectStudents";
//7、执行sql语句,通过sqlId找到语句
List<Student> studentList =sqlSession.selectList(sqlId);
//8、输出结果
//lambda表达式语法
studentList.forEach(student -> System.out.println(student));
//9、关闭SqlSession对象
sqlSession.close();
}
}
重要的是获得SqlSession对象,通过用SqlSession对象中的方法去获得查询结果
插入数据库实例
首先接口类中定义插入方法
//插入方法
//参数student,表示要插入到数据库的数据
//返回值:int , 表示执行insert操作后的 影响数据库的行数
public int insertStudent(Student student);
在StudentDao.xml中的配置文件中加入插入语句
values中的参数是Student类中的属性,用#{xxx}包起来
<!-- 插入操作-->
<insert id="insertStudent">
insert into student values(#{id},#{name},#{email},#{age});
</insert>
下面时测试类
TestMyBatis
public class TestMyBatis {
public static void main(String[] args) throws IOException {
//访问mybatis读取student数据
//1、定义mybatis主配置文件的名称,从类路径的根开始
String config="mybatis.xml";
//2、读取这个config表示的文件
InputStream in = Resources.getResourceAsStream(config);
//3、创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//4、创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//5、【重要】创建SqlSession对象,从SqlSessionFactory中获取SqlSession
SqlSession sqlSession =factory.openSession();
//6、指定要执行sql语句的标识。sql映射文件中的namesapce+"."+标签的id值
String sqlId="com.hr.qjb.dao.StudentDao.insertStudent";
//创建Student实体类对象,为属性赋值,可以用有参构造器,也可以用set方法
Student student = new Student(1005,"张飞","zhangfei@qq.com",1200);
//返回的参数是影响的行数,参数sqlId是方法的路径,student是传入的sql语句中的参数
int nums = sqlSession.insert(sqlId, student);
//默认以上是关于MyBatis框架基础的主要内容,如果未能解决你的问题,请参考以下文章
Spring+SpringMVC+MyBatis+Maven框架整合
MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段