Maven配置mybatis依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
Mysql驱动:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
创建mybatis配置文件:
IDEA放在resources文件夹:
<?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>
<!-- 别名 -->
<typeAliases>
<package name="pojo"/>
</typeAliases>
<!-- 数据库环境 -->
<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/smbms?zeroDateTimeBehavior=convertToNull"/>
<property name="username" value="root"/>
<property name="password" value="188278"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件 -->
<mappers>
<mapper resource="daoMapers/User.xml"/>
</mappers>
</configuration>
其中,
<typeAliases>
<package name="pojo"/>默认名称,指定包下的javabean非限定类名
</typeAliases>
创建实体类:
创建DAO层的接口,定义访问数据库的方法:
创建映射文件,IDEA放在resources文件夹下:
<?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="dao.UserDao">
<select id="findById" resultType="User" parameterType="int">
select * from smbms_user where id = #{id} #{}中写参数名称
</select>
</mapper>
Mybatis配置文件中指定映射文件:
<mappers>
<mapper resource="daoMapers/User.xml"/>
</mappers>
Namespace值为DAO层的接口,select的id值为接口中方法名。
获取DAO对象:
// 根据 mybatis-config.xml 配置的信息得到 sqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 然后根据 sqlSessionFactory 得到 session
SqlSession session = sqlSessionFactory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
User user = userDao.findById(3);
session.close();
通过session对象的getMapper方法即可获取dao对象,通常将获取session封装到MybatisUtils类。
查询
如上,使用select标签
Select的parameterType可以是java基础类型,也可以是实体类,但只能传一个参数:
#{中写实体类中的属性名}
自由传入多个参数:
使用@Param注解,不用parameterType属性。
#{}中写@Param注解的名称
Select标签的返回类型:
resultType :直接表示返回类型,直接返回基本数据类型或实体类。如果sql结果集字段名和实体类属性名相同则自动映射,如果数据类型不相同会自动转换。以上就是用的resultType。
resultMap:自己配置结果集到实体类的映射。
在User实体类增加属性:
映射文件ResultMap:
<select id="findById" parameterType="int" resultMap="r1">
select u.id as uid,u.userName,u.userCode,u.userPassword,r.id as rid,r,roleName,r.creationTime
from smbms_user u join smbms_smbms_role
on u.userRole=r.id
where uid=#{id}
</select>
<resultMap id="r1" type="User">
<id column="uid" property="id"/>
<result column="roleName" property="roleName"/>
</resultMap>
Column为查询结果集中的列名,property是实体类中的属性。
如上,手动映射了id和rolename属性,其他属性自动映射。
一对多映射
使用collection标签
如一个用户(user表)有多个地址(adress表)。在用户实体类中增加adress的List属性:
映射文件:
<select id="findById" resultMap="r1" parameterType="int">
select u.id,u.userName,a.id as aid,a.addressDesc from smbms_user u join smbms_address a
on u.id=a.userId
where u.id = #{id}
</select>
<resultMap id="r1" type="pojo.User">
<id column="id" property="id"/>
<result column="userName" property="userName"/>
<collection ofType="pojo.Address" property="addressList">
<id column="aid" property="id"/>
<result column="addressDesc" property="addressDesc"/>
</collection>
</resultMap>
使用了collection等嵌套类型将不会自动映射,要想自动映射要加上autoMapping属性或者在配置文件加上:
<settings>
<setting name="autoMappingBehavior" value="FULL"/>
</settings>
推荐不要自动映射。
多表查询有同名字段id,需要用as取别名。
多对一
用association标签进行嵌套
一个用户(User)只有一个角色(Role),一个角色有多名用户
在User中添加Role属性:
映射文件:
<select id="findByName" resultMap="r2" parameterType="pojo.User">
select u.id as uid,u.userName,r.id as rid,r.roleName from smbms_user u join smbms_role r
on u.userRole=r.id
where userName = #{userName}
</select>
<resultMap id="r2" type="pojo.User">
<id column="uid" property="id"/>
<result column="userName" property="userName"/>
<association property="role" javaType="Role">
<id column="rid" property="id"/>
<result column="roleName" property="roleName"/>
</association>
</resultMap>
注解方式实现dao层接口
通过注解方式就不用配置映射文件了
public interface UserDao {
@Select("select * from tab_user where uid=#{id}")
public User findById(int id);
}
配置文件(mybatis-config.xml)中引入映射:
<!-- 引入映射文件 -->
<mappers>
<!-- <mapper class="com.test.dao.UserDao"></mapper>-->
<package name="com.test.dao"/>
</mappers>
插入
插入需要调用sqlsession.commit()方法提交后才能插入成功
插入当前日期用now()函数
insert into tab_favorite values(#{rid}, now(), #{uid})
Mybatis使用log4j输出sql执行日志
Pom.xml加入log4j依赖:
<!--日志开始-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</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>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<!--日志end-->
Mybatis Generator
可以自动帮我们生成数据库中的实体类,DAO和基础增删查改的映射文件.
pom.xml中加入依赖:
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<!-- 在控制台打印执行日志 -->
<verbose>true</verbose>
<!-- 重复生成时会覆盖之前的文件-->
<overwrite>true</overwrite>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
</configuration>
<!-- 该插件需要使用数据库驱动-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
resource中创建generatorConfig.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!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:起个名字 -->
<!-- targetRuntime:设置生成的文件适用于那个 mybatis 版本 -->
<context id="default" targetRuntime="MyBatis3">
<property name="javaFileEncoding" value="UTF-8"/>
<!--optional,指在创建class时,对注释进行控制-->
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--jdbc的数据库连接 wg_insert 为数据库名字-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/ch04_test2?useUnicode=true&characeterEncoding=utf-8&serverTimezone=UTC" userId="root"
password="1234"></jdbcConnection>
<!--非必须,类型处理器,在数据库类型和java类型之间的转换控制-->
<javaTypeResolver>
<!-- 默认情况下数据库中的 decimal,bigInt 在 Java 对应是 sql 下的 BigDecimal 类 -->
<!-- 不是 double 和 long 类型 -->
<!-- 使用常用的基本类型代替 sql 包下的引用类型 -->
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- targetPackage:生成的实体类所在的包 -->
<!-- targetProject:生成的实体类所在的硬盘位置 -->
<javaModelGenerator targetPackage="com.test.domain.entity"
targetProject="src/main/java">
<!-- 是否允许子包 -->
<property name="enableSubPackages" value="false"/>
<!-- 是否对modal添加构造函数 -->
<property name="constructorBased" value="true"/>
<!-- 是否清理从数据库中查询出的字符串左右两边的空白字符 -->
<property name="trimStrings" value="true"/>
<!-- 建立modal对象是否不可改变 即生成的modal对象不会有setter方法,只有构造方法 -->
<property name="immutable" value="false"/>
</javaModelGenerator>
<!-- targetPackage 和 targetProject:生成的 mapper 文件的包和位置 -->
<sqlMapGenerator targetPackage="daoMappers"
targetProject="src/main/resources">
<!-- 针对数据库的一个配置,是否把 schema 作为字包名 -->
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- targetPackage 和 targetProject:生成的 interface 文件的包和位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.test.dao.interfaces" targetProject="src/main/java">
<!-- 针对 oracle 数据库的一个配置,是否把 schema 作为字包名 -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- tableName是数据库中的表名,domainObjectName是生成的JAVA模型名,后面的参数不用改,要生成更多的表就在下面继续加table标签 -->
<table tableName="course" domainObjectName="Course"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false"/>
<table tableName="score" domainObjectName="Score"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false"/>
<table tableName="Users" domainObjectName="User"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false"/>
</context>
</generatorConfiguration>
如果IDEA提示URI is not registered,alt+shit+enter导入该dtd即可.
数据库中的表:
generator会根据配置文件中配置的实体类,DAO和映射文件位置来放置生成的文件,我们需先创建:
双击generate:
生成了我们配置文件中配置的table的实体类,dao和映射文件: