ç®å½
ââåºè¨ââ
ââåççmybatisï¼ä½¿ç¨xmlï¼ââ
ââå ³äºå«åââ
ââå ³äºnamespaceââ
ââåççmybatisï¼ä½¿ç¨æ³¨è§£ï¼ââ
ââMybatisä¸springââ
ââMapperFactoryBeanââ
ââSqlSessionDaoSupport ââ
ââMybatisä¸springBootââ
ââMybatisä¸mybatis-plusââ
åºè¨
æè¿é¡¹ç®ä¸ï¼éè¦å¨mysqlé颿°å¢ä¸ä¸ªè¡¨ï¼ç¶åå¥ç¨mybatisåå¢å æ¹æ¥ï¼ç¶ååmapper.javaçæ¹æ³ä¸å注解ãåçåçå°±æè§å¾ç¦ï¼ä¸ºä»ä¹å¢ï¼çä¸é¢ï¼Â Â
@Insert({
"INSERT INTO " + TABLE_NAME + INSERT_COLUMNS +
" VALUES" +
"(#{id},now(),now(),#{idxConfigId},#{userId},#{ownerId},#{status}," +
" #{ukIdempotent},#{startTime},#{endTime},#{extraInfo}," +
" #{awardResult},#{boxConfig},#{currentCount},#{treeId},#{target},#{scope} )"
})
int insertFinanceInfo(FarmFinanceInfoDO financeInfoDO);
@Update({ "update "+TABLE_NAME+" set " +
" idx_config_id = #{idxConfigId}, " +
" owner_id = #{ownerId},status = #{status}, " +
" uk_idempotent = #{ukIdempotent}, " +
" start_time = #{startTime,jdbcType=TIMESTAMP}, " +
" end_time = #{endTime,jdbcType=TIMESTAMP}, " +
" current_count = #{currentCount}, " +
" tree_id = #{treeId},target = #{target}, scope = #{scope}, " +
" box_config = #{boxConfig},award_result = #{awardResult}, " +
" extra_info = #{extraInfo} " +
" where id = #{id} and user_id= #{userId}" })
int updateFinanceInfo(FarmFinanceInfoDO financeInfoDO);
å ¶å®ææ¯ç¹å«ä¸å欢å¨javaæä»¶éåè¿ç§å¾é¿ç注解çï¼æè§ç¹å«ä¹±ï¼æçè³æ¿ææå®æ¾å°xmléé¢ã忥å¨ç½ä¸æäºä¸ä¸åæ¥è¿æä¸ä¸ªå«mybatis-plusçç»ä»¶ï¼ççè¿ä¸éï¼ç¶åå¨åºç¨è¿ç¨ä¸ä¹åçäºä¸ä¸é®é¢ï¼é®é¢çæ ¹æºå°±æ¯èªå·±è¿æ¯æ¥äºæ±æï¼ç´æ¥å¨ç½ä¸æä¸ä¸ç°æç䏿ä½ç³»ç代ç å°±ç¨ï¼åé¢èªç¶ä¸å é®é¢ãç¶åè¿ä¸¤å¤©å°±ç¨å¾®æ¤åºä¸ç¹æ¶é´ï¼æmybatisç使ç¨ï¼ä»æå¼å§çåçxmlï¼å°æ³¨è§£ï¼å°springï¼å°spring-bootå°mybatis-plusç使ç¨é½æ¢³çäºä¸éã
åççmybatisï¼ä½¿ç¨xmlï¼
POMå¦ä¸ï¼
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
ä¸é¢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>
<!-- å«å -->
<typeAliases>
<package name="entity"/>
</typeAliases>
<!-- æ°æ®åºç¯å¢ -->
<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/test_db?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- æ å°æä»¶ -->
<mappers>
<mapper resource="mapper/user.xml"/>
</mappers>
</configuration>
ä¸é¢æ¯æä¸ªmapperçé ç½®
<?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="xml">
<select id="listUser" resultType="user">
select * from user;
</select>
</mapper>
è¿ä¸ªmapperéé¢æä¸ªnamespaceï¼æä¸ç´ä¸ç¥é宿¯ä»ä¹ææãæ²¡å ³ç³»è¿ä¸ªnamespaceå é便åï¼ä¸ä¼å°±ç¥é宿¯ä»ä¹ææäºã
å¢å entity
package entity;
/**
* @program: parent_pro
* @description:
* @author: æ¸æ°´
* @create: 2021/07/21
*/
public class User {
private int id;
private String username;
private String password;
private String nickname;
// çç¥getset
}
æåçå¯å¨ç±»
package xml;
import entity.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @program: parent_pro
* @description:
* @author: æ¸æ°´
* @create: 2021/07/21
*/
public class MyBatisWithXML {
public static void main(String[] args) {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
// æåéè¿ session ç selectList() æ¹æ³è°ç¨ sql è¯å¥ listStudent
List<User> userList = session.selectList("listUser");
for (User student : userList) {
System.out.println("ID:" + student.getId() + ",NAME:" + student.getUsername());
}
}
}
æä»¬ççæ´ä¸ªé¡¹ç®ä¸ªç»æå¾ï¼

æ°æ®åºé£è¾¹ï¼æå·²ç»å»ºç«å¥½äºï¼å¤§å®¶ççï¼
è¿è¡é¡¹ç®å°±è½çå°ï¼
OKï¼è³æ¤é¡¹ç®å·²ç»å¯ä»¥è¿è¡äºã
ç¶åæä»¬åæä¸ä¸ä»£ç ï¼
å ³äºå«å
䏿®µä¸æ®µç
<select id="listUser" resultType="user">
select * from user limit 5;
</select>
è¿ä¸ªéé¢çresultTypeï¼æä»¬ä¸ç¨çæ¡æ¶ï¼å¤§æ¦å°±æå®æçæ¯æä¸é¢çsqlè¯å¥æ§è¡çç»æï¼å è£ æä»ä¹ç±»åã
é£ä¹å å个user,mybatisç¥éè¿ä¸ªuseræ¯ä¸ªä»ä¹ä¸è¥¿ä¹ï¼
<!-- å«å -->
<typeAliases>
<package name="entity"/>
</typeAliases>
ä¸é¢ä¸æ®µä»£ç çè¯ä¹å°±æ¯ï¼æentityä¸é¢çå®ä½é½å ä¸ä¸ªå«åï¼èå«åå°±æ¯ç±»åãæä»¥mybatiså°±ç¥éä¸é¢çuserå ¶å®å¯¹åºçå°±æ¯entity.Userè¿ä¸ªç±»ã
å ³äºnamespace
ä¸é¢å·²ç»æäºä¸ä¸ªmapperï¼æç°å¨åå ä¸ä¸ªmapperå¦ä¸ï¼
 åä¹åé£ä¸ªçåºå«å°±æ¯ä¸ä¸ªlimit 5ï¼ä¸ä¸ªlimit 10
ç¶å让mybatisç主é ç½®æä»¶æç¥å°è¿ä¸ªuser2.xml
<!-- æ å°æä»¶ -->
<mappers>
<mapper resource="mapper/user.xml"/>
<mapper resource="mapper/user2.xml"/>
</mappers>
ç¶åè¿è¡ä»£ç ä¼åç°ï¼
 说ç徿¸ æ¥listUserè¿ä¸ªidéå¤äºã
å¨çº¿ä¸å·¥ç¨éï¼è¦ä¿è¯ææçsqlçidé½ä¸é夿ç¹å°é¾ï¼æä»¥å¼å ¥äºnamespaceçæ¦å¿µã妿䏿¦æéå¤çidï¼é£ä¹sessionè°ç¨çæ¶å徿å®namespaceã
List<User> userList = session.selectList("xml.listUser");
å ³äºresultMap
ä¸é¢çä¾åéå±ä»¬çjavaç±»é½æ¯ç®åçåç¬¦ä¸²åæ°åï¼å¦ææ¯ä¸ä¸ªæ¯è¾å¤æçç»æå¢ï¼ä¾å¦ä¸ä¸ªFamilyéé¢æä¸ªlistï¼æ¯ä¸ªå ç´ é½æ¯ä¸ä¸ªPersonãæä¹åï¼DBéé¢å¯¹äºç表éé¢list使ç¨jsonåå¨çãæä¹æjson转åæå±ä»¬çPersonå¢ï¼
è¿éå°±è¦æå°ä¸ä¸ªresultMapè¿ä¸ªä¸è¥¿äº
æä»¬å çæä¹ä½¿ç¨
<resultMap id="res_family" type="com.alibaba.entity.Family">
<result column="family_name" property="familyName"/>
<result column="car" property="car"
typeHandler="com.alibaba.entity.handler.JsonTypeHandler"
javaType="com.alibaba.entity.Car"/>
<result column="family_persion_list" property="familyPersionList"
typeHandler="com.alibaba.entity.handler.ListTypeHandler"
javaType="com.alibaba.entity.Lover"/>
</resultMap>
<select resultMap="res_family" id="getAll">
select * from family
</select>
<insert id="insert">
insert into family (family_name,car,family_persion_list)
values( #{familyName}
,#{car ,javaType=com.alibaba.entity.Car, typeHandler = com.alibaba.entity.handler.JsonTypeHandler}
,#{familyPersionList ,javaType=com.alibaba.entity.Person, typeHandler = com.alibaba.entity.handler.ListTypeHandler}
)
</insert>
éè¿ä¸é¢ç代ç ï¼æä»¬å°±æ¯çé½è½çå¤çï¼ä½¿ç¨getAllæ¥è¯¢çæ¶åï¼ç»æä½¿ç¨res_familyæ¥ç»ç»ï¼æç»è£ é æcom.alibaba.entity.Familyãmysql表éé¢çfamily_persion_listèªå¨è¢«è½¬åæLoverãè¿é颿¶åå°ä¸¤ä¸ªHandlerã
package com.alibaba.entity.handler;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JsonTypeHandler<T> extends BaseTypeHandler<T> {
private static ObjectMapper objectMapper;
private Class<T> type;
static {
objectMapper = new ObjectMapper();
}
public JsonTypeHandler(Class<T> type) {
if (type == null) {
throw new IllegalArgumentException("Type argument cannot be null");
}
this.type = type;
}
private T parse(String json) {
try {
if(json == null || json.length() == 0) {
return null;
}
return objectMapper.readValue(json, type);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private String toJsonString(Object obj) {
try {
return objectMapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
@Override
public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
return (T) parse(rs.getString(columnName));
}
@Override
public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return (T) parse(rs.getString(columnIndex));
}
@Override
public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return (T) parse(cs.getString(columnIndex));
}
@Override
public void setNonNullParameter(PreparedStatement ps, int columnIndex, T parameter, JdbcType jdbcType) throws SQLException {
ps.setString(columnIndex, toJsonString(parameter));
}
}
package com.alibaba.entity.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.TypeHandler;
import org.springframework.util.CollectionUtils;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* å¤çjsonArrayå符串为pojoList
*
*
* @author zj
* @date 2020/1/8
*/
@MappedJdbcTypes({JdbcType.VARCHAR})
public class ListTypeHandler<T extends Object> implements TypeHandler<List<T>> {
private List<T> getListByJsonArrayString(String content) {
if (StringUtils.isEmpty(content)) {
return new ArrayList<>();
}
return JSON.parseObject(content, new TypeReference<ArrayList<T>>() {
});
}
/**
* ç¨äºå®ä¹å¨Mybatisè®¾ç½®åæ°æ¶è¯¥å¦ä½æJavaç±»åçåæ°è½¬æ¢ä¸ºå¯¹åºçæ°æ®åºç±»å
*
* <PRE>
* PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
* SET SALARY = ? WHERE ID = ?");
* pstmt.setBigDecimal(1, 153833.00)
* pstmt.setInt(2, 110592)
* </PRE>
*
* @param preparedStatement An object that represents a precompiled SQL statement
* @param i å½ååæ°çä½ç½®
* @param t å½ååæ°çJava对象
* @param jdbcType å½ååæ°çæ°æ®åºç±»å
* @throws SQLException
*/
@Override
public void setParameter(PreparedStatement preparedStatement, int i, List<T> t, JdbcType jdbcType) throws SQLException {
if (CollectionUtils.isEmpty(t)) {
preparedStatement.setString(i, null);
} else {
preparedStatement.setString(i, JSON.toJSONString(t));
}
}
@Override
public List<T> getResult(ResultSet resultSet, String s) throws SQLException {
return getListByJsonArrayString(resultSet.getString(s));
}
@Override
public List<T> getResult(ResultSet resultSet, int i) throws SQLException {
return getListByJsonArrayString(resultSet.getString(i));
}
@Override
public List<T> getResult(CallableStatement callableStatement, int i) throws SQLException {
return getListByJsonArrayString(callableStatement.getString(i));
}
}
大æ¦è½çæ å°±æ¯ä¸ä¸ªæjson转æpojoï¼ä¸ä¸ªæjson转æList<Pojo>ã
对åºçsqlè¯å¥å¦ä¸ï¼
CREATE TABLE `family` (
`family_name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
`car` json DEFAULT NULL,
`family_persion_list` json DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
对åºçå®ä½ç±»
package com.alibaba.entity;
import lombok.Data;
import java.util.List;
@Data
public class Family {
private String familyName;
private Car car;
private List<Lover> familyPersionList;
}
ä¸é¢çCarï¼Loverå°±æ¯ä¸¤ä¸ªæç®åçPOJO éé¢çåæ®µå¤§å®¶èªå·±åå§ã
åççmybatisï¼ä½¿ç¨æ³¨è§£ï¼
@Mapper
public interface PersonMapper {
@Select("select id,name ,age from person where id = #{id}")
Person getPersonById(int id);
@Select("<script>"
+"select * from person where 1=1"
+"<if test='name2 != null'> and name = #{name2}" +"</if>"
+"<if test='age != null'> and age = #{age}" +"</if>"
+"</script>")
List<Person> getList(@Param("name2") String name,@Param("age") String age);
@SelectProvider(type = UserDaoProvider.class, method = "getPersonByPara")
Person getPersonByPara(@Param("name") String name, @Param("age") String age);
}
å¦ä¸é¢æç¤º
è°ç¨çæ¶åå°±ç´æ¥å
PersonMapper personMapper = session.getMapper(PersonMapper.class);
Person result = personMapper.getPersonByPara("æ¸æ°´","");
List<Person> list = personMapper.getList(null,"25");
å ¶å®ï¼è¿å°±åå°æå¨åºè¨é说çäºï¼å¨java代ç éåèæ¬è¯è¨å¾ä¸ï¼ä»£ç å¾é¾è¯»ã
æä»¬å¯ä»¥ç¨ä¸ä¸ªåç¬çjavaæ¹æ³æ¥äº§çsqlè¯å¥ï¼å¦ä¸;
@Mapper
public interface PersonMapper {
@SelectProvider(type = UserDaoProvider.class, method = "getPersonByPara")
Person getPersonByPara(@Param("name") String name, @Param("age") String age);
}
public class UserDaoProvider {
public String getPersonByPara(Map<String, Object> para) {
String sql = new SQL() {
{
SELECT("id, name, age");
FROM("person");
if (StringUtils.isNotBlank("" + para.get("name"))) {
WHERE("name='" + para.get("name")+"'");
}
if (StringUtils.isNotBlank("" + para.get("age"))) {
WHERE("age=" + para.get("age"));
}
}
}.toString();
System.out.println("----" + sql);
return sql;
}
}
Mybatisä¸spring
éè¿ä¸é¢æä»¬å¯ä»¥çå°ï¼ä¸ç®¡æ¯ç¨xmlé ç½®ï¼è¿æ¯ç´æ¥å¨javaæä»¶éåæ³¨è§£ï¼æç»é½æ¯éè¿SqlSession æ¥æåä¸ä¸æ¥çæä½çã
æä»¥ï¼å°±ç®æä»¬æmybatisä¸springæ´åï¼å ¶å®æ ¸å¿åçè¿æ¯ä¾èµSqlSession çã
ç¬¬ä¸æ¥ï¼æä»¬å 廿ä¹åçmybatisä¾èµï¼æ¹æ
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
ç¶åå¨springçxmléé¢å ä¸
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
dataSourceçç¸å ³ä»£ç æè¿è¾¹å°±èµè¿°ã
ç¶åï¼å ·ä½æ¥è¯´ï¼æ´åçæè·¯æä¸¤ç§ï¼
MapperFactoryBean
ææä»¬çmapperæ¾å°MapperFactoryBeanéé¢
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{userId}")
User getUser(@Param("userId") String userId);
}
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
使ç¨çæ¶å
public class FooServiceImpl implements FooService {
private final UserMapper userMapper;
public FooServiceImpl(UserMapper userMapper) {
this.userMapper = userMapper;
}
public User doSomeBusinessStuff(String userId) {
return this.userMapper.getUser(userId);
}
}
æä»¬æä¹è¯´ä¹æ¯åäºå¹´ä»£ç ç人äºï¼ç¨å¾®å¾ä¸è¿½ä¸ä¸å§
å 说userMapper宿忝MapperFactoryBeanï¼å¦ï¼FactoryBeanï¼æ¥å¤§å®¶çä¸ä¸ï¼ä¹å°±æ¯è¯´æç»userMapperæ¯MapperFactoryBeanè°ç¨getObjectçç»æï¼æä»¬çç代ç
public abstract class SqlSessionDaoSupport extends DaoSupport {
private SqlSessionTemplate sqlSessionTemplate;
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
if (this.sqlSessionTemplate == null || sqlSessionFactory != this.sqlSessionTemplate.getSqlSessionFactory()) {
this.sqlSessionTemplate = createSqlSessionTemplate(sqlSessionFactory);
}
}
protected SqlSessionTemplate createSqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
public SqlSession getSqlSession() {
return this.sqlSessionTemplate;
}
}
public class SqlSessionTemplate implements SqlSession, DisposableBean {
//......
}
å¦åæ¥SqlSessionTemplate æ¬æ¥å°±æ¯SqlSessionå¦
SqlSessionDaoSupportÂ
第äºç§æ¹æ³æ¯SqlSessionDaoSupportÂ
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
public User getUser(String userId) {
return getSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
}
}
ç¶åæsqlSessionFactoryæ³¨å ¥è¿å»å°±å¥½
<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
å ¶å®ä¸¤ä¸ªæ¹æ³ä¹å·®ä¸å¤ï¼
飿ç°å¨åæå¦ä¸ä¸ªmapperäºï¼æä¹åï¼ååä¸éä¸é¢ç代ç ä¹ï¼
<bean id="userMapper2" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
䏿¯è¿æ ·çï¼æä»¬æä¸ç§æ¹æ¡ï¼
<!-- æ¹æ¡1 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>
<!-- æ¹æ¡2 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
<mybatis:scan base-package="org.mybatis.spring.sample.mapper" />
</beans>
<!-- æ¹æ¡3 -->
@Configuration
@MapperScan("org.mybatis.spring.sample.mapper")
public class AppConfig {
// ...
}
Mybatisä¸springBoot
ââæç®åçSpringBootæ´åMyBatisæç¨_æ±åä¸ç¹é¨ç䏿 -CSDNå客_springbootæ´åmybatisæ¥éª¤ââ