1、什么是Mybatis?
mybatis,通俗地说,就是连接数据库,然后操作数据库的框架。
详情点击官网mybatis
2、为什么要选择Mybatis呢?
为什么要选择Mybatis?等同于为什么要摒弃其它工具呢?连接数据库从JDBC到Hilbernate再发展到Mybatis,下面就简要地介绍一下JDBC和Hilbernate。
2.1 JDBC(Java DataBase Connected)连接数据库的步骤
- 注册驱动和加载数据库
(Class.forName(com.mysql.cj.jdbc.Driver))
- 操作Connection,打开statement或prepareStatement对象
Connection conn = DriverManager.getConnection(url, userName, passWord)
- 通过statement或prepareStatement执行SQL语句,返回结果放到ResultSet对象
PreparedStatement ps = conn.prepareStatement("select * from stu_table")
- 根据ResultSet结果集来查询结果
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt(1) + "\t" + rs.getString(2)
+ "\t" + rs.getInt(3) + "\t" +
rs.getString(4) + "\t" +
rs.getString(5));
}
- 关闭连接,释放数据库资源
rs.close();
ps.close();
2.2 mybatis的优点
1:jdbc连接数据库很复杂,且SQL语句与Java代码放在一起,后期难以维护。
2:Hilebernate是一个全自动框架,操作困难。
3:mybatis是半自动ORM框架,可以根据sql变化易于操作
3、那它怎么使用呢?
3.1 mybatis的执行流程
通过xml文件或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终可执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)
3.2 pom.xml中添加依赖
<dependencies>
<!--mybatis的jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
<!--mysql的jar包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!--单元测试的jar包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--log4j日志的jar包-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.11</version>
</dependency>
</dependencies>
3.3 类路径resources下的配置文件
(1)在类路径下配置mybatis的配置文件
<?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="jdbc.properties"/>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
(2)在类路径创建mapper文件夹以及对应接口的映射文件(以User实体类为例)
<?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.zyj.user.UserMapper">
<!--根据User表的Id进行查询用户-->
<select id="findById" parameterType="int" resultType="com.zyj.user.User">
select * from user where id = #{id}
</select>
<!--根据User表中的username查询用户-->
<select id="findByName" resultType="com.zyj.user.User">
select * from user where username = #{userName}
</select>
<!--插入数据-->
<insert id="insertData" parameterType="com.zyj.user.User">
insert into user (username,birthday,sex,address) values (#{userName},#{birthday},#{sex},#{address})
</insert>
<!--根据id删除数据-->
<delete id="deleteById" parameterType="int">
delete from user where id=#{id}
</delete>
<!--更新数据-->
<update id="updateData" parameterType="com.zyj.user.User">
update user set username = #{userName},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{userId}
</update>
</mapper>
(3)配置jdbc的属性
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
username=root
password=123456
(4)log4j日志控制台的输出配置文件
### 设置###
log4j.rootLogger = debug,stdout
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
3.4 实体类的属性
(1)以User表为例,创建一个User实体类和一个对应的接口UserMapper,该接口包含增、删、改、查四个抽象方法,UserMapper.xml与之映射,可将Sql语句输出。
package com.zyj.user;
import lombok.Data;
import java.util.Date;
/**
* @Data注解取代了实体类中属性的get、set方法,且包括输出的toString()方法
*/
@Data
public class User {
/**
* 定义实体类的属性
*/
private String userName;
private int userId;
private Date birthday;
private String sex;
private String address;
}
(2)若不使用@Data注解,User类表示如下
package com.zyj.user;
import lombok.Data;
import java.util.Date;
public class User {
/**
* 定义实体类的属性
*/
private String userName;
private int userId;
private Date birthday;
private String sex;
private String address;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", userId=" + userId +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
(3)UserMapper接口如下:
package com.zyj.user;
/**
* 增、删、改、查方法
*/
public interface UserMapper {
User findById(int id);
User findByName(String name);
void insertData(User user);
void deleteById(int id);
void updateData(User user);
}
3.5 测试类
package com.zyj;
import com.zyj.user.User;
import com.zyj.user.UserMapper;
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.Test;
import java.io.Reader;
import java.util.Date;
public class UserTest {
@Test
public void testFindUserById(){
try{
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
System.out.println(userMapper.findById(41));
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 根据名字查询User
*/
@Test
public void testFindUserByName(){
try{
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
System.out.println(userMapper.findByName("王老吉"));
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 根据Id删除User
*/
@Test
public void testDeleteById(){
try{
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
userMapper.deleteById(46);
session.commit();
session.close();
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 更新User
*/
@Test
public void testUpdateData(){
try{
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User();
user.setUserId(41);
user.setUserName("zhangsan");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("上海市");
userMapper.updateData(user);
session.commit();
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 增添数据
*/
@Test
public void testInsertData(){
try{
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User();
user.setUserName("佳得乐");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("杭州市");
userMapper.insertData(user);
session.commit();
}catch (Exception e){
e.printStackTrace();
}
}
}
输出结果:以查询id为例,输出结果如下: