- MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
*MyBatis的导jar包
<!--数据库相关-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<!--配置mySql-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
<!--配置mybatis-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.1</version>
</dependency>
<!--配置JDBC-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
*在main文件夹下创建resources文件并标记为资源文件,在该文件夹下创建mybatis的配置文件(mybatis-config.xml).
XML 配置文件中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)。
<?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>
<!--/第一种-->
<!--指定实体类-->
<typeAlias type="com.lanou.demo.bean.UserBean" alias="user"/>
<!--
第二种:
批量为某个包下的实体类的的小驼峰形式
-->
<package name="com.lanou.demo.bean"/>
</typeAliases>
<environments default="dev">
<environment id="dev">
<!--配置事务管理器-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源的类型我为连接池类型-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/j0304?serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--引入所有mapper.XML文件-->
<mappers>
<!--指定插入的文件-->
<mapper resource="UserMapper.xml"/>
<!--使用class来指定-->
<mapper class="com.lanou.demo.mapper.UserRepository"/>-->
<!--批量引入Mapper文件-->
<package name="com.lanou.demo.mapper"/>
</mappers>
</configuration>
*创建一个实体类,
在main包下建一个java包 ,在里面建立 com.lanou.demo 包,在这个包下建bean包里面只写有关实体类的代码
package com.lanou.demo.bean;
public class TeacherBean {
private Integer teacherId;
private String teacherName;
@Override
public String toString() {
return "TeacherBean{" +
"teacherId=" + teacherId +
", teacherName='" + teacherName + '\'' +
'}';
}
public Integer getTeacherId() {
return teacherId;
}
public void setTeacherId(Integer teacherId) {
this.teacherId = teacherId;
}
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
}
*.创建一个接口来实现有关这个实体类的sql语句
在 com.lanou.demo 包下,建mapper这个包只用来写SQL语句的接口
package com.lanou.demo.mapper;
import com.lanou.demo.bean.TeacherBean;
import java.util.List;
public interface TeacherMapper {
//查询所有
List<TeacherBean> findAll();
void addOne(TeacherBean teacherBean);
}
*实现sql语句,使用 mybatis-config.xml 配置类型别名 第二种:批量为某个包下的实体类的的小驼峰形式 走mappers标签下的 批量引入Mapper文件
在与java 相同的resources 包下建立 com.lanou.demo.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.lanou.demo.mapper.TeacherMapper">
-简单映射
由于表中的列名和实体类的属性名()不一致.
所以需要映射,否则查出的数据只有数量面没有内容
-结果映射
id:结果映射的唯一标识
type:需要映射成实体类的类型
<resultMap id="teacherMap" type="teacherBean">
<!--具体的书写哪一列映射到那个属性-->
<!--主键使用id标签进行映射-->
<id column="teacher_id" property="teacherId"/>
<!--其他使用result标签来进行映射-->
<result column="teacher_name" property="teacherName"/>
</resultMap>
<select id="findAll" resultMap="teacherMap">
// 正常这么写
<!-- select teacher_id as teacherId,
teacher_name as teacherName
from tb_teacher-->
//映射过后的写法
select * from tb_teacher
</select>
<!--为了获取到新增数据生成之后的主键-->
<!-- keyColumn="teacher_id" keyProperty="teacherId" useGeneratedKeys="true"写上这个就可以-->
<insert id="addOne" keyColumn="teacher_id"
keyProperty="teacherId" useGeneratedKeys="true">
insert into tb_teacher values (null ,#{teacherName})
</insert>
</mapper>
*实现userMapper接口的xml
userMapper.xml 可以不和java中的地址一样,但必须使用 第一种配置类别名,并指定他所要插入的文件 ,走mappers标签下的指定插入文件
这种不需要接口,就能查
例:
<?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="UserMapple">
<select id="findall" resultType="com.lanou.demo.bean.UserBean">
select id,name,passwork,age from `tb-user`
</select>
</mapper>
*实现 UserRepository 接口
这种和第一种实现一样的路径地址
package com.lanou.demo.mapper;
import com.lanou.demo.bean.UserBean;
public interface UserRepository {
UserBean findOne(Integer id);
void insertOne(UserBean userBean);
void updateById(UserBean user);
void deleteById(UserBean userBean);
}
实现的xml,(xml名称与接口名称必须一致)
<?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.lanou.demo.mapper.UserRepository">
<!--id要与接口中的方法名一致-->
<!--所以java接口中的方法不要写成重载的方式-->
<select id="findOne" resultType="userBean">
<!--
参数使用#{}的形式来获取
里面的参数变量名是有规则的:如果接口中的参数只有一个并且类型是值的类型
那么这个变量名起什么都行
如果接口中传递的参数是一个对象,那么每一条属性都是一个参数
获取参数时候,{}里面必须写的是参数的属性名
-->
select *from `tb-user`where id = #{id}
</select>
<insert id="insertOne">
insert into `tb-user`
values (null, #{name}, #{passwork}, #{age})
</insert>
<update id="updateById">
update `tb-user`
set name = #{name},
passwork = #{passwork},
age = #{age}
where id = #{id}
</update>
<delete id="deleteById">
delete
from `tb-user`
where id = #{id}
</delete>
</mapper>
*写一个Test测试一下
package com.laou.demo;
import com.lanou.demo.bean.TeacherBean;
import com.lanou.demo.bean.UserBean;
import com.lanou.demo.mapper.TeacherMapper;
import com.lanou.demo.mapper.UserRepository;
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.IOException;
import java.io.InputStream;
import java.nio.file.FileAlreadyExistsException;
import java.util.List;
public class MyBatisTest {
@Test
public void test1() throws IOException {
//把文件读成输入流
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = sqlSessionFactory.openSession();
//测试"UserMapple.xml中的findall 方法
List<UserBean> list = session.selectList("UserMapple.findall");
//指定测试的接口为UserRepository.class
UserRepository mapper = session.getMapper(UserRepository.class);
//调取接口中的方法
UserBean one = mapper.findOne(1);
//添加 userBean 属性
UserBean userBean = new UserBean();
userBean.setName("王五");
userBean.setPasswork("12345");
userBean.setAge(6);
//调取接口中的insertOne 方法
mapper.insertOne(userBean);
userBean.setName("李四");
userBean.setAge(7);
//调取接口中的updateById 方法
mapper.updateById(userBean);
//提交session
session.commit();
// 指定测试的接口为TeacherMapper.class
TeacherMapper mapper1 = session.getMapper(TeacherMapper.class);
//调取接口中的findAll 方法
List<TeacherBean> all = mapper1.findAll();
System.out.println(all);
//创建一个teacherBean 的对象
TeacherBean teacherBean = new TeacherBean();
teacherBean.setTeacherName("aaa");
//调取addOne 方法,这个方法调取了主键
mapper1.addOne(teacherBean);
//提交 session
session.commit();
// 测试获取到自动生成的主键
System.out.println(teacherBean.getTeacherId());
}
}