-
一款优秀的持久层框架,支持自定义SQL、存储过程以及高级映射
-
免除了几乎所有JDBC代码以及设置参数和获取结果集的工作(JDBC的封装)
-
可通过简单的XML或注解配置和映射原始类型、接口和Java POJO(Plain Old Java Objects,普通老式Java对象)操作数据库
环境搭建
-
引入MyBatis和JDBC依赖
-
编写对应实体类和数据库信息
-
编写dao层接口
public interface UserDao { // 查询所有用户信息 List<User> selUser(); }
-
dao层内配置与接口相关的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标签:一个接口对应一个mapper--> <!--namespace(指定接口位置(全类名))--> <mapper namespace="com.xxx.dao.UserDao"> <!--不同功能标签封装不同操作(对应接口)--> <!--select:查询--> <!--update:更新--> <!--delete:删除--> <!--insert:插入--> <!--对接口中每一个抽象方法编写对应操作--> <!--id属性:绑定对应接口方法名--> <!--resultType:指定对应接口的实体类--> <select id="selUser" resultType="com.xxx.dao.modle.User"> <!--接口要执行的SQL语句放在标签中--> SELECT * FROM user; </select> </mapper>
-
在src文件下配置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"> <configuration> <!-- environments:数据库环境(可配置多个) --> <!-- default:指定环境(根据environment的id属性) --> <environments default="development"> <!-- environment:环境(可配置多个) --> <!-- id:环境命名 --> <environment id="development"> <transactionManager type="JDBC"/> <!-- dataSource:数据源 --> <dataSource type="POOLED"> <!-- property:数据库连接信息 --> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- mappers:映射器 --> <mappers> <!-- mapper:接口对应的配置文件 --> <!-- resource:.xml资源路径 --> <mapper resource="com/xxx/dao/UserDao.xml"/> </mappers> </configuration>
-
应用MyBatis
public static void main(String[] args) throws Exception { // 默认在src下读取文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); // 工厂模式:解析InputStream,生产sqlSession对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // SqlSession对象:放所有myBaits生成的DAO层接口的实现 SqlSession sqlSession = sqlSessionFactory.openSession(); // 获取指定的接口实现 UserDao userDao = sqlSession.getMapper(UserDao.class); // 多态调用方法 List<User> users = userDao.selUser(); for (User user : users) { System.out.println(user); } // 更新类需要提交事务(sqlSession.commit();) // sqlSessoin是个资源,使用完毕后必须进行关闭 sqlSession.close(); }
映射器(mappers)
注册mapper的配置文件(对应Dao接口的XML配置文件)
<configuration>
<mappers>
<!-- 1、资源路径(resource):/分割 -->
<mapper resource="com/xxx/dao/UserDao.xml"/>
<!-- 2、类路径(class):.分割 -->
<mapper class="com.xxx.dao.UserDao"/>
<!-- 3、扫描包:引入dao层所有XML文件 -->
<package name="com.xxx.dao"/>
</mappers>
</configuration>
属性(properties)
可以引入外部的properties文件
-
外部建立properties文件
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=UTF8 username=root password=123456
-
properties:引入properties文件(mybatis-config.xml)
<configuration> <!-- 默认在src下找文件 --> <properties resource="db.properties"></properties> </configuration>
-
通过${K}取值(mybatis-config.xml)
<property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/>
类型别名(typeAliases)
实体类取别名后,可直接使用别名(mybatis-config.xml)
<!-- typeAlias:对类取别名、type:java类型 (全类名)alias:别名(随意取)-->
<typeAliases>
<typeAlias type="com.xxx.dao.modle.User" alias="user"/>
</typeAliases>
<!-- 扫包式:包中所有的实体类别名为驼峰式 -->
<typeAliases>
<package name="com.xxx.dao.modle"/>
</typeAliases>
拓展
使用标签自定义别名(不常用)
// 手动自定义别名
@Alias("user")
public class User {
private Integer id;
private String name;
}
其他配置
开启日志
记录系统运行过程(mybatis-config.xml)
<configuration>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
</configuration>
开启第三日志
1、引入log4j依赖(log4j.jar)
2、在全局配置文件中开启log4j的日志
<configuration>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
</configuration>
3、src中引入log4j配置文件(log4j.properties)
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=D://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=D://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =D://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
映射(mapping)
将数据库中的表中记录转为(映射)java实体类的对象
自动映射
MyBatis自动将表中数据转为JAVA实体类对象
前提:(数据库)字段名与(实体类)属性名一致
方案一
SQL语句中为提取字段取别名
public class User {
private Integer uId;
private String uName;
private String uAge;
}
<select id="getAllStudent" resultType="student">
<!-- 为提取字段取别名 -->
SELECT u_id uId,u_name uName,u_age uAge FROM user;
</select>
方案二
setting:开启驼峰命名转换
<configuration>
<settings>
<!-- 例:u_id(数据库) == uId(实体类) -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
方案三
手动映射(对应接口的xml - mapper标签下)
<!--type:绑定实体类对象-->
<!--id:自定义resultMap -->
<resultMap type="user" id="myuser">
<!--id:指定主键映射规则-->
<!--column:指定(数据库)字段列-->
<!--property:指定(实体类)属性对象-->
<id column="u_id" property="uId"/>
<!--result:指定非主键映射规则-->
<!--column:指定(数据库)字段列-->
<!--property:指定(实体类)属性对象-->
<result column="u_name" property="uName"/>
</resultMap>
查询语句中通过resultMap属性引入手动映射自定义id