MyBatis相关的配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k5QP9muU-1629555012796)(C:\Users\14496\AppData\Roaming\Typora\typora-user-images\image-20210820211708241.png)]
一、什么是MyBatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。(官方定义),自我感觉就是对JDBC进行封装处理
二、安装MyBatis
2.1 安装JAR包
jar包官方下载地址:https://mybatis.org/mybatis-3/zh/index.html(从apache迁移到github可能访问有点慢)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nsEQ703L-1629555012798)(C:\Users\14496\AppData\Roaming\Typora\typora-user-images\image-20210820211954680.png)]
其中mybatis为核心包,其中lib中还有依赖包,一起导入到IDEA中使用,特别注意还要有数据库驱动包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DKFkY3i2-1629555012801)(C:\Users\14496\Desktop\MyBatis.assets\image-20210821085108665.png)]
三、XML配置
3.1 properties配置
这些属性可以在外部进行配置,并可以进行动态替换
driver=oracle.jdbc.driver.OracleDriver //加载驱动
url=jdbc:oracle:thin:@localhost:1521:XE // url
username=SCOTT //自己的账号
password=TIGER //自己的密码
3.2 mybatis.config.xml配置
在【src】目录下创建 MyBaits 的主配置文件 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">
<configuration>
<properties resource="db.properties" />
<typeAliases>
<package name="com.yjxxt.pojo"/>
</typeAliases>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<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="com/yjxxt/mappers/DeptMapper.xml"/>
<mapper resource="com/yjxxt/mappers/EmpMapper.xml"/>
<mapper resource="com/yjxxt/mappers/EmpMapper2.xml"/>
</mappers>
</configuration>
3.3 SQL的映射文件
在 Package【mapper】下新建一个【Deptmappers.xml】文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o5gkDcEi-1629555012804)(C:\Users\14496\Desktop\MyBatis.assets\image-20210821084608446.png)]
- 由于上面配置了
<typeAliases> 别名,所以在这里的 resultType 可以直接写 Dept,而不用写类的全限定名 mapper.dept namespace 属性其实就是对 SQL 进行分类管理,实现不同业务的 SQL 隔离- 注意:不要忘记mybatis核心xml文件中的mapper配置
3.4 测试
public class TestUser {
public static void main(String[] args) throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
List<User> list =
session.selectList("com.xxxx.mappers.UserMapper.queryAll");
System.out.println(list);
session.close();
}
}
四、常用的查询方法
4.1 selectList
selectList(“命名空间.id”) 用户查询多条数据情况,返回一个List集合, 没有查到数据返回空集合,不是 null
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
List<Dept> list= session.selectList("com.liufeng.mappers.DeptMapper.selectAll");
list.forEach(System.out::println);
session.close();
4.2 selectOne
selectOne(“命名空间.id”) 用于查询单条数据,返回一个数据, 如果没有查到返回null
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
Dept dept = session.selectOne("com.liufeng.mappers.DeptMapper.queryDeptByDeptno",30);
System.out.println(dept);
session.close();
4.3 selectMap
selectMap(“命名空间.id”,key的字段名) 用于查询多条记录情况, 返回Map集合, 需要指定那个属性 作为key, sql查询结果作为value,指定的字段值作为key, 如果查不到, 返回一个空map集合,不是null
//1.加载核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2.获取SqlSessionFactory实例
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3.获取回话
SqlSession session = factory.openSession();
//4.使用
// <K, V> Map<K, V> selectMap(String var1, String var2);
// <K, V> Map<K, V> selectMap(命名空间.id, sql语句的实参, 作为key的字段名); 注意: 作为key的字段应为是一个唯一性较高的字段
Map<Integer,Dept> map = session.selectMap("com.liufeng.mappers.DeptMapper.queryDeptByName","xixi","dname");
System.out.println(map);
//5.关闭回话
session.close();
五、通过properties简化配置
5.1 src下定义配置文件db.properties
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VHDdVaHT-1629555012805)(C:\Users\14496\Desktop\MyBatis.assets\MyBatis.assets\image-20210821211147882.png)]
5.2 properties标签
在核心的xml配置文件里面加载指定的外部properties文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vZKHk2oz-1629555012806)(C:\Users\14496\Desktop\MyBatis.assets\MyBatis.assets\image-20210821211351791.png)]
5.3 properties的作用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dxpd4Snz-1629555012808)(C:\Users\14496\Desktop\MyBatis.assets\MyBatis.assets\image-20210821211523515.png)]
通过对properties文件的配置,获取properties文件中数据时候,要通过${}的方式获取,这样更换数据库,或者修改数据库的密码后只用修改对应的properties文件
六、typeAliases的配置使用
6.1 给User类定义别名为a
<typeAliases>
<typeAlias type="com.liufeng.pojo.User" alias="a"/>
</typeAliases>
6.2 省略alias属性
<typeAliases>
<typeAlias type="com.xxxx.pojo.User"/> alias属性不写,默认类名,不区分大小写
</typeAliases>
6.3 package标签
<typeAliases>
<package name="com.xxxx.pojo"/> <!-- 包下所有的类默认类名 -->
</typeAliases>
<select id="queryAll" resultType="u">
select id,uname,upwd,birthday from t_user
</select>
<select id="queryById" resultType="User">
select id,uname,upwd,birthday from t_user where id=125
</select>
七、Log4J日志
7.1 Log4J日志的简介
日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日 志记录。在apache网站:https://logging.apache.org/log4j/2.x/ 可以免费下载到Log4j最新版本的软件包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OcpMKTYE-1629555012809)(C:\Users\14496\Desktop\MyBatis.assets\MyBatis.assets\image-20210821212718069.png)]
7.2日志级别
分为五个级别: DEBUG(人为调试信息)、INFO(普通信息)、WARN(警告)、ERROR(错误)和FATAL(系统错误) 这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用来指定这条日志信息的重 要程度,明白这一点很重要,Log4j有一个规则:只输出级别不低于设定级别的日志信息,假设Loggers 级别设定为INFO,则INFO、WARN、ERROR和FATAL级别的日志信息都会输出,而级别比INFO低的 DEBUG则不会输出。
7.3 Lof4j的使用
7.3.1 导包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6d8Dmk9D-1629555012810)(C:\Users\14496\Desktop\MyBatis.assets\MyBatis.assets\image-20210821213109972.png)]
7.3.2 配置文件
可以使用properties或者xml进行配置,使用一个 log4j.properties 的配置文件, 会设定 log4j 的设置信息, 例如日志级别, 日志输出方式, 日志格式等等.
# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=INFO, CONSOLE
# log4j.rootCategory=INFO, CONSOLE, LOGFILE
# 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=- %m %c %l %d{yyyy-MMdd
HH:mm:ss}%n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:/test.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=- %m %l%n
7.4 Mybatis对Log4J的支持
7.4.1 通过settings标签开启 log4j 的支持
settings用于设置 MyBatis 在运行时的行为方式, 例如:缓存, 延迟加载, 日志等.
<!-- settings标签 -->
<settings>
<!-- 设置MyBatis使用log4j日志支持 -->
<setting name="logImpl" value="LOG4J"/>
</settings>
7.4.2 局部调整日志级别, 定制日志的输出
# 提高整体日志级别
log4j.rootCategory=ERROR, CONSOLE
# 单独设置SQL语句的输出级别为DEBUG级别
# 方法级别
# log4j.logger.com.liufeng.mapper.UserMapper.selAll=DEBUG
# 类级别
# log4j.logger.com.liufeng.mapper.UserMapper=DEBUG
# 包级别
log4j.logger.com.liufeng.mapper=DEBUG
八、注解开发
8.1 Mybatis中注解的作用
使用注解一般用于简化配置文件. 但是, 注解有时候也不是很友好(有时候反而更麻烦), 例如动态 SQL等,所 以注解和配置文件可以配合使用
8.2 MyBatis 中常用的注解
8.2.1 CRUD 注解
- @Select: 类似于select标签
- @Insert: 类似于insert标签
- @Update: 类似于update标签
- @Delete: 类似于delete标签
package com.liufeng.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.liufeng.pojo.Student;
public interface StudentMapper {
@Select("select * from student")
List<Student> selAll();
@Insert("insert into student values (default, #{name}, #{age}, #{gender},
#{cid})")
int insStu(Student student);
@Update("update student set age=#{1} where id=#{0}")
int updStu(int id, int age);
@Delete("delete from student where id=#{0}")
int delStu(int id);
}
8.2.2其他注解
- @Results: 类似于resultMap标签
- @Result: 类似<resultMap的子标签
- @One: 类似于association标签
- @Many: 类似于collection标签
public interface StudentMapper {
@Select("select * from t_student")
@Results(
value = { @Result(column="id", property="id", id=true),
@Result(column="name", property="name"),
@Result(column="age", property="age"),
@Result(column="gender", property="gender"),
@Result(column="cid", property="cid"),
@Result(property="clazz",
one=@One(select="com.xxxx.mapper.ClazzMapper.selById"),
column="cid")
}
)
List<Student> sel();
}
public interface ClazzMapper {
@Select("select * from t_class where id=#{0}")
Clazz selById(int id);
}
九、逆向工程
mybatis-generator是一款mybatis自动代码生成工具,可以通过配置,快速生成pojo,mapper和xml文件. 官方网址:http://mybatis.org/generator/configreference/xmlconfig.html
generatorConfig.xml配置
<?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="Tables" targetRuntime="MyBatis3">
<property name="javaFileEncoding" value="UTF-8" />
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
<commentGenerator>
<property name="suppressDate" value="true" />
<property name="suppressAllComments" value="false" />
</commentGenerator>
<jdbcConnection
driverClass="oracle.jdbc.driver.OracleDriver"
connectionURL="jdbc:oracle:thin:@localhost:1521:xe"
userId="SCOTT"
password="TIGER">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<javaModelGenerator targetPackage="com.xxxx.pojo"
targetProject="mybatis12\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.xxxx.mappers"
targetProject="mybatis12\src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.xxxx.mappers" targetProject="mybatis12\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<table tableName="dept" domainObjectName="Dept"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false"></table>
<table tableName="emp" domainObjectName="Emp"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
le=“false” selectByExampleQueryId=“false”>
```
|