MyBatis下载地址:https://github.com/mybatis/mybatis-3
IDE:idea 2019
构建工具:maven 3.6.0
MySQL版本:MySQL 5.7
MyBatis版本:MyBatis 3.5.7
引入依赖
<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.49version>
dependency>
dependencies>
MyBatis官方推荐MyBatis的核心配置文件: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.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
mappers>
configuration>
public interface UserMapper {
/**
* 添加用户信息
* @return
*/
int insertUser();
}
ORM对象关系映射
对象:Java的实体类对象
关系:关系型数据库(MySQL)
映射:二者之间的关系
Java | MySQL |
---|---|
类 | 表 |
属性 | 字段/列 |
对象 | 记录/行 |
1.映射文件的命名规则:
一般为实体类的类名+Mapper.xml 例如:UserMapper类对应的配置文件为UserMapper.xml
一个映射文件对应一个实体类,对应一张表的操作
MyBatis映射文件用于编写SQL,访问以及操作表中的数据
MyBatis映射文件存放的位置是/src/main/resources/mappers目录下
2.MyBatis中面向接口操作数据,要保证两个一致
mapper接口的全类名和映射文件的命名空间(namespace)保持一致
mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致
DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yxm.test.UserMapper">
<insert id="insertUser">
insert into user values (null,'springyang','123456');
insert>
mapper>
package com.yxm.test;
import com.yxm.test.dao.UserMapper;
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.InputStream;
public class UserTest {
@Test
public void test1() throws Exception {
//读取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);
}
}
需要注意:测试类要在src/test下新建测试类才能使用junit测试,因为pom文件中已经指定了scope 为test,如果不需要可删除。
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
<settings>
<setting name="logImpl" value="LOG4J"/>
settings>
### 配置根/在什么地方会打印日志 ###
log4j.rootLogger = debug,console,fileAppender
### 设置输出sql的级别,其中logger后面的内容全部为jar包中所包含的包名 ###
log4j.logger.org.apache=dubug
log4j.logger.java.sql.Connection=dubug
log4j.logger.java.sql.Statement=dubug
log4j.logger.java.sql.PreparedStatement=dubug
log4j.logger.java.sql.ResultSet=dubug
### 配置输出到控制台 ###
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{ABSOLUTE} %5p %c{1}:%L - %m%n
### 配置输出到文件 ###
log4j.appender.fileAppender = org.apache.log4j.FileAppender
log4j.appender.fileAppender.File = logs/log.log
log4j.appender.fileAppender.Append = true
log4j.appender.fileAppender.Threshold = DEBUG
log4j.appender.fileAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
以上配置会同时打印到控制台并生成日志文件
核心配置文件中的标签必须按照固定的顺序: properties?,settings?
typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,refl
ectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?
引入外部properties文件
新建外部jdbc.properties文件,连接数据库
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/ssm
jdbc.username = root
jdbc.password = 123456
<properties resource="jdbc.properties"/>
<environments default="development">
<environment id="development">
<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>
MyBatis标签属性配置,例如日志配置。
设置类型别名
typeAlias:设置某个类型的别名
type:设置需要设置别名的类型
alias:设置某个类型的别名,若不设置该属性,那么该类型拥有默认的别名,即类名
<typeAliases>
<typeAlias type="com.yxm.test.pojo.User">typeAlias>
typeAliases>
以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写
<typeAliases>
<package name="com.yxm.test.pojo">package>
typeAliases>
配置多个连接数据库的环境
属性default:设置默认使用的环境的id
transactionManager:设置事务管理方式type=“JDBC|MANAGED”
JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,事 务的提交或回滚需要手动处理
MANAGED:被管理,例如Spring
dataSource:配置数据源 属性:type:
设置数据源的类型 type=“POOLED|UNPOOLED|JNDI”
POOLED:表示使用数据库连接池缓存数据库连接
UNPOOLED:表示不使用数据库连接池
JNDI:表示使用上下文中的数据源
mapper 引入单个映射文件
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
mappers>
package以包为单位引入配置文件
<mappers>
<package name="com.yxm.test.mappers"/>
mappers>
以包为单位引入映射文件的两个要求
1.mapper接口所在的包和映射文件所在的包要一致。
2.mapper接口要和映射文件的名字一致。
<insert id="insertUser">
insert into user values (null, 'springyang', '123456');
</insert>
<delete id="deleteUser">
delete from user where id=12;
</delete>
<update id="updateUser">
update user set username='yxm' where id=1;
</update >
<select id="getUserById" resultType="com.yxm.test.pojo.User">
select * from user where id = 2
</select>
返回值User
<select id="getUserList" resultType="com.yxm.test.pojo.User">
select * from user
</select>
返回值List
查询select标签必须设置resultType或者resultMap,用于设置实体类和数据库的映射关系
resultType:自动映射,用于属性名和表中字段名一致的情况
resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况
${}本质就是字符串拼接,#{}的本质就是占位符赋值,
#{}在MyBatis作为参数时,会将参数转化为?,相当于JDBC中的preparestatment,使用#{}可以防止SQL注入。
/**
* 模糊查询
*/
List<User> queryLike();
<select id="queryLike" resultType="com.yxm.test.pojo.User">
SELECT * FROM USER WHERE username LIKE '%m%'
</select>
/**
* 批量删除
*/
int deleteUser();
<delete id="deleteUser">
delete from user where id in ('11','12')
</delete>
/**
* 动态设置表名
*/
List<User> getUsers(@Param("tableName") String tableName);
<select id="getUsers" resultType="com.yxm.test.pojo.User">
select * from ${tableName}
</select>
resultMap处理字段和属性的映射关系,常用属性如下:
属性 | 说明 |
---|---|
父标签 | |
id | 表示自定义映射的唯一标识 |
type | 查询数据映射的实体类类型,即查询结果返回实体类 |
子标签 | |
id | 设置主键的映射关系 |
result | 设置普通字段的映射关系 |
association | 设置多对一的映射关系 |
collection | 设置一对多的映射关系 |
property | 设置实体类中的属性名 |
column | 设置表中的字段名 |
<resultMap id="userMap" type="User">
<id property="id" column="id"></id>
<result property="username" column="user_name"/>
<result property="password" column="password"/>
</resultMap>
<select id="queryUserMap" resultMap="userMap">
select * from user
</select>
<select id="getEmpList" resultType="Emp">
select * from t_emp
where 1=1
<if test="ename != '' and ename != null">
and ename = #{ename}
</if>
<if test="age != '' and age != null">
and age = #{age}
<if test="sex != '' and sex != null">
and sex = #{sex}
</select>
<select id="getEmpList2" resultType="Emp">
select * from t_emp
<where>
<if test="ename != '' and ename != null">
ename = #{ename}
</if>
<if test="age != '' and age != null">
and age = #{age}
</if>
<if test="sex != '' and sex != null">
and sex = #{sex}
</if>
</where>
</select>
<insert id="insertEmp">
insert into t_emp values
<foreach collection="emps" item="emp" separator=",">
(null,#{emp.ename},#{emp.age},#{emp.sex},#{emp.email},null)
</foreach>
</insert>
属性:
collection:设置要循环的数组或集合
item:表示集合或数组中的每一个数据
separator:设置循环体之间的分隔符
open:设置foreach标签中的内容的开始符
close:设置foreach标签中的内容的结束符
<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>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-maven-pluginartifactId>
<version>1.3.0version>
<dependencies>
<dependency>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-coreartifactId>
<version>1.3.2version>
dependency>
<dependency>
<groupId>com.mchangegroupId>
<artifactId>c3p0artifactId>
<version>0.9.2version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.8version>
dependency>
dependencies>
plugin>
plugins>
build>
文件名必须是:generatorConfig.xml
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="DB2Tables" targetRuntime="MyBatis3">
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis"
userId="root"
password="123456">
jdbcConnection>
<javaModelGenerator targetPackage="com.atguigu.mybatis.pojo" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
javaModelGenerator>
<sqlMapGenerator targetPackage="com.atguigu.mybatis.mapper" targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true" />
sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.atguigu.mybatis.mapper" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
javaClientGenerator>
<table tableName="t_emp" domainObjectName="Emp"/>
<table tableName="t_dept" domainObjectName="Dept"/>
context>
generatorConfiguration>