##MyBatis语句基础
MyBatis流程
- 1,配置pom文件,引入MyBatis包以及其他依赖
<!-- 导入依赖-->
<dependencies>
<!-- mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
为了防止由于maven中约定大于配置,而导致出现资源导出失败问题,
在build中配置resource来防止我们资源导出失败的问题。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
- 2,配置Mybatis-config.xml的配置文件
<environments default="development">
<environment id="development">
<!-- 事务管理-->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 数据库的版本是8的话驱动的值里必须是在mysql之后加上cj再进行子项目-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- 如果数据库的版本是8,则必须配置时区不然时间会是乱的-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
对每一个实体类的操作,即每一个mapper.xml都需要在Mybatis的核心配置文件中进行注册
,否则不能使用,且路径必须为全路径。
<mappers>
<!-- 资源文件需要使用/路径-->
<mapper resource="com/chen/dao/UserMapper.xml"/>
</mappers>
- 3,搭建mapper.xml文件
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chen.dao.UserMapper">
<select id="getUserList" resultType="User">
# 查询语句
select * from mybatis.user;
</select>
<select id="getUserId" parameterType="int" resultType="User">
# 查询语句
select * from mybatis.user where id = #{id};
</select>
<select id="getUserLimit" resultType="User">
select * from mybatis.user limit #{start}, #{size};
</select>
<!-- 插入用户 当返回值为基本数据类型时,我们可以不用写resultType,-->
<!-- <insert id="addUser">-->
<insert id="addUser" parameterType="User">
insert into mybatis.user (id, name, pwd) values (#{id},#{name},#{pwd});
</insert>
<!-- 更新用户 好像不写参数类型也可以-->
<update id="updateUser">
update mybatis.user
set name = #{name},
pwd = #{pwd}
where id = #{id};
</update>
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id = #{id};
</delete>
</mapper>
- 4, 创建工具类-即sqlSession工厂
package com.chen.utils;
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 sun.security.mscapi.CPublicKey;
import java.io.IOException;
import java.io.InputStream;
import java.security.PublicKey;
//工具类 sqlSessionFactory ---> sqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
// 获取sqlSessionFactory对象
InputStream inputStream = null;
try {
String resource = "mybaits-config.xml";
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
// 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
// SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
- 5,在java服务中进行使用
package com.chen.dao;
import com.chen.pojo.User;
import com.chen.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class UserDaoTest {
@Test
public void test(){
// 第一步获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
// 方式一:执行SQL
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
// 方式二:不推荐使用
// List<User> userList = sqlSession.selectList("com.chen.dao.UserDao.getUserList");
for (User user : userList) {
System.out.println(user);
}
}catch (Exception e){
e.printStackTrace();
}finally {
// 关闭SqlSession
// SqlSession的实例不是线程安全的,因此不能被共享,即每次打开了一个SqlSession,返回一个响应后就要关闭他
sqlSession.close();
}
}
}
Mapper.xml配置文件问题
传参parameterType
有时候我们可以不配置parameterType,但是这是正确的,因为mybatis能自动识
别,但为了代码的可读性,我们最好还是写上。parameterType好像不能传两种类
型进去,只能传一个,即:parameterType=“int,String”,是不可以的会发生报错,要么
就封装,构造map,要么就直接不写parameterType,然后使用index来引用参数,要么使用注解。
- 1,parameterType为基本数据类型
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id = #{id};
</delete>
- 2,parameterType为封装好的map,list等
<!-- 通过map来传入参数-->
<update id="updateUser2" parameterType="Map">
update mybatis.user
set pwd = #{userPwd}
where id = #{userId};
</update>
- 3,parameterType为实体类
<insert id="addUser" parameterType="com.chen.pojo.User">
insert into mybatis.user (id, name, pwd) values (#{id},#{name},#{pwd});
</insert>
注意:此时类需要写全路径。
- 4,parameterType不写,使用index来引用
<select id="getXXXBeanList" resultType="XXBean">
select t.* from tableName where id = #{0} and name = #{1}
</select>
public List<XXXBean> getXXXBeanList(String xxId, String xxCode);
rsultType返回值类型
返回值类型不能不写,因为mybatis需要将获得结果封装到相应的类中,
查询的字段与类的属性需要一致,rsultType 是权限命名 必须是全路径,
返回值类型 当返回值类型为list时也可以仅仅写值类型(泛型)。
<select id="getUserList" resultType="com.chen.pojo.User">
# 查询语句
select * from mybatis.user;
</select>
// 获取全部用户
List<User> getUserList();
但当返回值为基本数据类型时,我们可以不用写resultType。
<!-- <insert id="addUser">-->
<insert id="addUser" parameterType="com.chen.pojo.User">
insert into mybatis.user (id, name, pwd) values (#{id},#{name},#{pwd});
</insert>
// 添加用户
int addUser(User user);
基本CRUD语法
查询
<select id="queryBlogChoose" parameterType="map" resultType="Blog">
select *
from mybatis.blog
<where>
<choose>
<when test="title != null">
and title = #{title}
</when>
<when test="author != null">
and author = #{author}
</when>
<otherwise>
and views = #{views}
</otherwise>
</choose>
</where>
</select>
删除
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id = #{id};
</delete>
插入
<insert id="addUser" parameterType="com.chen.pojo.User">
insert into mybatis.user (id, name, pwd) values (#{id},#{name},#{pwd});
</insert>
更新
<update id="updateBlog" parameterType="Blog">
update mybatis.blog
set title = #{title},
author = #{author}
where id = #{id};
</update>