一、项目创建
(1)配置pom.xml
<dependencies>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
<build>
<!-- 可以读取xml文件 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
(2)配置config.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>
<!-- 配置mybatis运行环境 -->
<environments default="development">
<environment id="development">
<!-- 配置JDBC事务管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- POOLED配置JDBC数据源连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="147250"/>
</dataSource>
</environment>
</environments>
<!-- 注册mapper.xml -->
<mappers>
<mapper resource="com/lin/mapper/AccountMapper.xml"></mapper>
</mappers>
</configuration>
二、MyBatis的开发方式
- 使用原生接口
- Mapper代理实现自定义接口
(1)使用原生接口
自定义sql语句,写在Mapper.xml 文件中(每个实体类都有相对应的Mapper文件)
1.1 Account
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Account {
private long id;
private String username;
private String password;
private int age;
}
1.2 AccountMapper.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.lin.mapper.AccountMapper">
<!-- 添加操作 -->
<insert id="save" parameterType="com.lin.entity.Account">
insert into account(username,password,age) values(#{username},#{password},#{age})
</insert>
</mapper>
1.3 Test
public class Test {
public static void main(String[] args) {
// 加载MyBatis配置文件
InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
// 创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
String statement="com.lin.mapper.AccountMapper.save";
Account account = new Account(1L,"张三","12345",15);
sqlSession.insert(statement,account);
sqlSession.commit();
sqlSession.close();
}
}
(2)Mapper代理实现自定义接口
2.1 AccountRepository接口
public interface AccountRepository {
int save(Account account);
int update(Account account);
int deleteById(long id);
List<Account> findAll();
Account findById(long id);
}
2.2 AccountRepository.xml
-
Mapper.xml 中 namespace 为接口的全类名。
-
Mapper.xml 中 statement 的 id 为接口中对应的方法名。
-
Mapper.xml 中 statement 的 parameterType 和接口中对应方法的参数类型一致。(无参数不需要写)
-
Mapper.xml 中 statement 的 resultType 和接口中对应方法的返回值类型一致。
-
只有查询需要写 resultType
-
无参数 / 多个不同参数不需要写 parameterType
<?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.lin.Repository.AccountRepository">
<insert id="save" parameterType="com.lin.entity.Account">
insert into account(username,password,age) values(#{username},#{password},#{age})
</insert>
<update id="update" parameterType="com.lin.entity.Account">
update account set username=#{username},password=#{password},age=#{age} where id=#{id}
</update>
<delete id="deleteById" parameterType="java.lang.Long">
delete from account where id=#{id}
</delete>
<select id="findAll" resultType="com.lin.entity.Account">
select * from account
</select>
<select id="findById" parameterType="java.lang.Long" resultType="com.lin.entity.Account">
select * from account where id=#{id}
</select>
</mapper>
多个参数:
<select id="findByNameAndAge" resultType="com.southwind.entity.Account"> select * from account where username = #{arg0} and age = #{arg1} </select>
2.3 在config.xml中mapper追加配置
<mapper resource="com/lin/repository/AccountRepository"></mapper>
2.4 Test
- 只有查询不需要 commit 操作
- 操作完成后都需要进行 close
public class Test2 {
public static void main(String[] args) {
InputStream inputStream = Test2.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
// 获取实现接口的代理对象
AccountRepository accountRepository = sqlSession.getMapper(AccountRepository.class);
// 添加操作
accountRepository.save(new Account(2L, "李四", "7894", 23));
sqlSession.commit();
sqlSession.close();
// 查询所有
List<Account> all = accountRepository.findAll();
for (Account account : all) {
System.out.println(account);
}
sqlSession.close();
// 按id查询
Account account = accountRepository.findById(4L);
System.out.println(account);
sqlSession.close();
// 更新操作
Account accountNew = accountRepository.findById(5L);
accountNew.setUsername("李四");
accountRepository.update(accountNew);
sqlSession.commit();
sqlSession.close();
// 删除操作
accountRepository.deleteById(4L);
sqlSession.commit();
sqlSession.close();
}
}