这次使用的数据库不再是MySQL数据库了。本次学习使用国产的达梦数据库。
(其实用什么样的数据库无所谓,重点是能够去更多的学习Mybatis框架)
druid.driverClassName=dm.jdbc.driver.DmDriver
druid.url=jdbc:dm://localhost:5236/TEST
druid.username=TEST
druid.password=TEST123456
使用达梦数据库。首先同样的,我们配置一下我们的db.properties。可以看到达梦数据库的配置和mysql的都差不多,但是还是有点差异的。
继续编写Mybatis框架的核心配置文件mybatisConfig.xml配置文件
<configuration>
<properties resource="db.properties"/>
<typeAliases>
<package name="com.xue.domain"/>
typeAliases>
<environments default="mysql_developer">
<environment id="mysql_developer">
<transactionManager type="jdbc"/>
<dataSource type="pooled">
<property name="driver" value="${druid.driverClassName}"/>
<property name="url" value="${druid.url}"/>
<property name="username" value="${druid.username}"/>
<property name="password" value="${druid.password}"/>
dataSource>
environment>
environments>
<mappers>
<package name="com.xue.mapper"/>
mappers>
configuration>
这里可以发现,mybatis的核心配置文件和之前使用mysql的是一样的。所以,不论使用什么样的数据库,mybatis框架的配置都是一样的。
配置好Mybatis框架的核心配置文件以后,还差一个映射配置文件。所以我们是不是要写一下我们的映射配置文件。要不要写?当然不写,一直写配置文件,多累。mybatis框架为我们提供了注解,我们可以通过注解的方式,编写我们的SQL语句,完成对数据库的操作。不需要再去编写复杂的映射文件写SQL语句。
我们先看一下最基本的CRUD的四个注解,
@Insert("插入的SQL语句") // 插入
@Select("查询的SQL语句") // 查询
@Update("更新的SQL语句") // 更新
@Delete("删除的SQL语句") // 删除
我们直接在我们的mapper接口中的方法上加上我们的这四个注解,就可以进行基本的增删改查操作。而且我们不需要再去写mapper接口的实现类。
示例代码:
@Insert("insert into t_user (id, name, age, create_time, update_time) " +
"values (#{id}, #{name}, #{age}, #{createTime}, #{updateTime})")
@Results({
@Result(property = "id", column = "id", id = true, jdbcType = JdbcType.VARCHAR),
@Result(property = "name", column = "name", jdbcType = JdbcType.VARCHAR),
@Result(property = "age", column = "age", jdbcType = JdbcType.INTEGER),
@Result(property = "createTime", column = "create_time", jdbcType = JdbcType.VARCHAR),
@Result(property = "updateTime", column = "update_time", jdbcType = JdbcType.VARCHAR)
})
int insertUser(User user);
将我们的SQL语句写在@Insert注解的括号中。在service层的代码中,直接调用该方法,执行插入操作。这样我们就不需要再去编写映射配置文件。
那么还有一个问题,如果当我们的实体类的属性名和我们的数据库表中的字段名不一致的时候,如果进行实体类属性和表字段的映射关系?
这种情况下,我们就需要使用另外一个注解,也就是上面的示例代码中的@Results注解。
@Results 注解,用于将我们的实体类的属性名和我们的数据库表的字段名进行一个一一对应的关系。
在该注解中我们还需要一个 @Result 注解,去映射我们的实体类属性名和数据库表的字段名。
在 @Result 注解中,有几个属性需要我们注意一下:
property:代表了我们的实体类的属性名。
column:代表了我们的数据库表的字段名。
jdbcType:数据库字段类型。
id:true 表示该字段是主键。false:表示该字段不是主键。默认为false。
实体类属性和数据库表字段的映射关系,在查询、修改、删除中都是一样的。都是使用 @Results 和 @Result 注解。
示例代码:
@Select("select id, name, age, create_time, update_time " +
"from t_user " +
"where id = #{id}")
@Results({
@Result(property = "id", column = "id", id = true, jdbcType = JdbcType.VARCHAR),
@Result(property = "name", column = "name", jdbcType = JdbcType.VARCHAR),
@Result(property = "age", column = "age", jdbcType = JdbcType.INTEGER),
@Result(property = "createTime", column = "create_time", jdbcType = JdbcType.VARCHAR),
@Result(property = "updateTime", column = "update_time", jdbcType = JdbcType.VARCHAR)
})
User selectOne(@Param("id") String id);
@Update("update t_user " +
"set age = #{age}, update_time = #{updateTime} " +
"where id = #{id}")
@Results({
@Result(property = "id", column = "id", id = true, jdbcType = JdbcType.VARCHAR),
@Result(property = "name", column = "name", jdbcType = JdbcType.VARCHAR),
@Result(property = "age", column = "age", jdbcType = JdbcType.INTEGER),
@Result(property = "createTime", column = "create_time", jdbcType = JdbcType.VARCHAR),
@Result(property = "updateTime", column = "update_time", jdbcType = JdbcType.VARCHAR)
})
int updateUser(User user);
@Delete("delete from t_user where id = #{id}")
@Results({
@Result(property = "id", column = "id", id = true, jdbcType = JdbcType.VARCHAR),
@Result(property = "name", column = "name", jdbcType = JdbcType.VARCHAR),
@Result(property = "age", column = "age", jdbcType = JdbcType.INTEGER),
@Result(property = "createTime", column = "create_time", jdbcType = JdbcType.VARCHAR),
@Result(property = "updateTime", column = "update_time", jdbcType = JdbcType.VARCHAR)
})
int deleteById(@Param("id") String id);
除了这种写法,我们还可以使用另外的一种方式进行dao层的开发。我们可以使用SQL语句构建器,通过构建SQL语句,实现对数据库的操作。
Mybatis框架为我们提供了org.apache.ibatis.jdbc.SQL 功能类,专门用来构建SQL语句。
SQL语句构建器就是通过SQL对象,为我们构建SQL语句,然后将构建出的SQL语句通过特定的注解加在mapper接口的方法上。同样也可以完成对数据库的CRUD操作。
我们先来介绍几个注解:
@SelectProvider()
@UpdateProvider()
@InsertProvider()
@DeleteProvider()
我们可以通过以下方式编写我们的dao层的代码。
public String selectUser(User user) {
SQL sql = new SQL();
sql.SELECT("id, name, age, create_time, update_time");
sql.FROM("t_user");
if (user.getName() != null && !"".equals(user.getName())) {
sql.WHERE("name = #{name,jdbcType=VARCHAR}");
}
if (user.getAge() != null && !"".equals(user.getAge())) {
sql.WHERE("age = #{age,jdbcType=INTEGER}");
}
return sql.toString();
}
该方法会返回一个SQL语句的字符串。然后我们需要再mapper接口中的对应的方法上加上 @SelectProvider 注解。
@SelectProvider(type = com.xue.mapper.UserSqlProvider.class, method = "selectUser")
List<User> selectUser(User user);
@SelectProvider 注解中的两个属性:
type:我们的SQL构建器对象的全路径类名。
method:SQL构建器对象中的方法名。
当然还有其他的注解:
@UpdateProvider(type = com.xue.mapper.UserSqlProvider.class, method = "updateUserById")
@InsertProvider(type = com.xue.mapper.UserSqlProvider.class, method = "insert")
@DeleteProvider(type = com.xue.mapper.UserSqlProvider.class, method = "deleteUser")
以上三个注解分别代表了更新操作,插入操作,删除操作。
可以看一下我们的SQL构造器的代码是如何进行编写的。
package com.xue.mapper;
import com.xue.domain.User;
import org.apache.ibatis.jdbc.SQL;
public class UserSqlProvider {
public String selectUser(User user) {
SQL sql = new SQL();
sql.SELECT("id, name, age, create_time, update_time");
sql.FROM("t_user");
if (user.getName() != null && !"".equals(user.getName())) {
sql.WHERE("name = #{name,jdbcType=VARCHAR}");
}
if (user.getAge() != null && !"".equals(user.getAge())) {
sql.WHERE("age = #{age,jdbcType=INTEGER}");
}
return sql.toString();
}
public String insert() {
SQL sql = new SQL();
sql.INSERT_INTO("t_user");
sql.VALUES("id, name, age, create_time", "#{id}, #{name}, #{age}, #{createTime}");
sql.VALUES("update_time", " #{updateTime}");
return sql.toString();
}
public String updateUserById(User user) {
SQL sql = new SQL();
sql.UPDATE("t_user");
if (user.getName() != null && !"".equals(user.getName())) {
sql.SET("name = #{name}");
}
if (user.getAge() != null && !"".equals(user.getAge())) {
sql.SET("age = #{age}");
}
if (user.getCreateTime() != null && !"".equals(user.getCreateTime())) {
sql.SET("create_time = #{createTime}");
}
if (user.getUpdateTime() != null && !"".equals(user.getUpdateTime())) {
sql.SET("update_time = #{updateTime}");
}
sql.WHERE("id = #{id}");
return sql.toString();
}
public String deleteUser(String id) {
SQL sql = new SQL();
sql.DELETE_FROM("t_user");
if (id != null && !"".equals(id)) {
sql.WHERE("id = #{id,jdbcType=VARCHAR}");
}
return sql.toString();
}
}
在dao层中,分别通过 @SelectProvider、@UpdateProvider、@InsertProvider、@DeleteProvider 这四个注解,调用对应的方法,执行构造的SQL语句。完成CRUD操作。