介绍
mybatis
和dbutils
本质上但是对JDBC
的封装
使用教程
maven配置
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
设置配置文件(下面是模板)
mybatis-config
文件名:mybatis.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>
<settings>
<!-- 设置mybatis在控制台使用日志输出sql语句 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 设置mybatis识别实体类的驼峰命名,并将大写字母转换为_小写字母 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- typeAliases用于配置实体类的别名 -->
<typeAliases>
<!-- 方式一:为每一个实体类分别指定一个别名。比较繁琐 -->
<!-- <typeAlias type="" alias=""/>-->
<!-- 直接指定实体类的包,这样mybatis就会自动给这个包下所有的实体类指定创建别名,别名就是类名不包括类名,使用时也不区分大小写 -->
<package name=""/>
</typeAliases>
<!-- 配置环境,主要是配置不同数据库的数据源,default指定使用的默认数据源环境的id -->
<environments default="mysql">
<!-- 配置mysql数据源的环境,id通常指定数据库名称 -->
<environment id="mysql">
<!-- 事务管理使用JDBC的事务 -->
<transactionManager type="JDBC"/>
<!-- type指定为pool表示数据源连接使用mybatis连接池,目的是可以让连接复用 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://数据库地址:端口?serverTimezone=Asia/Shanghai&useSSL=false"/>
<property name="username" value=""/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<!-- 解析mapper -->
<mappers>
</mappers>
</configuration>
mybatis-mapper
文件名:实体类Mapper.xmluseGeneratedKeys="true"
:这个属性告诉 MyBatis 使用数据库自动生成的主键值。当这个属性设置为 true 时,MyBatis 会在执行插入操作后从数据库获取生成的主键值。
keyProperty="uid"
:这个属性指定了将生成的主键值设置到哪个 Java 对象的属性中。在这个示例中,keyProperty 设置为 "uid",这意味着 MyBatis 将生成的主键值设置到 Java 对象的 uid 属性中。
<?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="">
<!-- 给UserDao接口中的所有方法编写相应的SQL语句 -->
<!-- insert表示传入语句,对应的删除和修改是delete和update标签 -->
<!-- id对应接口的方法名,parameterType指定参数的类型,如果是实体可以引用mybatis.xml中定义的别名 -->
<!-- insert标签中只能写sql语句,注释也不能写 -->
<!-- SQL语句中的参数使用#{实体中的属性名}来获取实体对象中的属性的值(包括复杂的值比如Map<String,User> lists,使用方法#{key}.tel) -->
<insert id="sava" parameterType="User" useGeneratedKeys="true" keyProperty="uid">
insert into test(u_name, u_tel)
values (#{userName}, #{tel});
</insert>
<!-- 如果参数是map,那么ognl表达式的值为map的key -->
<insert id="savaMap" parameterType="Map">
insert into test(u_name, u_tel)
values (#{name}, #{tel});
</insert>
<!-- 注意:当方法参数只有一个并且是基本数据类型时候,那么ognl的值可以是任意填写 -->
<delete id="delete" parameterType="int">
delete
from test
where u_id = #{id}
</delete>
<update id="update" parameterType="user">
update test
set u_name = #{userName},
u_tel = #{tel}
where u_id = #{uid}
</update>
</mapper>
MybatisUtils(负责创建SqlSession实例)
public class MybatisUtils {
/**
* 声明SqlSessionFactory,用于创建SqlSession实例
*/
public static SqlSessionFactory sqlSessionFactory;
/**
* 在静态代码块中初始化SqlSessionFactory工厂
*/
static {
try {
// 通过查找mybatis的核心配置文件,先创建一个用于读取xml文件的输入流
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
// 将输入流传给创建的SqlSessionFactoryBuilder进行解析,并初始化整个SqlSessionFactory工厂对象
// SqlSessionFactoryBuilder:mybatis提供的负责创建SqlSessionFactory的构建器类
// build(inputStream):接收输入流用于解析配置文件,并创建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* SqlSession是操作数据库的核心对象,相当于封装了整个Connection(连接对象)
* 不带参数的openSession方法得到SqlSession是需要我们手动提交事务的
*
* @return
*/
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
/**
* openSession方法还可以传入一个boolean类型的参数
* 如果设置为true,创建出来的SqlSession就会自动提交事务,false一样是是手动提交
*
* @param autoCommit 是否自动提交
* @return
*/
public static SqlSession getSqlSession(boolean autoCommit) {
return sqlSessionFactory.openSession(autoCommit);
}
}
实体类DaoImpl
public class UserDaoImpl implements UserDao {
@Override
public void sava(User user) {
// 先创建SqlSession
SqlSession session = MybatisUtils.getSqlSession();
try {
// 执行保存
session.getMapper(UserDao.class).sava(user);
// 手动提交事务(自动提交时不需要)
session.commit();
} catch (RuntimeException e) {
e.printStackTrace();
// 事务的回滚(自动提交时不需要)
session.rollback();
} finally {
session.close();
}
}
@Override
public void savaMap(Map<String,Object> map) {
SqlSession session = MybatisUtils.getSqlSession(true);
session.getMapper(UserDao.class).savaMap(map);
}
@Override
public void delete(int id) {
SqlSession session = MybatisUtils.getSqlSession(true);
session.getMapper(UserDao.class).delete(id);
}
@Override
public void update(User user) {
SqlSession session = MybatisUtils.getSqlSession(true);
session.getMapper(UserDao.class).update(user);
}
}