日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java04376_Java - jdbc mybatis

發布時間:2023/12/2 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java04376_Java - jdbc mybatis 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

jdbc

首先配置maven包

org.springframework.boot

spring-boot-starter-jdbc

org.mybatis.spring.boot

mybatis-spring-boot-starter

2.1.0

注意pom.xml中配置結點

src/main/java

**/*.xml

false

src/main/resources

static/*.*

templates/*.*

**/*.xml

**/*.yml

**/*.properties

false

針對不同的數據庫,引入對應的包:SqlServer-sqljdbc4,DB2-db2jcc4,以SqlServer為例

在com.cmb.**.mapper.sqlserver目錄下新建接口文件

@Repository

public interface SqlserverMapper {

List function_name();

}

同時在resources/mapperconfig/sqlserver目錄下新建xml文件

select ... from ...

數據源類和工廠類配置如下

@MapperScan(basePackages = "com.cmb.**.mapper.sqlserver", sqlSessionFactoryRef = "sqlserverSqlSessionFactoryBean")

@SpringBootConfiguration

public class SqlserverDataSourceConfiguration {

private static String jdbcUrl, jdbcUser, jdbcPassword, maximumPoolSize;

static { ... }

@Bean(name = "sqlserverDataSource")

public DataSource createDataSource() {

return DataSourceConfig.getHikariDataSourceInstance(jdbcUrl, jdbcUser, jdbcPassword, maximumPoolSize);

}

}

@Configuration

public class SqlserverSessionFactoryConfiguration {

@Autowired

@Qualifier(value = "sqlserverDataSource")

private DataSource sqlserverDataSource;

private String mapperXmlConfigPath = "/mapperconfig/sqlserver/**.xml", mapperPackagePath = "com.cmb.**.mapper.sqlserver";

@Bean(name = "sqlserverSqlSessionFactoryBean")

public SqlSessionFactoryBean createSqlSessionFactory() throws Exception {

return DataSourceConfig.getSqlSessionFactoryBeanInstance(mapperXmlConfigPath, mapperPackagePath, sqlserverDataSource);

}

}

如需事務操作,上述配置類中分別新增

@Bean(name = "sqlserverTransactionManager")

@Primary

public DataSourceTransactionManager createTransactionManager(@Qualifier("sqlserverDataSource") DataSource dataSource) {

return new DataSourceTransactionManager(dataSource);

}

@Bean(name = "sqlserverSqlSessionTemplate")

@Primary

public SqlSessionTemplate createSqlSessionTemplate(@Qualifier("sqlserverSqlSessionFactoryBean") SqlSessionFactory sqlSessionFactory) {

return new SqlSessionTemplate(sqlSessionFactory);

}

public static HikariDataSource getHikariDataSourceInstance(String jdbcUrl, String jdbcUser, String jdbcPassword, String maximumPoolSize) {

HikariDataSource source = new HikariDataSource();

source.setJdbcUrl(jdbcUrl);

source.setUsername(jdbcUser);

source.setPassword(jdbcPassword);

source.setMaximumPoolSize(Integer.valueOf(maximumPoolSize));

return source;

}

public static SqlSessionFactoryBean getSqlSessionFactoryBeanInstance(String mapperXmlConfigPath, String mapperPackagePath, DataSource ds) throws Exception {

SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

String xmlConfigPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + mapperXmlConfigPath;

bean.setMapperLocations(resolver.getResources(xmlConfigPath));//設置mapper對應的XML文件的路徑

bean.setDataSource(ds);//設置數據源

bean.setTypeAliasesPackage(mapperPackagePath);//設置mapper接口所在的包

bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);

return bean;

}

附上配置文件

- name: afvapp_hikari_sql_jdbcUrl

value: "jdbc:sqlserver://55.14.18.118:1433;DatabaseName=Business"

- name: afvapp_hikari_sql_username

value: "sa"

- name: afvapp_hikari_sql_password

value: "cmbzephyr"

- name: afvapp_hikari_sql_maximumPoolSize

value: "25"

若是mysql庫,記得追加?Unicode=true&characterEncoding=UTF-8,否則部分數據庫會中文亂碼

mybatis

★??☆ SpringBoot中設置返回類型map,值為空時字段不顯示

查了幾種方法,均無效...

application.properties中配置 mybatis.configuration.call-setters-on-nulls=true

最后通過配置SqlSessionFactoryBean實現:高鐵直達

org.apache.ibatis.session.Configuration config = new org.apache.ibatis.session.Configuration();

config.setCallSettersOnNulls(true);

bean.setConfiguration(config);

對于字段送默認值的問題,同時設置config.setJdbcTypeForNull(JdbcType.NULL);

★??☆ #{}和${}備忘

對sql語句預編譯前,會動態解析為一個BoundSql對象,#{}被解析為一個參數占位符?,${}直接被純碎的string替換

考慮到性能問題和防sql注入:

能使用#{}的地方就用#{}

表名作為變量時,必須用${}

傳入數值時,select top等也建議${}

#{}:創建預處理語句屬性從而設置安全的值,常用作查詢條件的值、指定一個確切的數據類型

${}:不會修改或轉義字符串,直接在SQL語句中插入一個不改變的字符串,常用于拼湊sql的實體部分

詳情參見:動態sql中的#與$

★??☆ 動態sql

先來一個mybatis的案例熱熱身:mybatis遇坑填坑

數據庫字段binary8的問題

//sqlserver

sql語句:where UniqueID=${uniqueID},代碼入參送值:"0x22CE15DD10F7F70F"

預編譯后:where UniqueID=0x22CE15DD10F7F70F

//db2

sql語句:where UniqueID=x${uniqueID},代碼入參送值:"'2213C85A0004376B'"

預編譯后:where VerifyID=x'2213C85A0004376B'

定義resultMap通常需類型轉換,須引入mybatis-typehandlers-jsr310,并配置屬性typeHandler,注意要以全局限定絕對路徑。通常無需指定,mybatis會自動探測。建議同時引入jackson-datatype-jsr310。

實體類字段Java.sql.Date、java.sql.Timestamp、java.util.Date映射數據庫的date、timestamp、datetime字段

對mybatis返回的時間戳作格式化處理,可在ObjectMapper反序列化時統一處理,與具體數據庫解耦

@Component

public class JacksonConfig {

@Bean

@Primary

public ObjectMapper objectMapper() {

ObjectMapper mapper = new ObjectMapper();

mapper.registerModule(new JSR310Module());

mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));

return mapper;

}

}

問題:sqlserver列類型datetime,實體類字段為java.time.LocalDateTime,mybatis映射報錯

1、java.util.Date可以,或直接用String

2、typeHandler="org.apache.ibatis.type.LocalDateTimeTypeHandler"無效

3、mybatis-3.5.0直接可以,無需typeHandler

第2種:mybatis-spring-boot-starter-2.1默認引入的mybatis-3.5.2拋異常且捕獲不到,請求返回結果報錯:3.5.x>=1均不行:mybatis 3.5.X的特性與bug

"status": 500,

"error": "Internal Server Error",

"message": "Method com/microsoft/sqlserver/jdbc/SQLServerResultSet.getObject(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; is abstract",

此時需自定義TypeHandler,并typeHandler="com.cmb.afvapp.common.handler.MyLocalDateTimeTypeHandler"

public class MyLocalDateTimeTypeHandler extends LocalDateTimeTypeHandler {

@Override

public LocalDateTime getResult(ResultSet rs, String columnName) throws SQLException {

Object object = rs.getObject(columnName);

System.out.println(columnName + ": " + object);

if(object instanceof java.sql.Timestamp){//強轉,將sql的時間轉為LocalDateTime

return LocalDateTime.ofInstant(((Timestamp)object).toInstant(), ZoneOffset.ofHours(0));//按需轉化

}

return super.getResult(rs, columnName);

}

}

關于typehandler的映射問題,參見:mybatis-typeHandlers

若遇到type-aliases-package、type-handlers-package等不起作用,導致類加載失敗問題,解決:

sqlSessionFactoryBean.setVfs(SpringBootVFS.class);

★??☆ 全局日期格式化問題

LocalDateTime默認ISO時間:'2011-11-03T10:15:30',提供幾種格式化方法:好文參見

可以采用注解方式

@JsonSerialize(using = LocalDateTimeSerializer.class)

@JsonDeserialize(using = LocalDateTimeDeserializer.class)

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

若序列化后有小時差,需json序列化時指定時區為GMT+8。

或在配置類里定義兩個Bean,可完成全局日期格式化處理,同時兼顧Date和LocalDateTime并存

@Configuration

public class LocalDateTimeSerializerConfig {

@org.springframework.beans.factory.annotation.Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")

private String pattern_format;

@Bean

public LocalDateTimeSerializer localDateTimeDeserializer() {

return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern_format));

}

@Bean

public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {

return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());

}

}

或者采用

@Bean(name = "mapperObject")

public ObjectMapper getObjectMapper() {

ObjectMapper om = new ObjectMapper();

JavaTimeModule javaTimeModule = new JavaTimeModule();

javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));

javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));

om.registerModule(javaTimeModule);

return om;

}

springboot以注解引入mybatis

注解:去XML化

★??☆ 快速生成映射結果集方法

public static String getResultsStr(Class origin) {

StringBuilder stringBuilder = new StringBuilder();

stringBuilder.append("@Results({\n");

for (Field field : origin.getDeclaredFields()) {

String property = field.getName();

//映射關系:對象屬性(駝峰)->數據庫字段(下劃線)

String column = new PropertyNamingStrategy.SnakeCaseStrategy().translate(field.getName()).toUpperCase();

stringBuilder.append(String.format("@Result(property = \"%s\", column = \"%s\"),\n", property, column));

}

stringBuilder.append("})");

return stringBuilder.toString();

}

總結

以上是生活随笔為你收集整理的java04376_Java - jdbc mybatis的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。