| SpringMVC框架技术总结(二)🔥 | [https://blog.csdn.net/Augenstern_QXL/article/details/119488738](
) |
| SpringMVC框架技术总结(三)🔥 | [https://blog.csdn.net/Augenstern_QXL/article/details/119488927](
) |
[](
)✍目录总览
=======================================================================
参考视频:
- [黑马程序员最全SSM框架教程](
)
- [2021最新Mybatis框架教程IDEA通俗易懂版](
)
[](
)0、Mybatis第一个程序
================================================================================
- 数据库搭建准备
CREATE DATABASEmybatis_db`
USE mybatis_db
;
DROP TABLE IF EXISTS user
;
CREATE TABLE user
(
id
int(11) NOT NULL AUTO_INCREMENT,
username
varchar(50) DEFAULT NULL,
age
int(11) DEFAULT NULL,
address
varchar(50) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
insert into user
(id
,username
,age
,address
) values (1,‘UZI’,19,‘上海’),
(2,‘PDD’,25,‘上海’);
- 新建普通maven项目,导入依赖
org.mybatis
mybatis
3.4.6
mysql
mysql-connector-java
5.1.47
junit
junit
4.11
test
- 编写mybatis核心配置
- 在资源目录下创建:mybatis-config.xml 内容如下:
- 定义接口及对应的xml映射文件
-
在java下新建包
com.sangeng.dao.UserDao
-
在resources资源目录下新建:
com/sangeng/dao/UserDao.xml
public interface UserDao {
List findAll();
}
<?xml version="1.0" encoding="UTF-8" ?>select * from user
- 编写测试类
获取SqlSession,通过SqlSession获取UserDao调用对应的方法
@Test
public void findAll() throws IOException {
//定义mybatis配置文件的路径
String resource = “mybatis-config.xml”;
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取Sqlsession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取UserDao实现类对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//调用方法测试
List userList = userDao.findAll();
System.out.println(userList);
//释放资源
sqlSession.close();
}
[](
)1、Mybatis映射配置文件
=================================================================================
-
映射配置文件包含了数据和对象之间的映射关系以及要执行的SQL语句。
-
<mapper>
:核心根标签 -
namespace
属性:名称空间 -
<select>
:查询功能标签 -
<insert>
:新增功能标签 -
<update>
:修改功能标签 -
<delete>
:删除功能标签 -
id
:唯一标识,配合名称空间使用 -
parameterType
属性:指定参数映射的对象类型 -
resultType
属性:指定结果映射的对象类型 -
SQL获取参数
-
#{属性名}
[](
)1.1、查询功能
-
<select>
查询功能标签 -
属性
id:就是对应的namespace中的方法名
parameterType:传入SQL语句的参数类型
resultType:指定结果映射的对象类型。
-
SQL 获取参数: #{属性名}
-
示例
SELECT * FROM student WHERE id = #{id}
[](
)1.2、新增功能
-
<insert>
:新增功能标签。 -
属性
id:就是对应的namespace中的方法名
parameterType:传入SQL语句的参数类型
resultType:指定结果映射的对象类型。
-
SQL 获取参数: #{属性名}
-
示例
INSERT INTO student VALUES (#{id},#{name},#{age})
[](
)1.3、修改功能
-
<update>
:修改功能标签。 -
属性
id:就是对应的namespace中的方法名
parameterType:传入SQL语句的参数类型
resultType:指定结果映射的对象类型。
-
SQL 获取参数: #{属性名}
-
示例
UPDATE student SET name = #{name},age = #{age} WHERE id = #{id}
[](
)1.4、删除功能
-
<delete>
:查询功能标签。 -
属性
id:就是对应的namespace中的方法名
parameterType:传入SQL语句的参数类型
resultType:指定结果映射的对象类型。
-
SQL 获取参数: #{属性名}
-
示例
DELETE FROM student WHERE id = #{id}
[](
)2、Mybatis核心配置文件
=================================================================================
核心配置文件包含了 MyBatis 最核心的设置和属性信息。如数据库的连接、事务、连接池信息等。
<?xml version="1.0" encoding="UTF-8" ?>[](
)2.1、environments标签
environments
标签:数据库环境的配置,支持多环境配置
[](
)2.1.1、事务管理器
其中,事务管理器(transactionManager
)类型有两种:
-
JDBC :这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域
-
MANAGER
[](
)2.1.2、数据源
数据源(dataSource
)类型有三种:
-
UNPOOLED:这个数据源的实现只是每次请求时打开和关闭连接
-
POOLED:这种数据源的实现利用 "池"的概念将JDBC连接对象组织起来。
-
JNDI
[](
)2.2、properties标签
实际开发中,习惯将数据源的配置新信息单独抽取成一个properties文件,该标签可以加载额外配置的properties文件
我们可以在db.properties
中配置信息,例如:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
我们也可以在properties
标签中配置信息,例如:
-
这个例子中的 username 和 password 将会由 properties 元素中设置的相应值来替换。
-
driver 和 url 属性将会由 mybatis-config.properties 文件中对应的值来替换。这样就为配置提供了诸多灵活选择。
[](
)2.3、typeAliases标签
可以用来设置给全类名设置别名,简化书写
-
<typeAliases>
:为全类名起别名的父标签。 -
<typeAlias>
:为全类名起别名的子标签。 -
属性
type:指定全类名
alias:指定别名
-
<package>
:为指定包下所有类起别名的子标签。(别名就是类名) -
例如为
com.itheima.domain.User
定义别名为user
- 一般设置一个包下的实体类全部具有默认别名
这样com.sangeng.dao
包下的实体类全部具有默认别名
-
默认别名是类名首字母小写
-
例如com.sangeng.pojo.User别名为user
[](
)2.3、settings标签
[](
)2.3.1、日志工厂
Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:
-
SLF4J
-
Apache Commons Logging
-
Log4j 2
-
Log4j[掌握]
-
JDK logging
-
STDOUT_LOGGING[掌握]
[](
)2.3.1.1、标准日志实现
指定 MyBatis 应该使用哪个日志记录实现,如果此设置不存在,则会自动发现日志记录实现
在mybatis-config.xml
核心配置文件配置
[](
)2.3.1.2、Log4j日志实现
使用步骤:
- 导入Log4j的包
log4j
log4j
1.2.17
- Log4j配置文件编写
- 在resources目录下新建
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
- 在mybatis核心配置文件中实现
- 测试类中测试
//注意导包:org.apache.log4j.Logger
static Logger logger = Logger.getLogger(MyTest.class);
@Test
public void textLog4j(){
logger.info(“info:进入了selectUser方法”);
logger.debug(“debug:进入了selectUser方法”);
logger.error(“error:进入了selectUser方法”);
}
- 可以看到生成的日志文件
[](
)2.3.2、开启驼峰命名法
使用步骤:
- 在mybatis核心配置文件中设置下划线驼峰自动转换
[](
)1.6、mappers标签
该标签的作用是加载映射的,加载方式有如下几种(主要使用第三种):
- 使用相对类路径的资源引用xml文件,注意路径是用
/
而不是用点
- 使用映射器接口实现类的完全限定类名,引用的是接口
- 使用扫描包进行注册绑定
[](
)3、Mybatis相应API
================================================================================
[](
)3.1、Resources
加载资源的工具类:
| 返回值 | 方法名 | 说明 |
| — | — | — |
| InputStream | getResourceAsStream(String fileName) | 通过类加载器返回指定资源的字节输入流 |
//1.加载核心配置文件
InputStream inputStream = Resources.getResourceAsStream(“mybatis-config.xml”);
// 我们也可以自己加载
InputStream inputStream = 类名.class.getClassLoader().getResourceAsStream(“mybatis-config.xml”);
[](
)3.2、SqlSessionFactoryBuilder
SqlSessionFactoryBuilder工厂构建器:
-
SqlSessionFactory.build(InputStream inputStream)
-
通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象
String resource = “org/mybatis/example/mybatis-config.xml”;
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
[](
)3.3、SqlSessionFactory
SqlSessionFactory有多个方法创建SqlSession实例,常用的有如下两个:
-
SqlSessionFactory.openSession
:会默认开启一个事务,但事务不会自动提交,也就意味着需要手动提交该事务,更新操作数据才会持久化到数据库中 -
SqlSessionFactory.openSession(boolean autoCommit)
: 参数为是否自动提交,如果设置为true,那么不需要手动提交事务
| 返回值 | 方法名 | 说明 |
| — | — | — |
| SqlSession | openSession() | 通过SqlSession构建者对象,并开启手动提交事务 |
| SqlSession | openSession(boolean autoCommit) | 通过SqlSession构建者对象,如果参数为true,则开启自动提交事务 |
[](
)3.4、SqlSession
SqlSession 提供了在数据库执行 SQL 命令所需的所有方法 。它还提供了事务的相关操作。
成员方法如下:
-
sqlSession.commit()
:提交事务 -
sqlSession.rollback()
:回滚事务 -
sqlSession.close()
:释放资源
[](
)3.5、mybatis工具类
我们通常将mybatis获取SqlSession实例封装成一个工具类
public 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 的实例。
public static SqlSession getSqlSession(){
// SqlSession sqlSession = sqlSessionFactory.openSession();
// return sqlSession;
return sqlSessionFactory.openSession();
}
}
[](
)4、Mybatis开发方式
===============================================================================
[](
)4.0、Mybatis传统方式开发
[](
)4.0、Dao 层传统实现方式
-
分层思想:控制层(controller)、业务层(service)、持久层(dao)。
-
调用流程
[](
)4.1、Dao层代理开发方式
-
Mapper 接口开发方法只需要程序员编写Mapper 接口(相当于Dao 接口)
-
我们之前的开发规范是编写Dao接口,之后再编写实现类DaoImpl
-
代理开发规范是编写Dao接口,之后再编写xml配置文件
Mapper 接口开发需要遵循以下规范:
-
Mapper.xml文件中的namespace与mapper接口的全限定名相同
-
Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
-
Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
-
Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
[](
)4.2、参数的获取
[](
)4.2.1、一个参数
[](
)4.2.1.1、基本参数
我们可以使用#{}
直接来取值,写任意名字都可以获取到参数。但是一般用方法的参数名来取。
例如:
- 接口中方法定义如下
public interface UserDao {
User findUser(Integer id);
}
- xml中的内容如下
select * from user where id = #{id}
- 测试
@Test
public void findUser() throws IOException {
//定义mybatis配置文件的路径
String resource = “mybatis-config.xml”;
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取Sqlsession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取UserDao实现类对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//调用方法测试
User user = userDao.findUser(2);
System.out.println(user);
//释放资源
sqlSession.close();
}
[](
)4.2.1.2、POJO
我们可以使用POJO中的属性名来获取对应的值。
例如:
- 接口中方法定义如下
public interface UserDao {
User findByUser(User user);
}
- xml中的内容如下
select * from user where id = #{id} and username = #{username} and age = #{age} and address = #{address}
- 测试
@Test
public void findByUser() throws IOException {
//定义mybatis配置文件的路径
String resource = “mybatis-config.xml”;
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取Sqlsession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取UserDao实现类对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//调用方法测试
User byUser = userDao.findByUser(new User(2, “PDD”, 25, “上海”));
System.out.println(byUser);
//释放资源
sqlSession.close();
}
[](
)4.2.1.3、Map
我们可以使用map中的key来获取对应的值。
例如:
- 接口中方法定义如下
public interface UserDao {
User findByMap(Map map);
}
- xml中内容如下
select * from user where id = #{id} and username = #{username} and age = #{age} and address = #{address}
- 测试
@Test
public void findByMap() throws IOException {
//定义mybatis配置文件的路径
String resource = “mybatis-config.xml”;
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取Sqlsession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取UserDao实现类对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//调用方法测试
Map map = new HashMap();
map.put(“id”,2);
map.put(“username”,“PDD”);
map.put(“age”,25);
map.put(“address”,“上海”);
User byMap = userDao.findByMap(map);
System.out.println(byMap);
//释放资源
sqlSession.close();
}
[](
)4.2.2、多个参数
Mybatis会把多个参数放入一个Map集合中,默认的key是argx和paramx这种格式。
例如:
-
接口中方法定义如下
-
我们一般在方法参数前使用@Param来设置参数名。
public interface UserDao {
User findByCondition(@Param(“tid”) Integer id,@Param(“username”)String username);
}
- xml中内容如下
select * from user where id = #{tid} and username = #{username}
- 测试
@Test
public void findByCondition() throws IOException {
//定义mybatis配置文件的路径
String resource = “mybatis-config.xml”;
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取Sqlsession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取UserDao实现类对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//调用方法测试
User pdd = userDao.findByCondition(2, “PDD”);
System.out.println(pdd);
//释放资源
sqlSession.close();
}
[](
)4.2.3、总结
-
建议如果只有一个参数的时候不用做什么特殊处理。
-
如果是有多个参数的情况下一定要加上@Param来设置参数名。
[](
)4.2.4、获取参数时 #{}和${}的区别
-
如果使用#{}.他是预编译的sql可以防止SQL注入攻击
-
如果使用${}他是直接把参数值拿来进行拼接,这样会有SQL注入的危险
[](
)5、CRUD操作
==========================================================================
[](
)5.1、select
select 语句有很多属性可以详细配置每一条SQL语句
-
id
: 就是对应的namespace中的方法名 -
resultType
: Sql语句执行的返回值【完整的类名或者别名】 -
parameterType
:传入SQL语句的参数类型
示例:
- 在UserMapper中添加对应方法
public interface UserMapper {
// 查询全部用户
List getUserList();
}
- 在UserMapper.xml中添加Select语句
select * from mybatis.user;