1. MyBatis实例
1.1 添加Mybatis依赖
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> </dependencies>
1.2 创建MyBatis配置文件
在 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> <!-- 配置数据源相关属性和事务 --> <environments default="development"> <!-- 可以配置多个数据源环境,默认使用default中的值 --> <environment id="development"> <!-- 使用jdbc的事务管理 --> <transactionManager type="JDBC" /> <!-- 配置数据源,并使用自带数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/emp?characterEncoding=utf-8" /> <property name="username" value="root" /> <property name="password" value="123" /> </dataSource> </environment> </environments> <!-- 配置映射文件,可配置多个 --> <mappers> <mapper resource="com/neusoft/po/Emp.xml" /> </mappers> </configuration>
transactionManager标签的type属性有两种取值:
- JDBC:全部使用jdbc的事务管理
- MANAGED:不使用事务管理,也从不提交
dataSource标签的type属性有三种取值:
- POOLED:使用Mybatis自带的数据库连接池
- UNPOOLED:不使用任何数据库连接池
- JNDI:jndi形式使用数据库连接
如果是spring直接在yml或者properties里写
spring: datasource: url: 'jdbc:mysql://localhost:3306/oa-0505?serverTimezone=UTC' username: 'root' password: '1314' driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: top.beinggod.oa.backend.pojo configuration: map-underscore-to-camel-case: true
1.3.创建po类
创建 Emp.java类
package com.neusoft.po; public class Emp { private Integer empno; private String ename; private String job; private String hiredate; private Double sal; private Integer deptno; @Override public String toString() { return empno+"\t"+ename+"\t"+job+"\t"+hiredate+"\t"+sal+"\t"+deptno; } //get/set方法... }
注意:po类属性名必须与数据库表的字段名一致。
1.4.创建映射文件
在 po 类所在包下,创建相同名称的映射文件:Emp.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="emp"> <select id="getEmpById" parameterType="int" resultType="com.neusoft.po.Emp"> select * from emp where empno = #{empno} </select> </mapper>
注意: mapper标签:映射文件的根标签。 mapper标签namespace属性:命名空间,对sql进行分类管理,可防止id重复
select标签:表示查询。 select标签id属性:此属性要唯一。这个id可称为statement的id。 select标签parameterType属性:sql参数的类型。 select标签resultType属性:sql语句执行后返回的类型。
sql语句:
#{}: 表示sql参数,一个占位符。
当parameterType属性为对象类型时:#{} 中的参数名为对象的属性名。 当parameterType属性为单个值时,参数名可以任意。
从映射文件中可以看到:MyBatis会根据字段名与实体对象中的属性名进行映射,从而实现自动将查询数据注入到实体对象的每一个属性中。这就是输出映射。
1.5.测试
package com.neusoft; import java.io.InputStream; 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 com.neusoft.po.Emp; public class Test { public static void main(String[] args) { try { //读取配置文件,获得配置文件信息 InputStream input = Resources.getResourceAsStream("SqlMapConfig.xml"); //通过配置信息创建SqlSessionFactory SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(input); //通过SqlSessionFactory打开数据库会话 SqlSession sqlSession = ssf.openSession(); //通过SqlSession的selectOne(返回一行记录时使用)方法执行sql语句 Emp emp = sqlSession.selectOne("emp.getEmpById",7521); System.out.println(emp); //关闭数据库会话 sqlSession.close(); } catch (Exception e) { e.printStackTrace(); } } }
- 当返回一条记录时,使用 SqlSession 的 selectOne 方法执行sql语句,MyBatis会将返回记录输出映射为一个java对象。
- 当返回多条记录时,使用 SqlSession 的 selectList 方法执行sql语句,MyBatis会将返回记录输出映射为一个java集合。
- selectOne 方法和 selectList 方法都只有两个参数:
第一个参数为指定的sql语句,根据映射文件中的id,注意要加上命名空间
第二个参数是给 sql语句参数传值(可以是一个值、或一个对象)
1.6.使用log4j输出日志
上面实例运行后,在控制台中只输出了查询结果,却没有中间的执行过程信息。这对我们开发时进行错误调试是非常不利的。我们希望在开发时,能够看到详细的执行过程
MyBatis默认使用log4j输出日志。所以,下面使用log4j来让MyBatis输出更多的日志信息。
- 添加log4j依赖
<!-- 使用log4j输出更多的日志信息 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
- 在resources文件夹中添加log4j配置文件(log4j.properties)
### direct log messages to stdout ### 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=%d{yyyy-MM-dd HH:mm:ss} %m%n ### direct messages to file mylog.log ### ### log4j.appender.file=org.apache.log4j.FileAppender ### log4j.appender.file.File=d:mylog.log ### log4j.appender.file.layout=org.apache.log4j.PatternLayout ### log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%n ### set log levels - for more verbose logging change 'debug?info?warn?error' ### ### log4j.rootLogger=debug,stdout,file log4j.rootLogger=debug,stdout