Mybatis用于简化Java当中对于JDBC的操作,它将连接数据库,执行SQL命令自动化实现
<dependencies>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.7version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.3version>
dependency>
dependencies>
根据需要可以更改版本之类的东西
习惯上命名为mybatis-config.xml 存放的位置在src/main/resources目录下
DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/MyBatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
mappers>
configuration>
有几个标签,其中environments是用于配置数据库的环境,这块的type是JDBC,所有的事务是手动提交的。
mappers是用于引入映射文件。
Mybatis当中存在面向接口编程
使用JDBC的时候需要将MySQL中的数据转换为Java数据,是使用了反射,所以需要一个实体类对象对应着MySQL当中的表,创建一个User类
创建一个Mapper接口,Mybatis中的Mapper接口相当于以前的dao,
public interface UserMapper{
int insertUser();
}
类似与上面的接口。
ORM (Object Relationship Mapping) 对象关系映射
映射文件的命名规则:
DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.mybatis.mapper.UserMapper">
<insert id="insertUser">
insert into t_user values(null,'张三','123',23,'女')
insert>
mapper>
例如上面的,因为我实现了一个insert方法,所以这里的标签就是 然后后面的id是SQL语句的唯一标识,指向你要实现的接口方法。。
MyBatis面向接口编程的两个一致:
public class UserMapperTest {
@Test
public void testInsertUser() throws IOException {
//读取MyBatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
//SqlSession sqlSession = sqlSessionFactory.openSession();
//创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//通过代理模式创建UserMapper接口的代理实现类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句
int result = userMapper.insertUser();
//提交事务
//sqlSession.commit();
System.out.println("result:" + result);
}
}
MyBatis提供了一个操作数据库的对象叫SqlSession,所以我们要获取SqlSession。
Sqlsession代表java程序与数据库的会话
一个接口要想实现实例对象,得要有一个实例类,但是Mapper只有接口没有实例类,有一个方法为SqlSession.getMapper(Class)
传入一个T.class的时候会返回一个T的实例对象,这步代码使用的是代理模式
最后直接指向Sql语句即可。
但是要注意的是因为是要手动提交事务,所以得写一个commit方法,才能在数据库当中看到变化。
因为是手动的commit,为了不那么麻烦我们可以在创建usermapper对象的时候将自动提交打开
SqlSession sqlSession = sqlSessionFactory.openSession(true);
这样就不用写commit,也可以提交
添加log4j依赖
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
加入配置文件
DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
layout>
appender>
<logger name="java.sql">
<level value="debug" />
logger>
<logger name="org.apache.ibatis">
<level value="info" />
logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
root>
log4j:configuration>
其中配置文件当中的level value代表日志输出的级别
其中的优先度为FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试) 从左到右打印的内容越来越详细。
DOCTYPE configuration
PUBLIC "-//MyBatis.org//DTD Config 3.0//EN"
"http://MyBatis.org/dtd/MyBatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties">properties>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
settings>
<typeAliases>
<package name="com.atguigu.mybatis.bean"/>
typeAliases>
<environments default="mysql_test">
<environment id="mysql_test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
dataSource>
environment>
environments>
<mappers>
<package name="com.atguigu.mybatis.mapper"/>
mappers>
configuration>
其中往里面加标签的时候,必须严格遵守(有的标签可以不写,但顺序一定不能乱):properties、settings、typeAliases、typeHandlers、objectFactory、objectWrapperFactory、reflectorFactory、plugins、environments、databaseIdProvider、mapper。
创建包的时候使用\\来写,因为包是标签存在的,在这个地方要是使用.来创建包,会显示一个文件名称为XXX.XXX.XXX,不能体现到标签的用处,这是要注意的。
其中Mybatis的增删改都是返回一个整数,为被影响的行数,这和上文的insert插入操作大同小异,这里不做过多赘述。
下面主要要看查的操作:
<select id="getUserById" resultType="com.atguigu.mybatis.bean.User">
select * from t_user where id = 2
select>
<select id="getUserList" resultType="com.atguigu.mybatis.bean.User">
select * from t_user
select>
其中第一个是查一个实体类,第二个是查集合
查询标签当中多了一个叫做resulType的东西,这是因为在MySQL查找到东西返回类型的时候,需要去指定类型返回,resultType是自动映射,属于属性名称和字段名称一致的情况。会直接生成User类对象返回。
还有一种情况是不对应的,这个时候就需要另外一种叫做自定义映射resultMap,用于一对多,或者多对一的情况。
注意:当查询的数据为多条时,不能使用实体类作为返回值,只能使用集合,否则会抛出异常TooManyResultsException;但是若查询的数据只有一条,可以使用实体类或集合作为返回值。