持久层框架MyBatis(中文音译:麦-波蒂斯)
上期内容:三大框架之spring框架+IoC控制反转、DI依赖注入
一、是什么?
是一个数据库框架
以前用的是hibernate
二、如何用?
1.创建springboot项目,添加mybatis,mysql依赖
2.使用代码生成sql,pojo类
3.创建controller,service
三、解决了什么问题?
以前是用jdbc操作数据库,需要我们创建连接,拼出sql,得到结果集resultSet,遍历resultSet,取数据,创建对象,给对象属性赋值,放到list中
传统框架的缺点
使用jdbc需要程序员创建连接,手写sql,处理结果集,使用了mybatis框架后,创建连接,结果集处理都由框架来完成。
mybatis介绍
mybatis它是轻量级持久层框架,由ibatis演化而来。它自动连接数据库,将数据库的结果集封装到对象中POJO。
POJO:
一个简单的Java类,这个类没有实现/继承任何特殊的java接口或者类,不遵循任何主要java模型,约定或者框架的java对象。在理想情况下,POJO不应该有注解。
JavaBean:
JavaBean是可序列化的,实现了serializable接口
具有一个无参构造器
有按照命名规范的set和gett,is(可以用于访问布尔类型的属性)方法
创建数据库
1.下载我提供的sql,
链接:https://pan.baidu.com/s/1vTavm9guToveOGeB7VFX4A
提取码:xwbc
复制这段内容后打开百度网盘手机App,操作更方便哦
2.打开sqlyog,打开执行sql语句窗口。
3.把sql拷贝到sqlyog中,执行
4.选中服务器,右键refresh,看到一个库mall.里面有5张表
选中服务器右键刷新
以前使用的是hibernate
逆向工程
通过逆向工程生成sql语句。
生成sql,pojo类
下载generator原始.rar
链接:https://pan.baidu.com/s/1dYIcscVoJuChRavHQEGcxQ
提取码:3u77
下载完成后 放到Eclipse工作区中
Eclipse中import →maven→Existing Maven projects
查看Mysql 的版本号
不同版本的mysql连接字符串不一样,先查看本机的mysql版本。
点击此电脑 > 右键 > 管理 > 服务和应用程序 >服务 >mysql
查出mysql的版本
quit退出mysql
修改根目录下的generatorConfig.xml配置文件
项目中的配置是针对mysql5的,如果是mysql8需要修改driverclass,增加4个property.
如果数据库是8.0以上的使用以下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<!-- JavaBean 实现 序列化 接口 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin">
</plugin>
<!-- genenat entity时,生成toString -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
<!-- 共用5处要修改 -->
<!--修改1: 数据库连接的信息:驱动类、连接地址、用户名、密码
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mall" userId="root"
password="root">
</jdbcConnection> -->
<!-- 数据库是8.0+时,1,修改pom.xml 加载mysql8的驱动 2,使用下面的jdbcConnection -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mall" userId="root"
password="root">
<property name="useUnicode" value="true" />
<property name="characterEncoding" value="utf-8" />
<property name="serverTimezone" value="GMT" />
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL
和 NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--修改2: targetProject:生成PO类的位置 -->
<javaModelGenerator
targetPackage="com.tedu.project_jt.pojo"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--修改3: targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator
targetPackage="com.tedu.project_jt.mapper"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- 修改4: targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.tedu.project_jt.mapper"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--修改5: 指定数据库表 -->
<table tableName="category" />
<table tableName="item" />
<table tableName="user" />
<table tableName="jt_order" />
<table tableName="admin" />
</context>
</generatorConfiguration>
如果数据库是8.0以下的使用以下配置:
```java
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<!-- JavaBean 实现 序列化 接口 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin">
</plugin>
<!-- genenat entity时,生成toString -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
<!-- 共用5处要修改 -->
<!--修改1: 数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mall" userId="root"
password="root">
</jdbcConnection>
<!-- 数据库是8.0+时,1,修改pom.xml 加载mysql8的驱动 2,使用下面的jdbcConnection -->
<!--
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mall" userId="root"
password="root">
<property name="useUnicode" value="true" />
<property name="characterEncoding" value="utf-8" />
<property name="serverTimezone" value="GMT" />
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
-->
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL
和 NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--修改2: targetProject:生成PO类的位置 -->
<javaModelGenerator
targetPackage="com.tedu.project_jt.pojo"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--修改3: targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator
targetPackage="com.tedu.project_jt.mapper"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- 修改4: targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.tedu.project_jt.mapper"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--修改5: 指定数据库表 -->
<table tableName="category" />
<table tableName="item" />
<table tableName="user" />
<table tableName="jt_order" />
<table tableName="admin" />
</context>
</generatorConfiguration>
打开pox.xml
数据库低于8.0的朋友,不用操作这一步:
执行src/main/java/GeneratorApp生成xml和实体类
执行完成:
执行GeneratorApp后,选中项目右键refresh,查看生成的xml和类如下图
查看生成的sql
只查看sql
POJO(Plain Ordinary Java Object)简单的Java对象,也叫实体类。对象的另一种叫法,如一个人有多个名字
类中只包含属性和set(),get()方法。一般情况下一张表对应一个pojo
商品分类CRUD操作
mywbatis项目
1.打开工作区中的generator原始文件\src\main\java\com\tedu\project_jt
创建项目
项目是mybatis_01jt,添加Spring Web、MyBatis Framework、MySql Driver依赖。
包名是com.tedu.jt,包名要和逆向工程生成的包名一致。
解压到打工作区
导入eclipse
复制这2个文件夹到刚刚创建的项目文件中:
project_jt\src\main\java\com\tedu\project_jt
然后:选中项目project_jt右键>maven> Update Project>勾选上,刷新重新加载一下
打开数据库mall、打开user表添加2条数据
打开eclipse,打开复制application.properties,新建一个application.yml
然后打开application.yml,把这段代码复制粘贴进去
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
username: root
password: root
mybatis:
mapperLocations: classpath:com.tedu.jtmall.mapper/*.xml
logging:
path: ./logs
level:
com.tedu.jtmall.mapper: debug
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
username: root
password: root
mybatis:
mapperLocations: classpath:com.tedu.project_jt.mapper/*.xml
logging:
path: ./logs
level:
com.tedu.project_jt.mapper: debug
找到UserMapper类,打开复制包名
复制粘贴到application.yml中的12句上:后面。
打开ProjectJtApplication类添加一条注解
//mybatis框架会自动为mapper包下的所有接口创建代理类
@MapperScan(“com.tedu.project_jt.mapper”)
代理对象
选中com.tedu.project_jt.controller 包,右键创建一个新的包com.tedu.project_jt.controller
在包下创建一个类,类名为UserController
package com.tedu.project_jt.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.tedu.project_jt.mapper.UserMapper;
import com.tedu.project_jt.pojo.User;
@RestController
public class UserController {
//从spring框架ioc容器中,拿UserMapper接口代理类的对象
@Autowired
UserMapper userMapper;
@RequestMapping("lectAll")
public List<User> selectAll() {
return userMapper.selectByExample(null);
}
}
然后打开ProjectJtApplication类 Run as执行:
http://localhost:8080/lectAll
下面我们继续练习(加深印象),新建项目,下载dbDemo文件
链接:https://pan.baidu.com/s/1VS8-ZkYC9HXXjOMYhlyeTA
提取码:fjmf
拷贝到eclipse工作区,解压,更改名字为mybatis02
打开eclipse,导入maven项目
打开generator原始\src\main\java\com 把com复制到mybatis02的java中
然后新建一个包
更改包名显示样式
找到我们的sql查询语句
复制 application.properties文件
打开application.yml
复制粘贴一下代码进去
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
username: root
password: root
mybatis:
mapperLocations: classpath:com.tedu.jtmall.mapper/*.xml
logging:
path: ./logs
level:
com.tedu.jtmall.mapper: debug
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
username: root
password: root
mybatis:
mapperLocations: classpath:com.tedu.project_jt.mapper/*.xml
logging:
path: ./logs
level:
com.tedu.project_jt.mapper: debug
打开DbDemoApplication类
添加注解
package com.tedu.project_jt;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
//mybatis框架会为mapper包下的接口创建代理类
//$Proxy0 implements UserMapper
//为$Proxy0创建一个对象,叫代理对象
//controller @autowired取到代理对象
@MapperScan("com.tedu.project_jt.mapper")
public class DbDemoApplication {
public static void main(String[] args) {
SpringApplication.run(DbDemoApplication.class, args);
}
}
在controller包中 new一个Usercontroller
package com.tedu.project_jt.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.tedu.project_jt.mapper.UserMapper;
import com.tedu.project_jt.pojo.User;
@RestController
public class Usercontroller {
//从ioc容器中取UserMapper接口的代理类的对象
@Autowired
UserMapper userMapper;
@RequestMapping("/selectAll")
public List<User> selectAll(){
return userMapper.selectByExample(null);
}
}
Run AS执行:
http://localhost:8080/selectAll
有的朋友,可能显示出来的效果不是我这样的,就需要下载插件
1、打开chrome,右上角–>更多工具–>扩展程序
2、右上角,选中“开发模式”;
3、点击"加载已解压的扩展程序…" ->
下载插件链接:https://pan.baidu.com/s/18rIXWN3wWjyLOMBQtder9w
提取码:ccqu
然后选择插件目录文件。
4、安装完成,重新加载
小结
mybatis项目
1.用https://start.spring.io/ 网站生成
2.项目没有配置url,就启动报错
Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.
3.拷贝生成的mapper和pojo包
4.拷贝application.properties,改名为application.yml,配置代码 上面内容中有
mybatis的使用
1,拷贝cdbDemo到工作区中,把文件夹改名成mybatis02,修改pom.xml中的artifaceId和name, import导入 ,然后run as启动,发现报错。
2,拷贝生成的代码,拷贝com
3, com.tedu.project_jt.mapper
.pojo
.controller
DBDemoApplication
4,拷贝application.properties改名成application.yml,拷贝配置,修改数据库信息,修改mapplocation和log的包名
5,入口类上@mapperScan(“com.tedu.project_jt.mapper”)
6,创建controller
7,装jsonView
如果在入口类中不配置mapperScan
Field userMapper in com.tedu.project_jt.controller.UserController required a bean of type 'com.tedu.project_jt.mapper.UserMapper' that could not be found.
The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'com.tedu.project_jt.mapper.UserMapper' in your configuration.
总结
1.spring ioc容器
UserController需要UserServiceImpl的对象,自己new
UserController被UserServiceImpl控制。
@autowired 容器给我一个对象
UserService userServiceImpl1
@service
class UserServiceImpl1
class UserServiceimpl2
先遍历hashmap,取出所有对象,看对象的类型是否是UserService,
根据类型找对象可能会失败,一个是hashMap中没有对象,另一个是有多个对象。
hashMap.get(userServiceImpl1),根据对象名称去找一个对象
mybatis解决什么问题?(jdbc封装)
使用步骤:
1,创建一个springboot项目,添加mysql,mybatis,web依赖
2,用代码生成UserMapper.xml,UserMapper.java,User
3, 在application.yml配置数据库信息,mapperLocation,log
4,在入口类*Applicaiton添加@mapperScan(""),mybatis框架会为mapper包上的接口创建代理类Proxy51,为Proxy51类创建对象,放在spring ioc容器中
5,在controller 中@autowired取到userMapper对象,调用方法
软件是对数据的处理,把处理的结果显示在屏幕上。
中小型项目用vue+ssm
大型项目用 vue +ssm+redis+微服务+docker