mybatis入门
Mybatis
mybatis基础
依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
mybatis.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><!-- 配置 -->
<properties /> <!-- 属性 -->
<settings /> <!-- 设置 -->
<typeAliases /> <!-- 类型命名 -->
<typeHandlers /> <!-- 类型处理器 -->
<objectFactory /> <!-- 对象工厂 -->
<plugins /> <!-- 插件 -->
<environments> <!-- 配置环境 -->
<environment> <!-- 环境变量 -->
<transactionManager /> <!-- 事务管理器 -->
<dataSource /> <!-- 数据源 -->
</environment>
</environments>
<databaseIdProvider /> <!-- 数据库厂商标识 -->
<mappers /> <!-- 映射器 -->
</configuration>
配置文件中的每一个标签有有它的位置,不能随意的改变。
获取SqlSession对象
//mybatis配置文件位置
String resource = "Mybatis.xml";
//mybatis配置文件输入流
InputStream in = Resources.getResourceAsStream(resource);
//以mybatis配置文件的内容获取sqlSessionFactory对象
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
//获得SQLSession对象,操作数据库
SqlSession sqlSession = sessionFactory.openSession();
执行SQL语句
编写mapper文件
<?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="com.offcn.mapper.UserMapper">
<insert id="insert" >
insert into users VALUES (#{id},#{name},#{password})
</insert>
</mapper>
根据mapper文件中的SQL语句
sqlSession.insert("com.offcn.mapper.UserMapper.insert",user);
sqlSession对象根据namespace+id找到SQL语句,将数据传入SQL语句,在执行SQL。
mapper接口方法
利用sqlSession.getMapper(Mapper.class)获取mapper对象,调用mapper接口的方法。
SqlSession session = MybatisUtil.getSession();
DepartmentMapper mapper = session.getMapper(DepartmentMapper.class);
Department department = mapper.selectByDid(1);
需要有一个接口,和一个namespace与接口路径完全相同,接口中的方法和mapper文件中的sql语句的id要一一对应。
本质上是根据路径名获取namespace,方法名获取id,传参相同。执行sqlSession的方法。
mapper文件与接口必须有以下要求
1、mapper文件中的namespace必须等于接口的全限定名
2、sql语句的id必须与方法名一致
3、sql中的paramterType属性必须与方法名中的相同
4、方法的返回值类型必须与resultType或者resultMap相同
mybatis.xml主要配置
environments
<environments default="environmentc3p0">
//jdbc基本连接配置
<environment id="environment">
<transactionManager type="JDBC"></transactionManager>
<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>
//c3p0连接池配置
<environment id="environmentc3p0">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="com.offcn.util.C3P0DataSourceFactory">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
别名配置
<typeAliases>
//单个别名配置
<typeAlias type="com.offcn.bean.User" alias="myUser"/>
//多个别名配置,所有当前包下的类的别名配置成类名
<package name="com.offcn.bean"/>
</typeAliases>
关联属性文件
<properties resource="jdbc.properties"/>
将数据库连接的信息放入一个专门的文件中,便于后期修改(配置文件不会被编译,修改时不需要进行反编译)
mapper映射文件
保存自动生成的主键
一般来说,在进行数据库创建时会将主键设为自增,在程序运行时不会设置主键的内容,而是交给数据库添加,这就造成了当前对象信息的缺失。
<insert id="insert1" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into users(name,password) VALUES (#{name},#{password})
</insert>
useGeneratedKeys:是否获取自动生成的主键
keyProperty:JavaBean中的那一条属性
keyColumn:数据库表中的那一列
设置后,在insert语句执行后,会自动对当前插入的类对象进行补全
ResultMap配置
用于解决数据库中列的名称与javabean的属性名不相同,当相同时,在select语句查询返回是回调用set方法,根据列名进行赋值,不同时,就需要通过resultMap告诉程序,哪个列与哪一条属性相对应。
<resultMap id="myEp" type="employee">
<id property="eid" column="eid"/>
<result property="ename" column="ename"/>
<association property="department" column="dept_id" javaType="Department"
select="com.offcn.mapper.DepartmentMapper.selectByDid"/>
</resultMap>
在一对多、多对多关系中,可使用association和collection标签是的获取的对象放入对应的属性中。
association单个对象
以Employee为例
public class Employee {
private int eid;
private String ename;
private Department department;
}
适用多对一
将从数据库查询到的数据放到当前对象中的引用对象中
1、
<association property="department" column="dept_id" javaType="Department"
select="com.offcn.mapper.DepartmentMapper.selectByDid"/>
select后跟引用类的查询SQL的namespace+id,传入参数,java类型,在当前对象中的属性,数据库中的列。
2、
<association property="department" column="dept_id" javaType="Department">
<result property="" column=""/>
</association>
property="department"代表是Employee中的哪一个属性,column="dept_id" 数据中的哪一列,javaType="Department"查询结果类型
result中的property对应Department的属性,column对应数据库表的列
collection 单或多个对象
适用一对多,多对多
多参数
单参数的情况下,在SQL语句中用#{任意字符串}即可表示
多参数时有三种解决方法:
1、封装javabean,将数据放在Javabean的属性中,在mapper中用get方法获取。
2、map集合,将数据放到map集合中,根据key获取value
3、@param注解,在接口的方法参数列表中加上注解
如(@param(“name”)String name)
#{}与${}
'#'{}可以看成?占位符
'$'{}会把他的所有内容都加载SQL语句中,会出现SQL注入的情况,表名需要输入数据时,使用‘$’{}
动态sql
1、if
格式:
<if test="name != null">
字符串
</if>
作用:若test成立,将字符串拼接到之前的SQL语句后面。
2、choice、when、otherwise
相当于switch、case、default
格式:
<choice>
<when test="">
字符串
</when>
<when test="">
字符串
</when>
<otherwose>
字符串
</otherwise>
</choice>
作用:依次检查when中的test,若成立,拼接字符串,若所有when都不成立,将otherwise中的字符串拼接。
3、where、set、trim
where:
作用:被where标签包裹的内容,在拼接时会在前面加上where,若第一个的拼接的字符串以and或者or为首,则会忽略第一个。
set:
作用:与where类似,拼接时加上set,若标签中的字符串拼接后以‘,’结尾,则去除‘,’
trim:
<trim prefix="" suffix="" prefixOverrides="" suffixOverrides="">
</trim>
prefix:前缀,在trim返回的字符串前添加
suffix:后缀,在trim返回的字符串后添加
prefixOverrides:当trim返回的字符串以特定开头返回时,覆盖该开头
suffixOverrides:当trim返回的字符串以特定结尾返回时,覆盖该结尾
4、foreach
delete from user where id in
<foreach collection="ids" open="(" close=")" item="item" separator=",">
#{item}
</foreach>
collection:集合名称
open:传过来的数据开头
close:传过来的数据结尾
item:当前对象
separator:数据之间的间隔
通用mapper
作用:用于单表操作,不用创建mapper.xml文件,提供诸多方法
使用:
1、导入依赖
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.5</version>
</dependency>
2、创建接口
以类Score为例
@Table(name = "score")
public class Score {
@Id
private Integer id;
private String name;
}
接口:
import tk.mybatis.mapper.common.Mapper;
public interface ScoreMapper extends Mapper<Score>{
}
3、在mybatis.xml文件中关联
<mapper class="com.offcn.mapper.ScoreMapper"/>
4、执行sql
@Test
public void selectMapper(){
SqlSession session = MybatisUtil.getSession();
MapperHelper mapperHelper = new MapperHelper();
mapperHelper.processConfiguration(session.getConfiguration());
ScoreMapper mapper = session.getMapper(ScoreMapper.class);
//调用自带方法
//通用mapper会为我们提供各种方法,并自动生成数据库操作sql语句,
List<Score> scores = mapper.selectAll();
for(Score score:scores){
System.out.println(score);
}
}
分页插件
1、导入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.11</version>
</dependency>
2、分页操作,页面数据都会放在PageInfo中(页数,当前页,每页数据,每页数据数目等等)
@Test
public void selectMapperPage(){
SqlSession session = MybatisUtil.getSession();
MapperHelper mapperHelper = new MapperHelper();
mapperHelper.processConfiguration(session.getConfiguration());
ScoreMapper mapper = session.getMapper(ScoreMapper.class);
//开启分页
PageHelper.startPage(1,2);
List<Score> scores = mapper.selectAll();
//分页
PageInfo<Score> info = new PageInfo<>(scores);
System.out.println(info);
}

浙公网安备 33010602011771号