mybatis使用自定义sql语句 [数据库教程]

database

新建一个接口 SqlBaseMapper 封装常用的增删改查

public interface SqlBaseMapper {

/**

* 查询单条数据返回Map<String, Object>

*

* @param sql sql语句

* @return Map<String, Object>

*/

Map<String, Object> sqlSelectOne(String sql);

/**

* 查询单条数据返回Map<String, Object>

*

* @param sql sql语句

* @param value 参数

* @return Map<String, Object>

*/

Map<String, Object> sqlSelectOne(String sql, Object value);

/**

* 查询单条数据返回实体类型

*

* @param sql sql语句

* @param resultType 具体类型

* @return 定义的实体类型

*/

<T> T sqlSelectOne(String sql, Class<T> resultType);

/**

* 查询单条数据返回实体类型

*

* @param sql sql语句

* @param value 参数

* @param resultType 具体类型

* @return 定义的实体类型

*/

<T> T sqlSelectOne(String sql, Object value, Class<T> resultType);

/**

* 查询数据返回

*

* @param sql sql语句

* @return List<Map < String, Object>>

*/

List<Map<String, Object>> sqlSelectList(String sql);

/**

* 查询数据返回

*

* @param sql sql语句

* @param value 参数

* @return List<Map < String, Object>>

*/

List<Map<String, Object>> sqlSelectList(String sql, Object value);

/**

* 查询数据返回

*

* @param sql sql语句

* @param resultType 具体类型

* @return List<T>

*/

<T> List<T> sqlSelectList(String sql, Class<T> resultType);

/**

* 查询数据返回

*

* @param sql sql语句

* @param value 参数

* @param resultType 具体类型

* @return List<T>

*/

<T> List<T> sqlSelectList(String sql, Object value, Class<T> resultType);

/**

* 插入数据

*

* @param sql sql语句

* @return int

*/

int sqlInsert(String sql);

/**

* 插入数据

*

* @param sql sql语句

* @param value 参数

* @return int

*/

int sqlInsert(String sql, Object value);

/**

* 更新数据

*

* @param sql sql语句

* @return int

*/

int sqlUpdate(String sql);

/**

* 更新数据

*

* @param sql sql语句

* @param value 参数

* @return int

*/

int sqlUpdate(String sql, Object value);

/**

* 删除数据

*

* @param sql sql语句

* @return int

*/

int sqlDelete(String sql);

/**

* 查询数据返回List<T>

*

* @param sql sql语句

* @param value 参数

* @return int

*/

int sqlDelete(String sql, Object value);

}

 

新建一个SqlMapper 实现SqlBaseMapper接口

/**

* @author chaild

* @Date 2020-7-7 14:43:35

* 自定义SQL查询类

*/

@Component

publicclass SqlMapper implements SqlBaseMapper {

/**

* 使用方式

*

* @Autowired private SqlMapper sqlMapper;

*/

private SqlSession sqlSession;

private SqlMapper.MSUtils msUtils;

@Autowired

SqlSessionFactory sqlSessionFactory;

public SqlMapper() {

}


/**这个注解具体意思可以自己去了解一下**/

@PostConstruct

privatevoid init() {

this.sqlSession = sqlSessionFactory.openSession(true);

this.msUtils = new SqlMapper.MSUtils(sqlSession.getConfiguration());

}

private <T> T getOne(List<T> list) {

if (list.size() == 1) {

return list.get(0);

} elseif (list.size() > 1) {

thrownew TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());

} else {

returnnull;

}

}

/**

* 查询单条数据返回Map<String, Object>

*

* @param sql sql语句

* @return Map<String, Object>

*/

@Override

public Map<String, Object> sqlSelectOne(String sql) {

List<Map<String, Object>> list = this.sqlSelectList(sql);

return (Map) this.getOne(list);

}

/**

* 查询单条数据返回Map<String, Object>

*

* @param sql sql语句

* @param value 参数

* @return Map<String, Object>

*/

@Override

public Map<String, Object> sqlSelectOne(String sql, Object value) {

List<Map<String, Object>> list = this.sqlSelectList(sql, value);

return (Map) this.getOne(list);

}

/**

* 查询单条数据返回实体类型

*

* @param sql sql语句

* @param resultType 具体类型

* @return 定义的实体类型

*/

@Override

public <T> T sqlSelectOne(String sql, Class<T> resultType) {

List<T> list = this.sqlSelectList(sql, resultType);

returnthis.getOne(list);

}

/**

* 查询单条数据返回实体类型

*

* @param sql sql语句

* @param value 参数

* @param resultType 具体类型

* @return 定义的实体类型

*/

@Override

public <T> T sqlSelectOne(String sql, Object value, Class<T> resultType) {

List<T> list = this.sqlSelectList(sql, value, resultType);

returnthis.getOne(list);

}

/**

* 查询数据返回

*

* @param sql sql语句

* @return List<Map < String, Object>>

*/

@Override

public List<Map<String, Object>> sqlSelectList(String sql) {

String msId = this.msUtils.select(sql);

returnthis.sqlSession.selectList(msId);

}

/**

* 查询数据返回

*

* @param sql sql语句

* @param value 参数

* @return List<Map < String, Object>>

*/

@Override

public List<Map<String, Object>> sqlSelectList(String sql, Object value) {

Class<?> parameterType = value != null ? value.getClass() : null;

String msId = this.msUtils.selectDynamic(sql, parameterType);

returnthis.sqlSession.selectList(msId, value);

}

/**

* 查询数据返回

*

* @param sql sql语句

* @param resultType 具体类型

* @return List<T>

*/

@Override

public <T> List<T> sqlSelectList(String sql, Class<T> resultType) {

String msId;

if (resultType == null) {

msId = this.msUtils.select(sql);

} else {

msId = this.msUtils.select(sql, resultType);

}

returnthis.sqlSession.selectList(msId);

}

/**

* 查询数据返回

*

* @param sql sql语句

* @param value 参数

* @param resultType 具体类型

* @return List<T>

*/

@Override

public <T> List<T> sqlSelectList(String sql, Object value, Class<T> resultType) {

Class<?> parameterType = value != null ? value.getClass() : null;

String msId;

if (resultType == null) {

msId = this.msUtils.selectDynamic(sql, parameterType);

} else {

msId = this.msUtils.selectDynamic(sql, parameterType, resultType);

}

returnthis.sqlSession.selectList(msId, value);

}

/**

* 插入数据

*

* @param sql sql语句

* @return int

*/

@Override

publicint sqlInsert(String sql) {

String msId = this.msUtils.insert(sql);

returnthis.sqlSession.insert(msId);

}

/**

* 插入数据

*

* @param sql sql语句

* @param value 参数

* @return int

*/

@Override

publicint sqlInsert(String sql, Object value) {

Class<?> parameterType = value != null ? value.getClass() : null;

String msId = this.msUtils.insertDynamic(sql, parameterType);

returnthis.sqlSession.insert(msId, value);

}

/**

* 更新数据

*

* @param sql sql语句

* @return int

*/

@Override

publicint sqlUpdate(String sql) {

String msId = this.msUtils.update(sql);

returnthis.sqlSession.update(msId);

}

/**

* 更新数据

*

* @param sql sql语句

* @param value 参数

* @return int

*/

@Override

publicint sqlUpdate(String sql, Object value) {

Class<?> parameterType = value != null ? value.getClass() : null;

String msId = this.msUtils.updateDynamic(sql, parameterType);

returnthis.sqlSession.update(msId, value);

}

/**

* 删除数据

*

* @param sql sql语句

* @return int

*/

@Override

publicint sqlDelete(String sql) {

String msId = this.msUtils.delete(sql);

returnthis.sqlSession.delete(msId);

}

/**

* 查询数据返回List<T>

*

* @param sql sql语句

* @param value 参数

* @return int

*/

@Override

publicint sqlDelete(String sql, Object value) {

Class<?> parameterType = value != null ? value.getClass() : null;

String msId = this.msUtils.deleteDynamic(sql, parameterType);

returnthis.sqlSession.delete(msId, value);

}

/**

* 进行预编译

*/

privateclass MSUtils {

private Configuration configuration;

private LanguageDriver languageDriver;

private MSUtils(Configuration configuration) {

this.configuration = configuration;

this.languageDriver = configuration.getDefaultScriptingLanguageInstance();

}

private String newMsId(String sql, SqlCommandType sqlCommandType) {

StringBuilder msIdBuilder = new StringBuilder(sqlCommandType.toString());

msIdBuilder.append(".").append(sql.hashCode());

return msIdBuilder.toString();

}

privateboolean hasMappedStatement(String msId) {

returnthis.configuration.hasStatement(msId, false);

}

privatevoid newSelectMappedStatement(String msId, SqlSource sqlSource, final Class<?> resultType) {

MappedStatement ms = (new MappedStatement.Builder(this.configuration, msId, sqlSource, SqlCommandType.SELECT)).resultMaps(new ArrayList<ResultMap>() {

{

this.add((new org.apache.ibatis.mapping.ResultMap.Builder(com.culturalCenter.placeManage.mapper.SqlMapper.MSUtils.this.configuration, "defaultResultMap", resultType, new ArrayList(0))).build());

}

}).build();

this.configuration.addMappedStatement(ms);

}

privatevoid newUpdateMappedStatement(String msId, SqlSource sqlSource, SqlCommandType sqlCommandType) {

MappedStatement ms = (new MappedStatement.Builder(this.configuration, msId, sqlSource, sqlCommandType)).resultMaps(new ArrayList<ResultMap>() {

{

this.add((new org.apache.ibatis.mapping.ResultMap.Builder(com.culturalCenter.placeManage.mapper.SqlMapper.MSUtils.this.configuration, "defaultResultMap", Integer.TYPE, new ArrayList(0))).build());

}

}).build();

this.configuration.addMappedStatement(ms);

}

private String select(String sql) {

String msId = this.newMsId(sql, SqlCommandType.SELECT);

if (this.hasMappedStatement(msId)) {

return msId;

} else {

StaticSqlSource sqlSource = new StaticSqlSource(this.configuration, sql);

this.newSelectMappedStatement(msId, sqlSource, Map.class);

return msId;

}

}

private String selectDynamic(String sql, Class<?> parameterType) {

String msId = this.newMsId(sql + parameterType, SqlCommandType.SELECT);

if (this.hasMappedStatement(msId)) {

return msId;

} else {

SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, parameterType);

this.newSelectMappedStatement(msId, sqlSource, Map.class);

return msId;

}

}

private String select(String sql, Class<?> resultType) {

String msId = this.newMsId(resultType + sql, SqlCommandType.SELECT);

if (this.hasMappedStatement(msId)) {

return msId;

} else {

StaticSqlSource sqlSource = new StaticSqlSource(this.configuration, sql);

this.newSelectMappedStatement(msId, sqlSource, resultType);

return msId;

}

}

private String selectDynamic(String sql, Class<?> parameterType, Class<?> resultType) {

String msId = this.newMsId(resultType + sql + parameterType, SqlCommandType.SELECT);

if (this.hasMappedStatement(msId)) {

return msId;

} else {

SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, parameterType);

this.newSelectMappedStatement(msId, sqlSource, resultType);

return msId;

}

}

private String insert(String sql) {

String msId = this.newMsId(sql, SqlCommandType.INSERT);

if (this.hasMappedStatement(msId)) {

return msId;

} else {

StaticSqlSource sqlSource = new StaticSqlSource(this.configuration, sql);

this.newUpdateMappedStatement(msId, sqlSource, SqlCommandType.INSERT);

return msId;

}

}

private String insertDynamic(String sql, Class<?> parameterType) {

String msId = this.newMsId(sql + parameterType, SqlCommandType.INSERT);

if (this.hasMappedStatement(msId)) {

return msId;

} else {

SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, parameterType);

this.newUpdateMappedStatement(msId, sqlSource, SqlCommandType.INSERT);

return msId;

}

}

private String update(String sql) {

String msId = this.newMsId(sql, SqlCommandType.UPDATE);

if (this.hasMappedStatement(msId)) {

return msId;

} else {

StaticSqlSource sqlSource = new StaticSqlSource(this.configuration, sql);

this.newUpdateMappedStatement(msId, sqlSource, SqlCommandType.UPDATE);

return msId;

}

}

private String updateDynamic(String sql, Class<?> parameterType) {

String msId = this.newMsId(sql + parameterType, SqlCommandType.UPDATE);

if (this.hasMappedStatement(msId)) {

return msId;

} else {

SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, parameterType);

this.newUpdateMappedStatement(msId, sqlSource, SqlCommandType.UPDATE);

return msId;

}

}

private String delete(String sql) {

String msId = this.newMsId(sql, SqlCommandType.DELETE);

if (this.hasMappedStatement(msId)) {

return msId;

} else {

StaticSqlSource sqlSource = new StaticSqlSource(this.configuration, sql);

this.newUpdateMappedStatement(msId, sqlSource, SqlCommandType.DELETE);

return msId;

}

}

private String deleteDynamic(String sql, Class<?> parameterType) {

String msId = this.newMsId(sql + parameterType, SqlCommandType.DELETE);

if (this.hasMappedStatement(msId)) {

return msId;

} else {

SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, parameterType);

this.newUpdateMappedStatement(msId, sqlSource, SqlCommandType.DELETE);

return msId;

}

}

}

}

 

然后做一个 数据连接工厂类

SqlSessionFactoryConfig

/**

* @author chaild

* @Date 2020年6月23日18:25:22

* 创建SQL连接工厂类

* */

@Configuration

publicclass SqlSessionFactoryConfig {

@javax.annotation.Resource

DruidDataSource dataSource;

@Bean

@Primary

public SqlSessionFactory sqlSessionFactory() throws Exception {

SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

bean.setDataSource(dataSource);//更多参数请自行注入

bean.setPlugins(new Interceptor[]{new SqlInterceptor()});

Resource[] resources = new PathMatchingResourcePatternResolver()

.getResources("classpath*:mapper/*.xml");

bean.setMapperLocations(resources);

return bean.getObject();

}

}

 

使用示例:

@Autowired 

private SqlMapper sqlMapper;

###selectList

//查询,返回List<Map>

List<Map<String, Object>> list = sqlMapper.selectList("select * from country where id < 11");

//查询,返回指定的实体类

List<Country> countryList = sqlMapper.selectList("select * from country where id < 11", Country.class);

//查询,带参数

countryList = sqlMapper.selectList("select * from country where id < #{id}", 11, Country.class);

//复杂点的查询,这里参数和上面不同的地方,在于传入了一个对象

Country country = new Country();

country.setId(11);

countryList = sqlMapper.selectList("<script>" +

"select * from country " +

" <where>" +

" <if test="id != null">" +

" id &lt; #{id}" +

" </if>" +

" </where>" +

"</script>", country, Country.class);

##复杂查询使用map传入参数

Map<String,String> map=new HashMap<>();

map.put("id","21321312312312312");

map.put("status","1");

sqlMapper.sqlSelectList("select * from tb_admin where id=#{id} and status=#{status}",map,Admin.class);

###selectOne 查询单条数据

Map<String, Object> map = sqlMapper.selectOne("select * from country where id = 35");

map = sqlMapper.selectOne("select * from country where id = #{id}", 35);

Country country = sqlMapper.selectOne("select * from country where id = 35", Country.class);

country = sqlMapper.selectOne("select * from country where id = #{id}", 35, Country.class);

###insert,update,delete

###insert 插入数据

int result = sqlMapper.insert("insert into country values(1921,‘天朝‘,‘TC‘)");

Country tc = new Country();

tc.setId(1921);

tc.setCountryname("天朝");

tc.setCountrycode("TC");

//注意这里的countrycode和countryname故意写反的

result = sqlMapper.insert("insert into country values(#{id},#{countrycode},#{countryname})"

, tc);

###update 更新使用

result = sqlMapper.update("update country set countryname = ‘天朝‘ where id = 35");

tc = new Country();

tc.setId(35);

tc.setCountryname("天朝");

int result = sqlMapper.update("update country set countryname = #{countryname}" +

" where id in(select id from country where countryname like ‘A%‘)", tc);

##delete 删除使用

result = sqlMapper.delete("delete from country where id = 35");

result = sqlMapper.delete("delete from country where id = #{id}", 35);

 

 

如果实现 了 Interceptor 类进行SQL二次处理封装,会报二次编译的问题 

 

mybatis 使用自定义sql 语句

以上是 mybatis使用自定义sql语句 [数据库教程] 的全部内容, 来源链接: utcz.com/z/534858.html

回到顶部