mybatis 学习笔记(一):mybatis 初认识
简介
MyBatis是一个Java持久层框架,它通过XML描述符或注解把对象与存储过程或SQL语句关联起来。mybatis 可以将 preparedStatement 中的输入参数自动进行映射,将查询结果集灵活映射成 java 对象。所以使用 mybatis 我们就可以不用写原生 jdbc 程序,并且能很好的避免 原生 jdbc 中 SQL 注入的问题。
一个完整 mybatis 程序的操作过程
1 配置 mybatis 的全局配置文件 SqlMapConfig.xml(名称不固定),该文件配置了数据源。事务等 mybatis 运行环境。
2 创建 java 文件,封装数据库对象。
3 配置映射文件 mapper.xml(名称不固定), 在该文件中,我们将对数据库封装的对象进行 SQL 语句操作。并在全局配置文件中通过 mapper
加载该映射文件。
4 另外创建java 文件,通过配置文件,加载 mybatis 运行环境,创建 SqlSessionFactory
会话工厂( SqlSessionFactory
在实际使用时按单例方式)。
5 通过 SqlSessionFactory
创建 SqlSession
。 SqlSession
是一个面向用户接口(提供操作数据库方法),实现对象是线程不安全的,建议 sqlSession
应用场合在方法体内。
6 调用 sqlSession
的方法去操作数据。如果需要提交事务,需要执行 SqlSession
的 commit()
方法。
7 释放资源,关闭 SqlSession
。
mybatis 实例
下面我们通过一个具体的例子来实现 mybatis 的查询功能。
前提条件
首先是运行 mybatis 需要的前提条件,在这里我们需要连接数据库,所以需要 java 连接 MySQL 数据库的 jar 包,其次还需要 mybatis 的核心包,如果还需要用到日志功能的话还需要 log4j.jar
等,mybatis 的相关依赖可以在 GitHub 上找到: mybatis 地址
我们通过 maven 来导入具体需要的 jar 包,maven 的 pom.xml 中配置如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.itcast</groupId> <artifactId>mybatis</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- mysql 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.12</version> </dependency> <!-- test 测试文件 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- mybatis 核心jar包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- mybatis 附加功能包,如日志功能等 --> <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</artifactId> <version>1.9.6</version> </dependency> <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant-launcher</artifactId> <version>1.9.6</version> </dependency> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> <version>5.2</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.5</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.22.0-GA</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>ognl</groupId> <artifactId>ognl</artifactId> <version>3.1.16</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> <scope>test</scope> </dependency> </dependencies> </project>
数据库配置
创建 sample 数据库,建立 user 表,添加 id,username,sex,birthday,address 五个字段,添加记录。
如下:
创建全局配置文件和日志文件
在 resources 文件夹下新建 SqlMapconfig.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> <!-- 和spring整合后 environments配置将废除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理,事务控制由mybatis--> <transactionManager type="JDBC" /> <!-- 数据库连接池,由mybatis管理--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql:///sampledb" /> <property name="username" value="root" /> <property name="password" value="" /> </dataSource> </environment> </environments> <!-- 加载映射文件 --> <mappers> <mapper resource="sqlmap/User.xml"/> </mappers> </configuration>
同样的,在该文件夹下创建 log4j.properties 日志文件,设置为 DEBUG 模式:
# Global logging configuration #开发环境中使用 DEBUG 模式,上线后使用 INFO 或 ERROR 模式 log4j.rootLogger=DEBUG, stdout # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
封装数据库对象,创建映射文件
创建 User.java ,封装好数据库对象:
package cn.itcast.mybatis.po; import java.util.Date; public class User { //属性名要和数据库表的字段对应 private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", sex='" + sex + '\'' + ", birthday=" + birthday + ", address='" + address + '\'' + '}'; } }
创建映射文件 User.xml,执行 SQL 查询操作:
<?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"> <!-- namespace 命名空间,作用就是对sql进行分类化管理,理解为sql隔离 --> <mapper namespace="test"> <!-- 通过select执行数据库查询 id:标识映射文件中的sql,称为statement的id 将sql语句封装到mappedStatement对象中,所以将id称为statement的id parameterType:指定输入参数的类型 #{}标示一个占位符 #{value}其中value表示接收输入参数的名称,如果输入参数是简单类型,那么#{}中的值可以任意 resultType:指定sql输出结果的映射的java对象类型,select指定resultType表示将单条记录映射成java对象 --> <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User"> SELECT * FROM USER WHERE id=#{value} </select> </mapper>
创建测试文件,执行 SQL 操作
文件目录结构如图所示:
MybatisFirst.java:
package cn.itcast.mybatis.first; import cn.itcast.mybatis.po.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; public class MybatisFirst { //根据 id 查询用户,得到一条记录结果 @Test public void findUserByIdTest() throws IOException { //mybatis 配置文件 String resource = "SqlMapConfig.xml"; //得到配置文件流 InputStream inputStream = (InputStream) Resources.getResourceAsStream(resource); //创建会话工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //通过工厂得到 SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); //通过 SqlSession 操作数据库 //第一个参数:映射文件中 statement 的 id,等于=namespace+"."+statement 的id //第二个参数:指定和映射文件中所匹配的 paramenterType 类型的对象 User user = sqlSession.selectOne("test.findUserById", 1); System.out.println(user); //释放资源 sqlSession.close(); } }
运行 findUserByIdTest()
方法, 查询 id 值为1的用户信息,可以看到控制台正确返回信息:
至此,一个完整的 mybatis 程序关于查询操作我们就实现出来了。
条路上挣扎,也想在IT行业拿高薪,可以参加我们的训练营课程,选择最适合自己的课程学习,技术大牛亲授,7个月后,进入名企拿高薪。我们的课程内容有:Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点。如果你想拿高薪的,想学习的,想就业前景好的,想跟别人竞争能取得优势的,想进阿里面试但担心面试不过的,你都可以来,q群号为:856443934
注:加群要求
1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加。
2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。
3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。
4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。
5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!