步骤:
1、添加依赖 pom.xml
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.15</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
</dependency>
2、定义数据表
create table if not exists tbl_users(
id bigint primary key auto_increment,
username varchar(32) not null,
password varchar(32) not null,
birth date,
sex boolean default 1,
salary numeric(8,2)
)engine=innodb default charset utf8;
3、定义MyBatis的核心配置文件 resources/mybatis-config.xml
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>
<settings> 运行时常量配置
<setting name="logImpl" value="STDOUT_LOGGING"/> 在控制台上输出所执行的SQL语句
</settings>
<typeAliases> 类型别名的声明
<typeAlias type="com.yan.entity.User" alias="User"/> type是具体的类型名称,alias是别名,在映射元文件中可以使用别名来替代全名,简写配置
</typeAliases>
<environments default="yan"> 运行环境配置,在具体的应用开发中,经常会有不同的环境配置,例如开发、测试和生产环境。default用于指定默认使用的配置,值应该是多个环境配置中的一个id对应的值
<environment id="yan"> 一个具体的环境配置,id作为标识,不允许重复。在一个数据源的环境配置中需要配置transactionManager事务管理器和dataSource数据源两部分
<transactionManager type="JDBC"/> 声明事务管理器,type可以取值为JDBC和Managed两种,一般非分布式事务使用JDBC;而分布式事务采用managed。
<dataSource type="POOLED"> 数据源配置,type可选值有3种:UNPOOLED直连方式连接数据库管理系统,一般仅仅用于环境测试;POOLED是MyBatis提供的简单连接池的实现,一般用于开发阶段,在具体应用生产环境种一般会切换为产品级连接池,例如druid;JNDI是采用由容器提供的连接池,只能用于生产环境。具体生产环境种是否使用,取决于开发计划。
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>配置驱动串
<property name="url" value="jdbc:mysql:///shop?serverTimezone=UTC"/> 配置连接串
<property name="username" value="root"/> 配置连接的用户名
<property name="password" value="123456"/> 配置连接的口令
<!-- 如果使用POOLED连接池,实际上还有连接池相关的配置 -->
</dataSource>
</environment>
</environments>
</configuration>
4、定义实体类。
实体类的定义可以参照表结构进行定义
@Data
public class User implements Serializable {
private Long id;
private String username;
private String password;
private Date birth;
private Boolean sex;
private Double salary;
}
5、定义映射元文件。resources/mapper/UserMapper.xml
用于说明实体类和表之间的对应关系、表的列和类种的属性之间的对应关系、所做的CRUD操作的SQL语句。
<?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.yan.mapper.UserMapper"> 引入namespace名空间是为了避免当前映射文件中的命名冲突问题。
<resultMap id="BaseResult" type="User"> 结果映射。主要用于将查询结果ResultSet转换为实体类对象
<id property="id" column="id" jdbcType="BIGINT"/> 用于定义主键和标识属性,property声明属性名称,column声明对应的列名称,jdbcType用于声明对应的数据类型,类型名称和数据库表种的列类型名称基本一致,注意全大写,这是常量名
<result property="username" column="username" jdbcType="VARCHAR"/> 用于定义非主键列和属性之间的对应关系
<result property="password" column="password" jdbcType="VARCHAR"/>
<result property="birth" column="birth" jdbcType="DATE"/>
<result property="sex" column="sex" jdbcType="BOOLEAN"/>
<result property="salary" column="salary" jdbcType="DECIMAL"/>
</resultMap>
<insert id="insert" parameterType="com.yan.entity.User"> insert操作,id是对应的名称,调用对应的SQL语句的名称statementId为【namespace+.+id】,parameterType用于指定调用SQL语句时所需要的参数类型,针对增删改操作不需要声明返回值类型,因为返回值类型固定为int,表示修改操作的受影响行数。
insert into tbl_users(username,password
<if test="birth!=null"> 动态SQL。注意在标签内部的名称都是属性名称,SQL语句中的都是列名称,#{}表达式中是属性名称
,birth
</if>
) values(#{username},#{password}
<if test="birth!=null">
,#{birth}
</if>
)
</insert>
<delete id="delete" parameterType="long">
delete
from tbl_users
where id = #{id}
</delete>
<select id="load" parameterType="long" resultMap="BaseResult"> 查询操作,id是语句编号,parameterType是参数类型,long实际上是MyBatis定义的别名,resultMap用于调用<resultMap>定义的规则,将ResultSet转换为值bean对象
select *
from tbl_users
where id = #{id}
</select>
<update id="update" parameterType="User">
update tbl_users set username=#{username}
<if test="password!=null">
,password=#{password}
</if>
,birth=#{birth},sex=#{sex},salary=#{salary} where id=#{id}
</update>
<select id="selectAll" resultMap="BaseResult">
select * from tbl_users
</select>
</mapper>
6、需要将映射元文件注册到核心配置文件中 mybatis-config.xml
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
7、编码调用
-
Insert
public class Insert {
public static void main(String[] args) throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");//使用mybatis提供的工具类Resources获取读取核心配置文件的输入流,字节和字符都可以
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); //使用MyBatis提供的工具类SqlSessionFactoryBuilder创建SqlSessionFactory对象,构建时会自动解析从输入流中读取到配置内容
SqlSession session = sessionFactory.openSession(); //使用工厂类创建SqlSession会话对象
User user=new User();
user.setUsername("lisisi");
user.setPassword("444444");
user.setBirth(new java.sql.Date(new java.util.Date().getTime()));
int inserted = session.insert("com.yan.mapper.UserMapper.insert", user); //利用会话对象调用映射元文件中定义的SQL语句
session.commit(); //一般持久层框架都是默认事务回滚,所以修改后需要手动提交事务,否则修改无效
if(inserted>0)
System.out.println("插入成功!");
session.close(); //session实际上是Connection对象的一个浅封装,所以需要保证session及时关闭
}
}
-
Delete
public class Delete {
public static void main(String[] args) throws IOException {
InputStream r = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(r);
SqlSession session = sessionFactory.openSession();
int delete =session.delete("com.test.mapper.UserMapper.delete",1L);
session.commit();
session.commit();
if (delete>0){
System.out.println("删除成功!");
}
}
}
SelectOne
public class SelectOne {
public static void main(String[] args) throws IOException {
InputStream r = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(r);
SqlSession session = sessionFactory.openSession();
User user = session.selectOne("com.test.mapper.UserMapper.load", 4L);
session.close();
System.out.println(user);
}
}
-
Update
public class Update {
public static void main(String[] args) throws IOException {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
User user = session.selectOne("com.test.mapper.UserMapper.load", 2L);
user.setSex(true);
user.setSalary(2000.0);
int update = session.update("com.test.mapper.UserMapper.update", user);
session.commit();
session.close();
if (update>0)
System.out.println("修改成功");
}
}
-
SelectAll
public class SelectAll {
public static void main(String[] args) throws IOException {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
List<User> users = session.selectList("com.test.mapper.UserMapper.selectAll");
session.commit();
users.forEach(System.out::println);
}
}