七、MyBatis(一)
1. MyBatis是持久层框架
持久层是分层开发中专门负责访问数据源的一层,Java项目中每一层都有自己的作用,持久层的作用就是访问数据源,把访问数据源的代码和业务逻辑代码分离开,有利于后期维护和团队分工开发。同时也增加了数据访问代码的复用性。
2. MyBatis是ORM框架
ORM,中文名称:对象/关系 映射。是一种解决数据库发展和面向对象编程语言发展不匹配问题而出现的技术。
3. 搭建第一个MyBatis框架
(1)创建数据库表
创建t_book表
(2)创建Maven项目
(3)添加依赖
<!--mysql驱动依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!--mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency>
(4)创建MyBatis全局配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/t_book?useSSL=false"></property><property name="username" value="root"></property><property name="password" value="123456"></property></dataSource></environment></environments>
</configuration>
(5)创建实体类
public class Book {private int id;private String name;private String author;private double price;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}
}
(6)创建映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper><!-- public List selectAllBooks(){}--><select id="selectAllBooks" resultType="org.example.pojo.Book">select * from t_book</select>
</mapper>
修改mabits.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/t_book?useSSL=false"></property><property name="username" value="root"></property><property name="password" value="yourpassword"></property></dataSource></environment></environments><mappers><mapper resource="mapper/BookMapper.xml"></mapper></mappers>
</configuration>
(7)编写测试类,启动项目
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="a.b"><!-- public List selectAllBooks(){}--><select id="selectAllBooks" resultType="org.example.pojo.Book">select * from t_book</select>
</mapper>
public class Test {public static void main(String[] args) throws IOException {//指定核心配置文件的路径:String resource = "mybatis.xml";//获取加载配置文件的输入流:InputStream inputStream = Resources.getResourceAsStream(resource);//加载配置文件,创建了一个工厂类:SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//通过工厂类获取一个会话:SqlSession sqlSession = sqlSessionFactory.openSession();//执行查询:List list = sqlSession.selectList("a.b.selectAllBooks");//遍历:for (int i = 0;i<=list.size()-1;i++){Book book = (Book)list.get(i);System.out.println(book.getId()+" "+book.getName()+" "+book.getAuthor()+" "+book.getPrice());}//关闭资源:sqlSession.close();}
}
4. 别名设置
Mybatis提供了别名机制可以对某个类起别名或给某个包下所有类起别名,简化resultType取值的写法。
在核心配置文件中,通过<typeAlias>标签明确设置的类型的别名。
· type:类型全限定路径
· alias:别名名称
<typeAliases><typeAlias type="org.example.pojo.Book" alias="Book"></typeAlias></typeAliases>
必须放在environments前面。
当类个数较多时,明确指定别名工作量较大,可以通过<package>标签指定包下全部类的别名。指定后所有类的别名就是类名。(也不区分大小写)
<typeAliases><typeAlias type="org.example.pojo.Book" alias="Book"></typeAlias><package name="org.example.pojo"/></typeAliases>
PS:明确指定别名和指定包的方式可以同时存在。
5. 属性文件配置
创建db.properties文件
url=jdbc:mysql://localhost:3306/t_book?useUnicode=true&characterEncoding=utf8
driver=com.mysql.cj.jdbc.Driver
username=root
password=yourpassword
修改mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties resource="db.properties"></properties><typeAliases><typeAlias type="org.example.pojo.Book" alias="b"></typeAlias><package name="org.example.pojo"/></typeAliases><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${driver}"></property><property name="url" value="${url}"></property><property name="username" value="${username}"></property><property name="password" value="${password}"></property></dataSource></environment></environments><mappers><mapper resource="mapper/BookMapper.xml"></mapper></mappers>
</configuration>
6. MyBatis启动日志功能
MyBatis框架内置日志工厂,日志工厂负责自动加载项目中配置的日志。MyBatis支持以下日志:
SLF4J、Apache Commons Logging、Log4j 2、Log4j、JDKlogging
添加log4j的依赖:
<dependency> <groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency>
在resources中创建log4j.properties配置文件。名称必须叫这个名字,扩展名必须是.properties
#log4j中定义的级别:fatal(致命错误)>>error(错误)>warn(警告)>info(普通信息)>debug(调试信息)>trace(跟踪信息)
log4j.rootLogger=DEBUG,console
### console ###
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
如果说你只是想看sql执行过程,那么可以整体调高,局部降低:将整个日志级别调为ERROR,然后mapper.xml涉及的内容级别降低为TRACE。这样整体的多余信息不会输出,然后mapper.xml中的涉及内容会详细打印,log4j.properties加入:
log4j.logger.a.b = TRACE