Mybatis框架介绍与基本使用笔记
**注意:**一般的一个Maven
工程首先注入的依赖包含数据库驱动依赖,日志依赖,测试依赖
domain
中的实体类实现serizlizable
接口序列化的原因:
最重要的两个原因是:
1、将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;
2、按值将对象从一个应用程序域发送至另一个应用程序域。
实现serializable接口的作用是就是可以把对象存到字节流,然后可以恢复。所以你想如果你的对象没实现序列化怎么才能进行网络传输呢,要网络传输就得转为字节流,所以在分布式应用中,你就得实现序列化,如果你不需要分布式应用,那就没那个必要实现序列.
namespace:名称空间;写接口的全类名;相当于告诉Mybatis
这个配置文件是实现哪个接口的;
一、Mybatis相关配置
自己预设定的配置文件:
1.1 config(mybatis-config.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的配置声明dtd文件 -->
<!-- mybatis的主配置文件 -->
<configuration>
<!-- 配置环境 若想让environments环境起作用,下列的标签中的配置都需要起作用 -->
<environments default="mysql">
<!-- 配置mysql(default的值)环境 id值等于default的值 -->
<environment id="mysql">
<!-- 配置事务的类型 -->
<transactionManager type="JDBC"/>
<!-- 配置数据源(连接池 -\- druid、c3p0..) -->
<dataSource type="POOLED">
<!-- 配置数据库连接的基本信息 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://url:3306/mybatis?characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 使用的是注解 指定映射配置文件的位置(使用注解时,不能留下配置文件的方式,否则会冲突),映射配置文件指的是每个dao对立的配置文件-->
<!-- <mapper class="cn.lizhi.mybatis_01.dao.UserDao"/> -->
<!-- 该包下所有的dao接口都可以使用 -->
<!-- <package name="cn.lizhi.mybatis_01.dao"/>-->
<!-- 配置文件的指定方式 -->
<mapper resource="cn/lizhi/mybatis_01/dao/UserDao.xml"/>
</mappers>
</configuration>
1.1.1 通过properties标签引入外部配置信息(动态配置)
<?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的配置声明dtd文件 -->
<!-- mybatis的主配置文件 -->
<configuration>
<!-- 配置properties
可以在标签内部配置连接数据库的信息。也可以通过属性引用外部配置文件信息
resource属性:
用于指定配置文件的位置,是按照类路径的写法来写,并且必须存在与类路径下
url属性:
是要求按照url的写法来写地址
写法:
http://localhost:8080/servlet/demoServlet
协议 主机 端口 URI
URI:统一资源标识符。应用中可以唯一定位一个资源。
-->
<!-- 方式1.jdbcConfig.properties 是存放在类(resources)路径的根路径下 -->
<properties resource="jdbcConfig.properties"/>
<!-- 方式2. 这种是在标签内部配置连接数据库信息
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://url:3306/mybatis?characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>
-->
<!-- 配置环境 若想让environments环境起作用,下列的标签中的配置都需要起作用 -->
<environments default="mysql">
<!-- 配置mysql(default的值)环境 id值等于default的值 -->
<environment id="mysql">
<!-- 配置事务的类型 -->
<transactionManager type="JDBC"/>
<!-- 配置数据源(连接池 -\- druid、c3p0..) -->
<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="cn/lizhi/mybatis_01/dao/UserDao.xml"/>
</mappers>
</configuration>
jdbcConfig.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://url:3306/mybatis?characterEncoding=utf8
jdbc.username=root
jdbc.password=root
1.2 Mapper
Mapper
是具体某张表的映射。
<?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.lizhi.dao.IUserDao">
<!--配置查询所有,resultType的作用就是返回封装的位置,如果你要是不写的话,最后mybatis是不知道你到底要封装到哪里,会出现错误,我这个是User表,查询的也是这个,最后返回的结果就封装在User类中 id要写对应dao中的方法名称-->
<select id="findAll" resultType="com.lizhi.domain.User">
SELECT *FROM user
</select>
<!--注意在resources中,目录是一级结构,要一个一个创建,而cn.lizhi.mybatis.dao是一个目录。而包是三级结构-->
</mapper>
<!-- 使用时直接复制以下的即可 -->
<?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="">
<select id="" resultType="">
SELECT *FROM user;
</select>
</mapper>
通过实例 – 由Mybatis
创建实现Dao
的接口,进行数据库的查询时,在mapper
中只有id
是无法定位到具体数据库访问的方法的,所以要加上namespace
,限定住工作空间(即限定住全类名,一个类中,方法名是唯一的)。可以简单理解为namespace
是定位到具体的一个dao
接口,id
是定位到当前这个dao
下的具体方法。
1.3 log4j的日志配置文件 – log4j.properties
将log4j
配置文件放入resource资源目录下,记录日志,对日志的操作。
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
1.4 表的初始创建
create DATABASE mybatis;
use mybatis;
-- user表的创建
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) Not NULL PRIMARY KEY auto_increment,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性别',
`address` varchar(256) default NULL COMMENT '地址'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','男','北京'),(42,'小二王','2018-03-02 15:09:37','女','北京金燕龙'),(43,'小二王','2018-03-04 11:34:34','女','北京金燕龙'),(45,'传智播客','2018-03-04 12:04:06','男','北京金燕龙'),(46,'老王','2018-03-07 17:37:26','男','北京'),(48,'小马宝莉','2018-03-08 11:44:00','女','北京修正');
-- account表的创建
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`ID` int(11) NOT NULL COMMENT '编号',
`UID` int(11) default NULL COMMENT '用户编号',
`MONEY` double default NULL COMMENT '金额',
PRIMARY KEY (`ID`),
KEY `FK_Reference_8` (`UID`),
CONSTRAINT `FK_Reference_8` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `account`(`ID`,`UID`,`MONEY`) values (1,41,1000),(2,45,1000),(3,41,2000);
-- role表的创建
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
`ID` int(11) NOT NULL COMMENT '编号',
`ROLE_NAME` varchar(30) default NULL COMMENT '角色名称',
`ROLE_DESC` varchar(60) default NULL COMMENT '角色描述',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `role`(`ID`,`ROLE_NAME`,`ROLE_DESC`) values (1,'院长','管理整个学院'),(2,'总裁','管理整个公司'),(3,'校长','管理整个学校');
-- user_role表的创建
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
`UID` int(11) NOT NULL COMMENT '用户编号',
`RID` int(11) NOT NULL COMMENT '角色编号',
PRIMARY KEY (`UID`,`RID`),
KEY `FK_Reference_10` (`RID`),
CONSTRAINT `FK_Reference_10` FOREIGN KEY (`RID`) REFERENCES `role` (`ID`),
CONSTRAINT `FK_Reference_9` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user_role`(`UID`,`RID`) values (41,1),(45,1),(41,2);
二、Mybatis的注意事项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jUJHQDVA-1617344133723)(https://s1.ax1x.com/2020/09/06/weQhbF.png)]
- 两个配置文件的编写
config
(全局环境Mybatis
配置文件)mapper
(映射配置文件) – 要与dao
的目录结构相同select
中的,resultType
的作用就是返回封装的位置,如果你要是不写的话,最后mybatis
是不知道你到底要封装到哪里,会出现错误,我这个是User
表,查询的也是这个,最后返回的结果就封装在User
类中id
要写对应dao
中的方法名称。
三、快速入门 – 实现user表中的全部用户信息的查询
3.1 实体类编写
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private Character sex;
private String address;
public User() {
}
public User(String username, Date birthday, Character sex, String address) {
this.username = username;
this.birthday = birthday;
this.sex = sex;
this.address = address;
}
// 省略getter和setter方法以及toString()方法的展示
}
3.2 dao层接口的编写
public interface UserDao {
/**
* 查询所有用户信息
*/
List<User> findAll();
}
3.3 UserMapper.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">
<mapper namespace="cn.lizhi.dao.UserDao">
<!-- 配置查询所有,resultType的作用就是返回封装的位置。这里是对User对象进行封装 -->
<select id="findAll" resultType="cn.lizhi.domain.User">
SELECT *FROM user;
</select>
</mapper>
3.4 测试方法
public class MybatisTest {
public static void main(String[] args) throws IOException {
// 1. 读取mybatis的全局配置文件
InputStream in = Resources.