idea创建mysql映射文件_Mybatis从浅入深(IDEA版通俗易懂)

抱怨是一件最没意义的事情。如果实在难以忍受周围的环境,那就暗自努力练好本领,然后跳出那个圈子。你好,我是梦阳辰,快来和我一起学习吧!

引入

1.三层架构

界面层:和用户打交道的,接收用户的请求参数,显示处理结果的。(jsp , htnml , servlet)

业务逻辑层:接收了界面层传递的数据,计算逻辑,调用数据库,获取数据

数据访问层:就是访问数据库,执行对数据的查询,修改,删除等等的。

三层对应的包

界面层:controller包( servlet)

业务逻辑层:service包(xxxservice类)

数据访问层:dao包(xxxDao类)

三层中类的交互

用户使用界面层–>业务逻辑层—>数据访问层(持久层)–>数据库(mysql)

三层对应的处理框架

界面层—servlet—springmvc(框架)

业务逻辑层—service类–spring(框架)

数据访问层—dao类–mybatis (框架)

模版:

1、规定了好一些条款,内容-2.加入自己的东西

框架是一个模块

1.框架中定义好了一些功能。这些功能是可用的

2.可以加入项目中自己的功能,这些功能可以利用框架中写好的功能。

框架是一个软件,半成品的软件,定义好了一些基础功能,需要加入你的功能就是完整的。基础功能是可重复使用的,可升级的

框架特点:

1.框架一般不是全能的,不能做所有事情。

2.框架是针对某一个领域有效。特长在某一个方面,比如mybatis做数据库操作强,但是他不能做其它的。

3.框架是一个软件。

01.概述

使用JDBC的缺陷

1.代码比较多,开发效率低

2.需要关注 Connection ,Statement,ResultSet对象创建和销毁

3.对 ResultSet查询的结果,需要自己封装为List

4.重复的代码比较多些

5.业务代码和数据库的操作混在一起

框架是一个软件,半成品的软件,定义好了一些基础功能,需要加入你的功能就是完整的。基础功能是可重复使用的,可升级的

框架特点:

1.框架一般不是全能的,不能做所有事情

2.框架是针对某一个领域有效。特长在某一个方面,比如mybatis做数据库操作强,但是他不能做其它的。

3.框架是一个软件

什么是 MyBatis/p>

MyBatis是一款优秀的持久层框架。

它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

mybatis框架

一个框架,早期叫做ibatis,代码在github.

mybatis是MyBatis sQL Mapper Framework for Java (sql映射框架)

1)sql mapper :sql映射

可以把数据库表中的一行数据映射为一个java对象。

一行数据可以看做是一个java对象。操作这个对象,就相当于操作表中的数据

2)Data Access 0bjects (DAOs) 数据访问,对数据库执行增删改查。

mybatis提供了哪些功能:

1.提供了创建connection能力tate不用你执行sqile”t人的约力

2.提供了执行sql语句的能力,不用你执行sql

3.提供了循环sql,把sql的结果转为java对象,list集合的能力

4 .提供了关闭资源的能力,不用你关闭conneqtion,statement,Resultset

开发人员做的是:提供sql语句

MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。

2013年11月迁移到Github。

总结:

mybatis是一个sql映射框架,提供的数据库的操作能力。增强的JDBC.

使用mybatis让开发人员集中精神写sql就可以了,不必关心connection ,statement,ResultSet的创建,销毁,sql的执行.org.mybatismybatis3.5.6

持久化

数据持久化

持久化就是将程序的数据在持久状态和瞬时状态转化的过程。

内存:断电即失。

数据库(jdbc),io文件持久化。

生活:冷藏。

为什么需要持久化/p>

有一些对象,不能让他丢失。

内存很贵。

持久层

Dao层,Serice层,Controller层…

完成持久化工作的代码块。

层界限十分明显。

为什么需要Mybatis/p>

帮助程序员将数据存入到数据库中。

方便

传统的JDBC代码太复杂了,简化。框架。自动化。

不用Mybatis也可以,更容易上手。技术没有高低之分。

特点:

简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。

灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。

解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。

提供映射标签,支持对象与数据库的orm字段关系映射

提供对象关系映射标签,支持对象关系组建维护

提供xml标签,支持编写动态sql。

02.Mybatis快速入门

实现步骤:

1.新建表SET FOREIGN_KEY_CHECKS=0;– —————————— Table structure for `student`– —————————-DROP TABLE IF EXISTS `student`;CREATE TABLE `student` (

`id` int(10) NOT NULL,

`name` varchar(30) DEFAULT NULL,

`tid` int(10) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `fktid` (`tid`),

CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;– —————————— Records of student– —————————-INSERT INTO `student` VALUES (‘1’, ‘梦阳辰’, ‘1’);INSERT INTO `student` VALUES (‘2’, ‘小红’, ‘1’);INSERT INTO `student` VALUES (‘3’, ‘小张’, ‘1’);INSERT INTO `student` VALUES (‘4’, ‘小李’, ‘1’);INSERT INTO `student` VALUES (‘5’, ‘小王’, ‘1’);– —————————— Table structure for `teacher`– —————————-DROP TABLE IF EXISTS `teacher`;CREATE TABLE `teacher` (

`id` int(10) NOT NULL,

`name` varchar(30) DEFAULT NULL,

PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;– —————————— Records of teacher– —————————-INSERT INTO `teacher` VALUES (‘1’, ‘黄老师’);– —————————— Table structure for `user`– —————————-DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (

`id` int(20) NOT NULL AUTO_INCREMENT,

`name` varchar(30) DEFAULT NULL COMMENT ‘用户名’,

`pwd` varchar(30) DEFAULT NULL COMMENT ‘密码’,

PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;– —————————— Records of user– —————————-INSERT INTO `user` VALUES (‘1’, ‘梦阳辰’, ‘123456’);INSERT INTO `user` VALUES (‘2’, ‘MengYangChen’, ‘1234567’);INSERT INTO `user` VALUES (‘3’, ‘meng’, ‘123456’);

2.加入maven的mybatis坐标, mysql驱动的坐标

3.创建实体类,student–保存表中的一行数据的

4.创建持久层的dao接口,定义操作数据库的方法

5.创建一个mybatis使用的配置文件

叫做sql映射文件:写sql语句的。一般一个表一个sql映射文件。这个文件是xml文件。

6.创建mybatis的主配置文件:

一个项目就一个主配置文件。

主配置文件提供了数据库的连接信息和sql映射文件的位置信息

7.创建使用mybatis类,

通过mybatis访问数据库

思路:

搭建环境–>导入Mybatis–>编写代码–>测试

1.搭建环境:

创建操作的数据库

数据库mybtis

IDEA新建maven项目

导入maven依赖

2.新建配置文件mybatis-config.xml

配置文件信息:

PUBLIC “-//mybatis.org//DTD Config 3.0//EN”

“http://mybatis.org/dtd/mybatis-3-config.dtd”>

37ba5aae5b90aed3007fee78062dcec9.png

新建Mybatis工具类

1.使用Mybatis获取sqlSessionFactory对象

从 XML 中构建 SqlSessionFactory

MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。

从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。

MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。String resource = “mybatis-config.xml”;

nputStream inputStream = Resources.getResourceAsStream(resource);

SqlSessionFactory sqlSessionFactory = new

SqlSessionFactoryBuilder().build(inputStream);

2.从 SqlSessionFactory 中获取 SqlSession

既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。//sqlSessionFactory  –>sqlSessionpublic class MybatisUtils {private static SqlSessionFactory sqlSessionFactory;static {try {//使用Mybatis获取sqlSessionFactory对象String resource = “mybatis-config.xml”;InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}/**

* 从 SqlSessionFactory 中获取 SqlSession

* @return SqlSession对象

*/public  static SqlSession getSqlSession(){/*SqlSession sqlSession = sqlSessionFactory.openSession();

return sqlSession;*/return sqlSessionFactory.openSession();}}

编写代码

1.实体类//实体类(javaBean)public class User {private int id;private String name;private String pwd;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}}

2.Dao/Mapper接口public interface UserDao {List selectUser();}

3.接口实现类

由原来的UserDaolmp转变为一个Mapper配置文件。

以前的方式就是写一个类实现接口,再重写接口方法,在方法中获取数据库连接,执行sql语句。

在Mybatis中免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

一个语句既可以通过 XML 定义,也可以通过注解定义。我们先看看 XML 定义语句的方式,事实上 MyBatis 提供的所有特性都可以利用基于 XML 的映射语言来实现,这使得 MyBatis 在过去的数年间得以流行。如果你用过旧版本的 MyBatis,你应该对这个概念比较熟悉。 但相比于之前的版本,新版本改进了许多 XML 的配置,后面我们会提到这些改进。这里给出一个基于 XML 映射语句的示例,它应该可以满足上个示例中 SqlSession 的调用。

PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN””http://mybatis.org/dtd/mybatis-3-mapper.dtd”>select * from mybatis.user

c9df37f65874cd3fa8561ec76fed0a42.png

为了这个简单的例子,我们似乎写了不少配置,但其实并不多。在一个 XML 映射文件中,可以定义无数个映射语句,这样一来,XML 头部和文档类型声明部分就显得微不足道了。文档的其它部分很直白,容易理解。

测试

核心文件mybatis-config.xml需要注册mappers

测试中可能遇到的问题:

1.配置文件没有注册

2.绑定接口错误。

3.方法名不对。

4.返回类型不对。

5.Maven导出资源问题。

  src/main/resources  **/*.properties

**/*.xmlfalse    src/main/java  **/*.properties

**/*.xmlfalse  

写到这里终于把搞了我好久的问题解决了,错误:Error:(3.28)java:程序报org.apache.ibatis.io不存在…。

网上很多解决方案是使用idea自带的maven,说是idea2020.1版本的问题。

我的解决方案:

解决方法:试过mvn idea:moudle命令的方法,但还是没有用。最后没办法

只能将在github网址下的mybatis3.5.6的jar包导入到新建的文件夹lib中。

fe67eaa16054efb5226ca2e3db33f87b.png

解决办法,将mybatis-config.xml文件的配置信息true该为false

53735af84ad6f949ccc6bdc201790b71.png

03.Mybatis实现增删改查

为了规范将接口名UserDao统一改为UserMapper。

注意增删改需要提交事务

代码:/**

* 接口操作user表

*/

public interface UserMapper {

//查询student表的所有数据

List selectUser();

//根据id查询用户

User selectUserById(int id);

//insert一个用户

int insertUser(User user);

//更新一个用户

int updateUser(User user);

//删除一个用户

int deleteUser(int id);

}

mapper

PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN”

“http://mybatis.org/dtd/mybatis-3-mapper.dtd”>

select * from mybatis.user

select * from mybatis.user where id=#{id}

insert into mybatis.user (id,name,pwd) values(#{id},#{name},#{pwd});

update mybatis.user set name =#{name},pwd=#{pwd}  where id=#{id} ;

delete from mybatis.user where id=#{id}

测试代码:public class UserMapperTest {

@Test

public void test(){

//1.获取SqlSession对象

SqlSession sqlSession = MybatisUtils.getSqlSession();

//方式一:getMapper

//2.执行sql,获取sql,面向接口编程,获取UserMapper接口(以前是实现接口的实现类,现在是配置文件)

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

List userList = mapper.selectUser();

/*String sqlId = “com.mengyangchen.dao.UserDao”+”.”+”selectUser”;

List userList = sqlSession.selectList(sqlId);*/

for(User user:userList){

System.out.println(user);

}

//3.关闭SqlSession

sqlSession.close();

}

@Test

public void selectUserById(){

//获取执行sql的对象

SqlSession sqlSession = MybatisUtils.getSqlSession();

UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取接口

User user = mapper.selectUserById(1);

System.out.println(user);

sqlSession.close();

}

@Test

public void insertUser(){

//获取执行sql的对象

SqlSession sqlSession = MybatisUtils.getSqlSession();

UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取接口

int num = mapper.insertUser(new User(3,”MengYangChen”,”123456″));

//提交事务

if(num>0){

System.out.println(“插入成功!”);

}

sqlSession.commit();

sqlSession.close();

}

@Test

public void updateUser(){

//获取执行sql的对象

SqlSession sqlSession = MybatisUtils.getSqlSession();

UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取接口

int num = mapper.updateUser(new User(3,”陈末”,”123456″));

//提交事务

if(num>0){

System.out.println(“更新成功!”);

}

sqlSession.commit();

sqlSession.close();

}

@Test

public void deleteUser(){

//获取执行sql的对象

SqlSession sqlSession = MybatisUtils.getSqlSession();

UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取接口

int num = mapper.deleteUser(3);

//提交事务

if(num>0){

System.out.println(“删除成功!”);

}

sqlSession.commit();

sqlSession.close();

}

}

使用Map

假设实体类,属性过多,我们可以考虑用Map.当然用实体类属性的set和get方法也是一样的。map可以放多个对象中的属性。

使用map,后面的值可以不和实体类属性相同,只需要和map的键相同即可。

例如:int updateUser2(Mapmap);

update mybatis.user set pwd =#{passWord} where id =#{userId}

public void updateUser2(){//获取执行sql的对象SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取接口Mapmap = new HashMap();map.put(“userId”,2);map.put(“passWord”,”1234567″);int num = mapper.updateUser2(map);//提交事务if(num>0){System.out.println(“更新成功!”);}sqlSession.commit();sqlSession.close();}

Map传递参数,直接在sql中取出key即可。

对象传递参数,直接在sql中去对象的属性即可。

模糊查询

在sql拼接中使用通配符可以防止sql注入。//模糊查询List selectUserLike(String value);

select * from mybatis.user where name like “%”#{value}”%”;

/**

* 模糊查询*/@Testpublic void selectUserLike(){//获取执行sql的对象SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取接口List list  = new LinkedList();list = mapper.selectUserLike(“梦”);for (User list1:list) {System.out.println(list1);}sqlSession.close();}

也可以:select * from mybatis.user where name like #{value};

/**

* 模糊查询*/@Testpublic void selectUserLike(){//获取执行sql的对象SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取接口List list  = new LinkedList();list = mapper.selectUserLike(“%梦%”);for (User list1:list) {System.out.println(list1);}sqlSession.close();}

第二种方式可能存在sql注入。

04.XML配置解析

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。

配置文档的顶层结构如下:

configuration(配置)

properties(属性)

settings(设置)

typeAliases(类型别名)

typeHandlers(类型处理器)

objectFactory(对象工厂)

plugins(插件)

environments(环境配置)

environment(环境变量)

transactionManager(事务管理器)

dataSource(数据源)

databaseIdProvider(数据库厂商标识)

mappers(映射器)

properties(属性)编写一个配置文件

db.properties

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/mybatisserSSL=false&useUnicode=true&characterEncoding=UTF-8username=root

password=123456

核心配置文件中引入:

位置需在第一位

PUBLIC “-//mybatis.org//DTD Config 3.0//EN””http://mybatis.org/dtd/mybatis-3-config.dtd”>

可以直接引入外部文件,并且可以在其中增加一些属性配置,如果两个文件中都对有同一属性的配置,优先使用外部配置文件中的配置。

设置(settings)

是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。

https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases

类型别名(typeAliases)

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如:

当这样配置时,Blog 可以用在任何使用 domain.blog.Blog 的地方。

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:

每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。见下面的例子:@Alias(“author”)public class Author {…}

映射器(mappers)

我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。例如:

需要接口和它的Mapper配置文件同名,并在同一包下。

需要接口和它的Mapper配置文件同名,并在同一包下。

05.生命周期和作用域

理解我们之前讨论过的不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。

38b825a44372c74c16c0c6f6a904c295.png

06.解决属性名和字段名不一致的问题

解决方法:

起别名,将sql语句的字段名取一个别名跟属性名相同。

方法二:resultMap结果集映射

select * from mybatis.user where id=#{id}

ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

07.日志

日志工厂

如果一个数据库操作,出现了异常,我们需要排错。日志就是最好的助手。

曾经:sout,debug

现在:日志工厂

1eb50b39662e04d01e805972439c0ded.png

LOG4J

什么是Log4j/p>

Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;

我们也可以控制每一条日志的输出格式;

通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。【百度百科】

快速入门

1.先导入log4j的包。log4jlog4j1.2.17

2.新建log4j.properties文件#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码

log4j.rootLogger=DEBUG,console,file

#控制台输出的相关设置

log4j.appender.console = org.apache.log4j.ConsoleAppender

log4j.appender.console.Target = System.out

log4j.appender.console.Threshold=DEBUG

log4j.appender.console.layout = org.apache.log4j.PatternLayout

log4j.appender.console.layout.ConversionPattern=[%c]-%m%n

#文件输出的相关设置

log4j.appender.file = org.apache.log4j.RollingFileAppender

log4j.appender.file.File=./log/kuang.log

log4j.appender.file.MaxFileSize=10mb

log4j.appender.file.Threshold=DEBUG

log4j.appender.file.layout=org.apache.log4j.PatternLayout

log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n

#日志输出级别

log4j.logger.org.mybatis=DEBUG

log4j.logger.java.sql=DEBUG

log4j.logger.java.sql.Statement=DEBUG

log4j.logger.java.sql.ResultSet=DEBUG

log4j.logger.java.sql.PreparedStatement=DEBUG

配置logrj为日志的实现

ec967704e1d0c585264d821da1c7f716.png

3.日志级别

info

debug

error

08.分页

limit分页1语法: SELECT  from user limit startIndex,pagesize;2.SELECT * from user limit 3;#[o,n]

使用Mybatis实现分页,核心为sqlselect  from mybatis.user limit #{startindex} ,#{pagesize}

RowBounds实现分页(了解即可,不推荐使用)

MyBatis分页插件PageHelper

这是MyBatis的初步了解与使用,你也许还需要了解注解开发,缓存等。

这些内容将在下一篇文章中介绍。

我是MyBatis的第一篇。

f91838f0507bbec7f3b156584543a848.png

文章知识点与官方知识档案匹配,可进一步学习相关知识MySQL入门技能树首页概览31413 人正在系统学习中 相关资源:糖烟茶酒行业管理软件 烟酒进销存店铺销售收银管理系统

来源:曲径通幽清风与酒

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年1月22日
下一篇 2021年1月22日

相关推荐