使用IDEA创建maven工程
直接点next即可。
在pom.xml文件中引入依赖的包。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>edu.snnu.cs</groupId>
<artifactId>mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
注意mysql-connector-java
,请根据自己的mysql版本进行选择。
配置mybatis
在src/main/resources
目录下创建db.properties
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/learn?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
db.username=root
db.password=dev@mysql
这里的注意在这里面不要加引号,否则会解析错误。对于6.0及之后版本的mysql使用的驱动为com.mysql.cj.jdbc.Driver
,6.0之前的版本使用的驱动为com.mysql.jdbc.Driver
。
创建SqlMapConfig.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>
<properties resource="db.properties"/>
<!--配置环境-->
<!-- <settings>-->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/>-->
<!-- </settings>-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置连接池-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置-->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
编写代码
在src/main/java
下新建Package --> entity
。
在entity
下新建Java Class --> User.java
package entity;
import lombok.Data;
@Data
public class User {
private int userId;
private String userName;
private String userPwd;
}
@Data
注解为我们自动生成了成员变量的Getter,Setter方法以及类的toString方法。
在src/main/resources
下新建目录sqlmap,在sqlmap中新建User.xml文件。这里的User.xml与SqlMapConfig.xml中指定映射配置文件的位置的User.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">
<!-- namespace:命名空间 -->
<mapper namespace="learn">
<resultMap id="user_info" type="entity.User">
<id column="user_id" property="userId" />
<result column="user_name" property="userName"/>
<result column="user_pwd" property="userPwd"/>
</resultMap>
<!-- 增 -->
<insert id="insertUser" parameterType="entity.User">
insert into user_info (user_id,user_name,user_pwd) values (#{userId},#{userName},#{userPwd})
</insert>
<!-- 删 -->
<delete id="deleteById" parameterType="Integer">
delete from user_info where user_id=#{uid}
</delete>
<!-- 改 -->
<update id="updateById" parameterType="entity.User">
update user_info
set user_name=#{userName},user_pwd=#{userPwd}
where user_id=#{userId}
</update>
<!-- 查 -->
<select id="findUserById" parameterType="Integer" resultType="entity.User" resultMap="user_info">
select * from user_info where user_id=#{uid}
</select>
</mapper>
为User.java新建测试类
右键 --> Generate --> Test --> OK
编写测试代码
package entity;
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.jupiter.api.Test;
import javax.annotation.PreDestroy;
import java.io.IOException;
import java.io.InputStream;
class UserTest {
private InputStream inputStream;
SqlSessionFactory sqlSessionFactory;
public UserTest() throws IOException {
inputStream= Resources.getResourceAsStream("SqlMapConfig.xml");
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testInsertUser(){
SqlSession sqlSession=sqlSessionFactory.openSession();
User user=new User();
user.setUserId(339);
user.setUserName("lwx");
user.setUserPwd("pwd");
try {
sqlSession.insert("learn.insertUser",user);
sqlSession.commit();
}catch (Exception e){
System.out.println("insert failed");
}finally {
sqlSession.close();
}
}
@Test
public void testDeleteById(){
SqlSession sqlSession=sqlSessionFactory.openSession();
try {
sqlSession.delete("learn.deleteById",339);
sqlSession.commit();
}catch (Exception e){
System.out.println("delete failed");
}finally {
sqlSession.close();
}
}
@Test
public void testUpdateById(){
SqlSession sqlSession=sqlSessionFactory.openSession();
User user=new User();
user.setUserName("起飞");
user.setUserPwd("pwd");
user.setUserId(339);
try {
sqlSession.update("learn.updateById",user);
sqlSession.commit();
}catch (Exception e){
System.out.println("update failed");
}
}
@Test
public void testFindUserById(){
SqlSession sqlSession=sqlSessionFactory.openSession();
User user=sqlSession.selectOne("learn.findUserById",339);
System.out.println(user);
}
@PreDestroy
public void preDestroy() throws IOException {
inputStream.close();
}
}
当然,测试之前别忘了建表
/*
Navicat Premium Data Transfer
Source Server : mysql
Source Server Type : MySQL
Source Server Version : 80020
Source Host : localhost:3306
Source Schema : learn
Target Server Type : MySQL
Target Server Version : 80020
File Encoding : 65001
Date: 14/05/2020 10:47:17
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user_info
-- ----------------------------
DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
`user_id` int(0) NOT NULL,
`user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`user_pwd` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
注意事项
在进行查询时,mybatis会将查询得到的结果与实体类进行映射从而将查询到的结果保存到实体类的对象中,在类成员变量与表中的字段名相同时,mybatis根据字段名就生成了实体类的对象。但是当类成员变量与表中的字段名不相同时,需要我们指定映射方式。
在mybatis全局配置文件中添加如下配置
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
意思是将表中采用下划线命名法的字段与采用驼峰命名法的类成员变量进行映射,例如
user_id --> userId
user_name --> userName
这种方法配置简单,但却有致命的缺点,这需要靠程序员的代码规范来保证正确性。学计算机的同学都知道,人是不可靠的,所以我们不推荐使用这种方法。
另一种方法是在映射配置文件中指定映射方式,例如
<resultMap id="user_info" type="entity.User">
<id column="user_id" property="userId" />
<result column="user_name" property="userName"/>
<result column="user_pwd" property="userPwd"/>
</resultMap>
type指定实体类,id指定主键,result指定其他字段;column对应的是数据表中的字段名,property对应的是实体类中的成员变量名。在映射配置文件中编写查询方法时指定resultMap的id即可引入,例如
<select id="findUserById" parameterType="Integer" resultType="entity.User" resultMap="user_info">
select * from user_info where user_id=#{uid}
</select>