JDBC存在的问题

  • 数据库连接创建、释放频繁造成系统资源浪费
  • sql语句在代码中硬编码,不宜维护

MyBatis是一个持久层框架,对jdbc的操作数据库的过程进行封装。通过 xml 或注解的方式将要执行的各种 statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过 java 对象和 statement 中的 sql 进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射成 java 对象并返回。

select

mapper都会有一个namespace,避免多个mapper冲突,而且这个namespace不可以重复。

id表示查询方法的唯一标识符,resultType定义返回值的类型,即调用sql的完整类名。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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="org.example.UserMapper">
<!-- 查询所有用户 -->
<select id="getUserById" resultType="org.example.User">
SELECT * FROM user where id=#{id};
</select>

</mapper>

下面文件属于mybatis的配置文件,需要自己创建,environments是mybatis所连接的数据库配置信息,environments可以有多个environment以对应不同的环境,每一个environment都有一个独属于自己的id

environments中可以通过default属性指定需要的environment,每一个environment定义一个数据的基本连接信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai&amp;useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>

</environment>

</environments>

<mappers>
<mapper resource="mapper.xml"/>
</mappers>

</configuration>

每个基于MyBatis的应用都是以一个SqlSessionFactory实例为核心。SqlSessionFactory实例可以通过SqlSessionFactoryBuilder加载配置文件获得。

MyBatis包含一个Resources工具类,其包含的方法从类路径或其他位置加载资源文件更容易。

SqlSession类提供了在数据库执行SQL命名所需的所有方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package org.example;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;
import java.io.IOException;

public class Main {
public static void main(String[] args) throws IOException {
final String resource = "mybatis-config.xml";
SqlSessionFactory sql=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(resource));
SqlSession session=sql.openSession();
//方法一
User user=(User)session.selectOne("org.example.UserMapper.getUserById",1);
System.out.println(user);
session.close();
}
}
class User{
private Integer id;
private String name;
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
}
1
2
3
4
5
6
7
8
9
//方法2:添加一个接口,接口类名要与配置文件的mapper名一致,方法则要与配置文件的sql语句的id名一致
interface UserMapper{
User getUserById(Integer id);
}

UserMapper userMapper=session.getMapper(UserMapper.class);
User user=userMapper.getUserById(1);
System.out.println(user);
session.close();

注意:也可以不通过xml配置文件构建SqlSessionFactory,仅需要添加一个映射器类,但高级映射仍需要xml配置文件。

insert

parameterType表示参数的类全限定名或别名(参数类型)。

useGeneratedKeys表示获取数据库生成的自增主键。(仅适用于 insert 和 update)

KeyProperty表示回填的属性名。(仅适用于 insert 和 update)

KeyColumn表示获得指定的数据库列名,与KeyProperty搭配,可以用逗号分隔多个列名;如果数据库列名和 Java 属性名相同可以省略。(仅适用于 insert 和 update)

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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="org.example.user.UserMapper">
<!-- 添加用户 -->
<insert id="addUser" parameterType="org.example.user.User" useGeneratedKeys="true" keyProperty="id">
insert into user(id,username) values (#{id},#{name});
</insert>

</mapper>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package org.example;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;
import org.example.user.*;

import java.io.IOException;

public class Main {
public static void main(String[] args) throws IOException {
final String resource = "mybatis-config.xml";
SqlSessionFactory sql=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(resource));
SqlSession session=sql.openSession();
//User user=(User)session.selectOne("org.example.UserMapper.getUserById",1);
UserMapper userMapper=session.getMapper(UserMapper.class);

User user=new User();
user.setName("test1");
int insert=userMapper.addUser(user);
System.out.println(user);
session.commit();
session.close();
}
}

delete

1
2
3
4
<delete id="delUser" parameterType="int">
delete from user where id=#{id}
</delete>

1
2
3
4
int deleteuser = userMapper.delUser(1);
System.out.println(deleteuser);
session.commit();
session.close();