为了防止某笨蛋忘记,在这里记录一下Mybatis的搭建过程
一、首先,用maven导入所需依赖:编辑pom.xml
<!-- Mybatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- Junit单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<!-- Mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
<scope>runtime</scope>
</dependency>
<!-- lombok插件,可以代替实体类中的构造器和set、get方法等 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
//范围,因为在编译过后还是会生成方法,所以只让它参与编译即可,不用运行
<scope>provided</scope>
</dependency>
到这里,Mybatis的环境已经搭建好了,接下来若想使用Mybatis的功能,就要编辑配置文件了。
二、在maven搭建的项目结构中,找到路径:src->main->resources,创建一个File文件
在创建好的文件中,先写上以下内容,代表这是个xml配置文件:
<?xml version="1.0" encoding="utf-8" ?>
但我们是Mybatis的配置文件,可不是什么随随便便什么都能写的文件嗷!
于是要加入DTD约束(可以去官网找)。约束的作用就是,不让你什么能都往里面写,更规范!
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
//以上便是引入约束了。XML配置文件中包含了对Mybatis的核心设置,下面给出一个简单的示例
<configuration>
<environments default="development">//可以配置多个环境,默认使用下面的环境
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">//数据源,POOLED是Mybatis内置的小型数据库连接池
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/ssm?useUnicode=true&characterEncoding=utf8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 注册配置文件 -->
<mappers>
//mapper配置文件的路径,千万不要注册不存在的mapper,否则会报错!
<mapper resource="mapper/UserMapper.xml"/>
//配置注解版的接口类
<mapper class="com.jsoft.afternoon.dao.UserMapper2" />
</mappers>
</configuration>
三、创建实体类User
目录如下:
package com.jsoft.afternoon.entity;
import lombok.*;
import lombok.experimental.Accessors;
//得益于lombok插件,
//@Data注解可以在编译时生成get方法、set方法、equals方法、hashCode方法、toString方法
@Data
//无参构造器
@NoArgsConstructor
//全参构造器
@AllArgsConstructor
//开启链式编程,在这里的set方法返回的是一个本类对象,于是可以如下编程:
//user.setId(1001).setUsername("admin").setpassword("666")
@Accessors(chain = true)
public class User {
private Integer id;
private String username;
private String password;
}
四、创建接口写crud方法,并在对应的XML文件中写SQL,调用方法来执行SQL。
创建接口,目录如下:
package com.jsoft.afternoon.dao;
import com.jsoft.afternoon.entity.User;
import java.util.List;
public interface UserMapper {
List<User> findUsersByName(String name);
List<User> findAllUsers();
int saveUser(User user);
int updateUser(User user);
int deleteUserById(Integer id);
/**
* 根据id查询用户
* @param id 用户的主键
* @return 查询到的User对象
*/
User selectUserById(Integer id);
}
创建对应接口,目录如下:
同样,这里的文件也要加上DTD约束。区别在于configuration、config都换成了“mapper”。
同时,要再Mybatis的主配置文件里注册该mapper配置文件,否则Mybatis不承认该mapper文件。(详情参考上方mybatis主配置文件)
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
//这里写需要被配置的接口的全类名,自此接口和配置文件就关联起来了!!
<mapper namespace="com.jsoft.afternoon.dao.UserMapper">
//这里的id就是接口中对应的方法名,resultType是返回值的类型,同样要写全类名
<select id="findUsersByName" resultType="com.jsoft.afternoon.entity.User">
select id,username,password from user where username like '%${name}%'
</select>
<select id="findAllUsers" resultType="com.jsoft.afternoon.entity.User">
select id,username,password from user
</select>
<insert id="saveUser" parameterType="com.jsoft.afternoon.entity.User">
insert into user values (#{id},#{username},#{password})
</insert>
<update id="updateUser" parameterType="com.jsoft.afternoon.entity.User">
update user set username = #{username},password = #{password} where id = #{id}
</update>
<delete id="deleteUserById">
delete from user where id = #{id}
</delete>
<select id="selectUserById" resultType="com.jsoft.afternoon.entity.User">
select id,username,password from user where id = ${id}
</select>
</mapper>
五、创建测试类,运行功能。
package com.jsoft.afternoon.test;
import com.jsoft.afternoon.dao.UserMapper;
import com.jsoft.afternoon.entity.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;
/**
*
* 历史:
* apache的一个开源项目。ibatis。2010年apache迁移到了google code --- mybatis
* mybatis3。ibatis1、ibatis2。
* 2013年,GitHub上。
*
* 作用:
* 是一款持久层框架,支持定制化sql语句,存储过程,高级映射。
* XML映射文件,来配置和映射原生信息。DAO层。
*
* 持久化:
* 把数据保存到硬盘上。
*
* 持久层:
* 业务层需要操作数据的。service层----dao层。
* 数据在磁盘上的。
* service层调用数据库。耦合度太高,复用性太差。
* 把操作数据库的代码统一抽离出来,形成了一个独立的数据库中间的层
*
* 持久层框架:
* 1、mybatis
* 优点:
* a、sql语句和java代码分离
* b、动态sql语句。内置了一些逻辑判断的标签
* c、实现列名和字段名的自动映射
* d、写原生sql语句,灵活
* 缺点:
* a、调试难。通过日志框架解决
* b、使用逻辑标签拼接SQL语句,语法很难受
* c、名字之间映射需要匹配
* d、高度依赖于开发者的sql水平
* 2、Mybatis-plus(苞米豆),不需要写sql。
* 3、Hibernate:JBOSS。不需要写sql。hql
* 4、Spring data JPA。创建表
*
* 面试题:
* $和#的区别?
* $:代表底层使用的statement,直接进行字符串替换。
* #:代表的底层使用的preparedstatement。替换预编译的语句中的?(推荐)
*/
public class Ch01 {
SqlSession session;
@Before
public void before() {
//构建session工厂,这里的session不网络编程中的session,是mybatis的session会话
//虽然现在mapper在mybatis的主配置文件里注册了,
//但是我们的程序不知道哪个是mybatis的主配置文件,
//因此需要SqlSessionFactoryBuilder来解析输入流中传来的文件,构建session工厂。
InputStream inputStream = UserMapper.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
// 获取session
session = sqlSessionFactory.openSession();
}
@After
//由于mybatis默认不会提交事务,操作只是在内存层面。
//所以要在增删改程序执行完成后,手动提交事务。
public void after() {
session.commit();
}
@Test
public void test1() {
// 因为接口无法创建对象,因此这里要获取代理对象。
//获取后就可以使用对应的方法啦!
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user);
}
@Test
public void test6() {
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.findUsersByName("admin");
System.out.println(users);
}
@Test
public void test5() {
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.findAllUsers();
System.out.println(users);
}
@Test
public void test4() {
UserMapper mapper = session.getMapper(UserMapper.class);
int i = mapper.deleteUserById(4);
System.out.println(i);
}
@Test
public void test3() {
UserMapper mapper = session.getMapper(UserMapper.class);
int i = mapper.updateUser(new User(4, "abcdefg", "666666"));
System.out.println(i);
}
@Test
public void test2() {
UserMapper mapper = session.getMapper(UserMapper.class);
int hello = mapper.saveUser(new User(null, "hello", "999999"));
System.out.println(hello);
}
}
六、Mybatis注解版
将接口类直接配置到Mybatis的主配置文件中即可!详情见上方主配置文件
package com.jsoft.afternoon.dao;
import com.jsoft.afternoon.entity.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author jsoft
*
* 注解版
*/
public interface UserMapper2 {
@Select("select id,username,password from user where username like '%${name}%'")
List<User> findUsersByName(String name);
@Select("select id,username,password from user")
List<User> findAllUsers();
}
编写测试类运行
package com.jsoft.afternoon.test;
import com.jsoft.afternoon.dao.UserMapper;
import com.jsoft.afternoon.entity.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;
/**
* @author jsoft
*
*/
public class Ch02 {
SqlSession session;
@Before
public void before() {
InputStream inputStream = UserMapper.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
// 获取session
session = sqlSessionFactory.openSession();
}
@After
public void after() {
session.commit();
}
@Test
public void test6() {
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.findUsersByName("admin");
System.out.println(users);
}
@Test
public void test5() {
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.findAllUsers();
System.out.println(users);
}
}