MyBatis 是一个基于Java的持久层框架。它提供的持久层框架包括SQL Maps和Data Access Objects(DAOs);
三个主要特点:
步骤1: 添加MyBatis的坐标, 即:jar包依赖
步骤2: 准备数据库环境
步骤3: 编写User实体类
步骤4: 编写核心文件SqlMapConfig.xml
步骤5: 编写映射文件 UserMapper.xml
步骤6: 编写测试类
<dependencies>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
</dependencies>
CREATE DATABASE mybatis;
USE mybatis;
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(32) NOT NULL COMMENT '用户名称',
`sex` CHAR(1) DEFAULT NULL COMMENT '性别',
`address` VARCHAR(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `user` (`id`, `username`, `sex`, `address`) VALUES(NULL,'Tom','男','北京');
INSERT INTO `user` (`id`, `username`, `sex`, `address`) VALUES(NULL,'Jack','男','上海');
INSERT INTO `user` (`id`, `username`, `sex`, `address`) VALUES(NULL,'Rose','女','西安');
INSERT INTO `user` (`id`, `username`, `sex`, `address`) VALUES(NULL,'Poll','女','利比亚');
@Data
public class User {
private Integer id;
private String username;
private String sex;
private String address;
}
<?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>
<!--配置数据库运行环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--配置关联的SQL语句的映射文件-->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
<?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="userMapper">
<!--查询所有用户,sql语句不要使用分号,resultType是返回查询结果封装的类型-->
<select id="findAll" resultType="com.mybatis.pojo.User">
select * from user
</select>
</mapper>
public class UserTest {
@Test
public void findAllTest() throws IOException {
//加载核心配置文件SqlMapConfig.xml
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//构造SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//构造SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行查询语句
List<User> userList = sqlSession.selectList("userMapper.findAll");
for (User user:userList){
System.out.println("user="+user);
}
//释放资源
sqlSession.close();
}
}
(1) 定义一个log4j.properties文件, 保存在resources目录下, 内容编辑为:
log4j.rootLogger =debug,systemOut,logFile
#输出到控制台
log4j.appender.systemOut = org.apache.log4j.ConsoleAppender
log4j.appender.systemOut.layout = org.apache.log4j.PatternLayout
log4j.appender.systemOut.layout.ConversionPattern = %d [%t] %-5p %c - %m%n
log4j.appender.systemOut.Target = System.out
#输出到文件
log4j.appender.logFile = org.apache.log4j.FileAppender
log4j.appender.logFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern = %d{
ABSOLUTE} %5p %c{
1}:%L - %m%n
log4j.appender.logFile.File = D:/log/log4j.log
(2) 在pom.xml中增加log4j的jar包依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
(1) UserMapper.xml文件增加insert的映射,如下红框内容;
(2)编写一个插入测试类,注意要提交事务才能成功
//插入用户
@Test
public void insertTest() throws IOException {
//加载核心文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//构造工厂类对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//从工厂类中打开一个数据库会话
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行插入数据
User user=new User();
user.setUsername("张三");
user.setSex("男");
user.setAddress("北京");
int count = sqlSession.insert("userMapper.insert", user);
System.out.println("新增加的行数为:"+count);
//提交事务, 否则数据库无法添加成功
sqlSession.commit();
//释放资源
sqlSession.close();
}
需求: 插入完成后, 将数据库中的user的id赋值给pojo中user的id属性.
步骤1: 在UserMapper.xml文件中插入标签中增加selectKey标签,具体如下:
<!--插入,插入完成后,需要查询最后一次插入成功的id值, order 为After意思是插入语句执行完成后执行此操作,resultType查询的返回值-->
<insert id="insert" parameterType="com.mybatis.pojo.User">
insert into user values(#{
id},#{
username},#{
sex},#{
address})
<selectKey keyProperty="id" order="AFTER" resultType="integer">
select LAST_INSERT_ID()
</selectKey>
</insert>
步骤2: 在刚才插入测试类中加一行代码查询user的id值,可以查询成功;
注: 如果是uuid, 可以在UserMapper中设置如下操作:
在UserMapper.xml文件中增加:
<!--删除用户-->
<delete id="delete" parameterType="integer">
delete from user where id=#{
id}
</delete>
新建删除测试类
//删除用户
@Test
public void deleteTest() throws IOException {
//加载核心文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//构造工厂类对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//从工厂类中打开一个数据库会话
SqlSession sqlSession = sqlSessionFactory.openSession();
//删除
sqlSession.delete("userMapper.delete",7);
//提交事务, 否则数据库无法添加成功
sqlSession.commit();
//释放资源
sqlSession.close();
}
在UserMapper.xml中增加:
update user set username=#{username},sex=#{sex},address=#{address}
where id=#{id}
新建更新测试类:
//更新用户
@Test
public void updateTest() throws IOException {
//加载核心文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//构造工厂类对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//从工厂类中打开一个数据库会话
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行插入数据
User user=new User();
user.setId(6);
user.setUsername("张惠妹");
user.setSex("女");
user.setAddress("马来西亚");
sqlSession.update("userMapper.update",user);
//提交事务, 否则数据库无法添加成功
sqlSession.commit();
//释放资源
sqlSession.close();
}
在UserMapper.xml中增加:
新建查询测试类
//基于用户id查询用户信息
@Test
public void findById() throws IOException {
//加载核心配置文件SqlMapConfig.xml
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//构造SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//构造SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行查询语句
User user = sqlSession.selectOne("userMapper.findById", 6);
System.out.println(user.toString());
//释放资源
sqlSession.close();
}
在UserMapper.xml中增加:
新建模糊查询测试类:
//基于用户名模糊查询
@Test
public void findByName() throws IOException {
//加载核心配置文件SqlMapConfig.xml
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//构造SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//构造SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行查询语句
List<User> userList = sqlSession.selectList("userMapper.findByName");
for (User user:userList){
System.out.println(user.toString());
}
//释放资源
sqlSession.close();
}