天道酬勤,学无止境

JDBC SQL 别名不起作用(JDBC SQL aliasing not working)

问题

我正在尝试在我的 Java Web 应用程序中运行以下查询:

SELECT platform AS "Platform" FROM edb.cases

Web 应用程序运行良好并且能够执行所有查询,但是每当我使用别名(通过“AS”)时,结果数据集都会为我提供一个空值。 事实上,尽管在上面的查询中为“平台”列使用了别名,但结果数据集的“平台”键为空值,但为我提供了键“平台”的正确值(这是原始的列名)。

现在,我需要执行的实际 sql 语句有点复杂,其中 select 语句和使用别名在同一个表上的左连接两次,如下所示:

 SELECT numOne.platform , numTwo.platform AS 'PlatformTwo' FROM edb.cases LEFT JOIN 
 edb.platform as numOne ON (numOne.rank = cases.platform) LEFT JOIN edb.platform as numTwo ON 
 (numTwo.rank = cases.highestPlatform) WHERE cases.index = 1000

问题是结果数据集包含键“platform”(对于 numOne 表)的正确值,但键“PlatformOne”和“PlatformTwo”不存在。 别名不起作用!

我已经尝试了 MySql 工作台中的两个语句,它们工作正常。

请不要犹豫,询问更多信息。

编辑:

准备查询并将其发送到数据库的代码:

public static List<Map<String, Object>> executeQuery(final String query,
        Map<Integer, Object> data) {
    List<Map<String, Object>> result = null;
    try {
        Connection conn = createConnection();
        PreparedStatement pstmt = null;

        pstmt = conn.prepareStatement(query);
        if(data != null) {
            pstmt = createPreparedStatement(pstmt, data);
        }

        System.out.println(pstmt.toString());
        //The GET_CASE_FOR_INDEX query uses the executequery function in the else block:
        if((pstmt.toString().indexOf("INSERT") >= 0) || (pstmt.toString().indexOf("UPDATE") >= 0)) { 
            pstmt.executeUpdate();
        } else {
            ResultSet rs = pstmt.executeQuery();

            ResultSetMetaData md = rs.getMetaData();
            int columns = md.getColumnCount();
            result = new ArrayList<Map<String, Object>>();
            /*
             * Get the next row of the ResultSet 'rs' and insert a Map of the Column/Value pair
             * into the ArrayList of Maps 'result'
             */
            while(rs.next()) {
                Map<String, Object> row = new HashMap<String, Object>(columns);
                for(int i=1; i <= columns; i++) {
                    try {
                        row.put(md.getColumnName(i), rs.getObject(i));
                    } catch(Exception e) {
                        System.out.println(md.getColumnName(i));
                        System.out.println(row);
                        e.printStackTrace();
                    }
                }
                result.add(row);
            }
        }

        destroyConnection(conn);
        pstmt.close();
    } catch(SQLException e) {
        //TODO
        e.printStackTrace();
    }
    return result;
}

创建准备好的语句的函数:

//creates a prepared statement by checking the type of the value that needs to be set.
private static PreparedStatement createPreparedStatement(
        PreparedStatement pstmt, Map<Integer, Object> data) {
    try {
        for(Integer key : data.keySet()) {
            Object value = data.get(key);

            System.out.println(key);
            if(data.get(key).equals(Types.NULL)) {
                pstmt.setNull(key, Types.INTEGER);
            } else if(value.getClass().equals(Integer.class)) {
                pstmt.setInt(key, (Integer) value);
            } else if(value.getClass().equals(String.class)) {
                pstmt.setString(key, (String) value);
            } else if(value.getClass().equals(Date.class)) {
                pstmt.setDate(key, (Date) value); 
            } else if(value.getClass().equals(Timestamp.class)) {
                pstmt.setTimestamp(key, (Timestamp) value);
            }
        }
    }catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return pstmt;
}

以及使用 executeQuery 函数执行查询并将其发送到 Web 模板的代码片段:

Map<Integer, Object> data_details = new HashMap<Integer, Object>();
data_details.put(1, parameter_ID);

List<Map<String, Object>> details = DBUtility.executeQuery(DBQuery.GET_CASE_FOR_INDEX, data_details);

webContext.setVariable("details", details);//This is where the template variable is being set

System.out.println(details);

GET_CASE_FOR_INDEX 查询是:

SELECT numOne.platform , numTwo.platform AS 'PlatformTwo' FROM edb.cases LEFT JOIN 
edb.platform as numOne ON (numOne.rank = cases.platform) LEFT JOIN edb.platform as numTwo ON 
(numTwo.rank = cases.highestPlatform) WHERE cases.index = ?

当我打印详细信息哈希映射(这是结果数据集)时,完全不存在键 PlatformTwo!

回答1

您正在使用ResultSetMetaData.getColumnName方法,该方法返回基础列的名称(如果可用)。 .getColumnLabel将返回由SELECT ... AS ...定义的列别名。

为了说明,以下Java代码

PreparedStatement ps = conn.prepareStatement(
    "SELECT platform AS Platypus FROM cases");
ResultSet rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
System.out.println(String.format(
    ".getColumnName returns \"%s\"", 
    rsmd.getColumnName(1)));
System.out.println(String.format(
    ".getColumnLabel returns \"%s\"", 
    rsmd.getColumnLabel(1)));

返回

.getColumnName returns "platform"
.getColumnLabel returns "Platypus"

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • SELECT 语句中的列别名不适用于 SQuirrel SQL + Firebird(Column aliasing in SELECT statements doesn't work with SQuirrel SQL + Firebird)
    问题 我尝试使用 SQuirrel SQL 3.4 + Firebird 1.5 + Driver JDBC Jaybird 2.2.[0|1] (JVM 1.7.0_03) 在 SELECT 语句中添加列别名,但不起作用。 别名列与列的原始名称一起出现。 在另一个工具 (DBExpert) 中,同样的语句工作正常。 语句: SELECT column1 AS alias1, column2 FROM table; SquirrelSQL 中的结果列名称: column1 - column2 DBExpert 中的结果列名称: alias1 - column2 尝试在别名周围添加 ' 和 ",但也不起作用。 有人有想法吗? 编辑:我将 JDBC Jaybird 驱动程序更新到 2.2.1 版本(9 月 30 日发布),但问题仍然存在。 编辑 2:问题已解决! 问题是由 Squirrel SQL 的默认首选项引起的。 要修复它,请转到“文件”->“全局首选项”,在“数据类型控件”选项卡中找到“常规(适用于所有类型)”并标记组合框“在结果标题中使用列标签而不是列名”。 看截图:http://i1-win.softpedia-static.com/screenshots/SQuirrel-SQL-Client_4.png?1345342622 享受。 回答1 问题是由于 JDBC
  • mybatis源码解读(二)——构建Configuration对象
    mybatis源码解读(二)——构建Configuration对象   Configuration 对象保存了所有mybatis的配置信息,主要包括:   ①、 mybatis-configuration.xml 基础配置文件   ②、 mapper.xml 映射器配置文件 1、读取配置文件   前面例子有这么一段代码: 1 private static SqlSessionFactory sqlSessionFactory; 2 3 static{ 4 InputStream inputStream = MybatisTest.class.getClassLoader().getResourceAsStream("mybatis-configuration.xml"); 5 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 6 }   第 4 行代码是获取基础配置文件mybatis-configuration.xml 的字节流。接着我们将该字节流对象作为 bulid() 方法的参数传入进去。bulid 方法源码如下:这是一个多态方法 1 public SqlSessionFactory build(InputStream inputStream) { 2 return build
  • 为什么我不能使用 SQLcl 通过 jdbc 连接(Why can't I connect via jdbc using SQLcl)
    问题 我可以使用 SQLDeveloper 连接到远程数据库。 我试图从命令行使用 sqlcl 连接到同一个数据库,但出现错误。 这是我正在运行的命令: /bin/sql username/pass@delphix-vdb-n-1.va2.b2c.nike.com:1521/vdbsl14 我也试过: /bin/sql username/pass@//delphix.......etc. 这是我收到的错误: SQLcl: Release 4.2.0.16.131.1023 RC on Wed Jun 15 11:36:33 2016 Copyright (c) 1982, 2016, Oracle. All rights reserved. USER = username URL = jdbc:oracle:thin:@delphix-vdb-n-1.va2.b2c.nike.com:1521/vdbsl14 Error Message = Listener refused the connection with the following error: ORA-12514, TNS:listener does not currently know of service requested in connect descriptor Username? (RETRYING) (
  • Mybatis-config全局配置文件详解
    Mybatis-config全局配置文件详解 dtd约束文件 全局配置文件的约束文件:mybatis-3-config.dtd sql映射文件的约束文件:mybatis-3-mapper.dtd 这两个约束文件存在于mybatis-3.4.1.jar的org.apache.ibatis.builder.xml路径下 1.如何在Eclipse中引入约束文件: ​ (1)将需要引入的dtd文件从mybatis-3.4.1.jar文件中解压出来 ​ (2)window—preferences—XML—XML catalog—Add: ​ Location:从File System中找到解压出来的dtd文件,打开 ​ Key type:URI ​ Key:dtd文件的URL地址(全局配置文件的dtd的URL是http://mybatis.org/dtd/mybatis-3-config.dtd,sql映射文件的URL是http://mybatis.org/dtd/mybatis-3-mapper.dtd) 2.为何要引入dtd文件:编写xml时 Alt+/ 快捷键需要在引入dtd后才会有提示信息 全局配置文件(mybatis-config.xml)的标签 1.properties标签 mybatis可以使用propertis来引入外部properties配置文件的内容 两个属性:
  • Mybatis源码解析之数据源和SQL构建
    文章目录 1、Mybatis官网简介2、Demo搭建2.1、maven依赖2.2、mybatis配置2.3、mapper文件配置2.3、测试类 3、源码解析3.1、初始化阶段3.2、获取数据源3.3、构建SQL语句3.4、解析mybatis-config.xml过程总结 4、常见面试题5、MyBatis数据库连接和SQL执行 1、Mybatis官网简介 MyBatis一款半自动的ORM持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis对JDBC进行了封装,几乎免除了所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML(mapper文件)或注解两种方式操作数据库。 MyBatis的执行流程图大致如下: 2、Demo搭建 Mybatis的Demo可以直接去官网下载,如果不下载的话那么可以根据下面的步骤搭建一个Demo,测试MyBatis 源码。 2.1、maven依赖 在maven项目中的pom文件引入Mybatis依赖,pom依赖项如下所示: <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.1</version> </dependency> 2.2、mybatis配置 新建一个mybatis
  • JDBC:简单的MSSql连接示例不起作用(JDBC: Simple MSSql connection example not working)
    问题 我正在学习Java,只需运行一些简单的操作即可通过JDBC从MSSQL检索一些数据。 我的书中的示例不起作用(但已经有好几年了),下面的MS中的示例对我也不起作用: http://msdn.microsoft.com/zh-CN/library/ms378956(v=sql.90).aspx 这是我的代码: package javasql; import java.sql.*; import java.util.*; public class Program { private static String url = "jdbc:sqlserver://localhost\\SQLExpress;database=Northwind;integratedSecurity=true;"; //private static String userName = "sa"; //private static String password = "myPassword"; /** * @param args the command line arguments */ public static void main(String[] args) { RunDemo(); } public static void RunDemo() { try { Class.forName("com
  • Apache Spark:JDBC连接不起作用(Apache Spark : JDBC connection not working)
    问题 我以前也曾问过这个问题,但没有得到任何答案(无法在pyspark shell中使用jdbc连接到postgres)。 我已经在本地Windows上成功安装了Spark 1.3.0,并运行了示例程序以使用pyspark shell进行测试。 现在,我想对存储在Postgresql中的数据运行来自Mllib的Correlations,但是我无法连接到postgresql。 我已经通过运行在类路径中成功添加了所需的jar(测试了此jar) pyspark --jars "C:\path\to\jar\postgresql-9.2-1002.jdbc3.jar" 我可以看到jar已成功添加到环境UI中。 当我在pyspark shell中运行以下命令时- from pyspark.sql import SQLContext sqlContext = SQLContext(sc) df = sqlContext.load(source="jdbc",url="jdbc:postgresql://[host]/[dbname]", dbtable="[schema.table]") 我收到此错误- >>> df = sqlContext.load(source="jdbc",url="jdbc:postgresql://[host]/[dbname]", dbtable="[schema
  • 带有 JDBC 的 Gluon 示例项目在 iOS 设备上不起作用(Gluon Sample Project with JDBC doesn't work on iOS Device)
    问题 我有 Gluon + JDBC 的简单代码。 我可以在 Android 设备上连接此代码,但不能在 Ipad 上连接。 我的 build.gradle; buildscript { repositories { jcenter() } dependencies { classpath 'org.javafxports:jfxmobile-plugin:1.0.6' } } apply plugin: 'org.javafxports.jfxmobile' repositories { jcenter() } dependencies { compile 'mysql:mysql-connector-java:5.0.2' iosRuntime 'mysql:mysql-connector-java:5.0.2' } mainClassName = 'com.mtt8.version15' jfxmobile { android { manifest = 'src/android/AndroidManifest.xml' packagingOptions { exclude 'META-INF/INDEX.LIST' } ios { infoPList = file('src/ios/Default-Info.plist') forceLinkClasses = ['com
  • mybatis plus sql性能分析插件
    github地址https://github.com/heng1234/mybatis_plus 基于 https://blog.csdn.net/qq_39313596/article/details/100862049 文章 建议性能分析插件只在开发环境和测试环境开启 有性能损耗 在MybatisPlusConfig 加入sql性能分析插件 一、 mybatis-plus自带的性能分析 /** * SQL执行效率插件 性能分析插件 */ @Bean @Profile({"dev","test"})// 设置 dev test 环境开启 public PerformanceInterceptor performanceInterceptor() { PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); performanceInterceptor.setFormat(true);//格式化语句 //performanceInterceptor.setMaxTime(5);//执行时间超过多少秒会抛出异常 return performanceInterceptor; } 执行sql打印 /** * 插入一行user * 执行时间50毫秒 * Time:50 ms - ID:com
  • Mybatis基于代理Dao的CRUD操作
    文章目录 一、回顾mybatis 环境搭建步骤 二、基于代理 Dao 实现 CRUD 操作根据 ID 查询resultType 属性: 保存操作用户更新用户删除用户模糊查询查询使用聚合函数Mybatis 与 JDBC 编程的比较 三、MyBatis的参数深入1.parameterType 配置参数2.传递 pojo 包装对象编写 QueryVo编写持久层接口持久层接口的映射文件测试包装类作为参数 四、 Mybatis 的输出结果封装1.resultType 配置结果类型2.resultMap 结果类型 五、Mybatis传统 DAO 层开发[了解]六、SqlMapConfig.xml配置文件1.配置文件SqlMapConfig.xml 中配置的内容和顺序 2.properties(属性)3.typeAliases(类型别名)4.mappers(映射器) 一、回顾 mybatis 环境搭建步骤 第一步:创建 maven 工程 第二步:导入坐标 第三步:编写必要代码(实体类和持久层接口) 第四步:编写 SqlMapConfig.xml 第五步:编写映射配置文件 第六步:编写测试类 二、基于代理 Dao 实现 CRUD 操作 使用要求: 1、持久层接口和持久层接口的映射配置必须在相同的包下 2、持久层映射配置中 mapper 标签的 namespace
  • jdbc mysql loginTimeout不起作用(jdbc mysql loginTimeout not working)
    问题 有人可以解释一下为什么以下程序在3秒后超时,而我将其设置为在12秒后这样做。 我特意关闭了mysql服务器,以测试无法访问mysql服务器的情况。 import java.sql.Connection; import java.sql.DriverManager; /** * * @author dhd */ public class TestMysql { static Thread trd; public static void main(String[] argv) { keepTrack(); try { DriverManager.setLoginTimeout(12); Class.forName("com.mysql.jdbc.Driver"); Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/driving", "root", ""); } catch (Exception ex) { System.err.println(ex.getMessage()); trd.stop(); } } public static void keepTrack() { trd = new Thread(new Runnable() { @Override public void
  • (8)Mybatis————基于代理DAO 实现CRUD操作和配置详解
    1, 基于代理 Dao 实现 CRUD 操作 1.1,保存操作并获取主键 id1.2,更新操作1.3,删除操作1.4,查询操作1.5,#{} 与 ${} 的区别1.6,Mybatis 与 JDBC 编程的比较 2, Mybatis 的参数深入 2.1,parameterType 配置参数2.2,传递 pojo 包装对象 3,Mybatis 的输出结果封装 3.1,resultType 配置结果类型3.2,resultMap 结果类型 4,Mybatis 传统 DAO 层开发 5,mybatis-config.xml 配置文件 5.1,mybatis-config.xml 中配置的内容和顺序5.2,properties(属性)5.3,typeAliases(类型别名)5.4,mappers (映射器) 基于代理 Dao 实现 CRUD 操作 1,保存操作并获取主键 id 保存单条数据并获取主键 id 在持久层接口中添加新增方法: /** * 保存用户 * @param user * @return 影响数据库记录行数 */ int saveUser(User user); 在用户的映射配置文件中 配置: <update id="saveUser" parameterType="com.zhou.entity.User"> <!-- 配置保存时获取插入的 id -->
  • jdbc总结
    1.jdbc Java DataBase Connectivity(java语言连接数据库) jdbc是sun公司定义的一套接口,本质是一套接口 如果采用文本编辑器方式进行开发,需要配置到环境变量classpath当中 D:\mysql-connector-java-5.1.23\mysql-connector-java-5.1.23\mysql-connector-java-5.1.23-bin.jar 如果classpath本身没有需要新建,同时输入 .;D:\mysql-connector-java-5.1.23\mysql-connector-java-5.1.23\mysql-connector-java-5.1.23-bin.jar 注意:.;必须有 如果采用IDEA进行开发,则其本身有配置方式 2.jdbc编程六步 第一步:注册驱动(告诉java程序,即将要连接的哪个品牌的数据库) 第二步:获取连接(表示jvm的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要关闭) 第三步:获取数据库操作对象(专门执行sql语句的对象) 第四步:执行sql语句(DQL.DML、、、) 第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集) 第六步:释放资源(使用完资源后一定要关闭资源
  • 从 SQL 查询创建 Spark 数据帧(Create Spark Dataframe from SQL Query)
    问题 我确定这是一个简单的 SQLContext 问题,但我在 Spark 文档或 Stackoverflow 中找不到任何答案 我想从 MySQL 上的 SQL 查询创建一个 Spark 数据帧 例如,我有一个复杂的 MySQL 查询,如 SELECT a.X,b.Y,c.Z FROM FOO as a JOIN BAR as b ON ... JOIN ZOT as c ON ... WHERE ... 我想要一个包含 X、Y 和 Z 列的数据框 我想出了如何将整个表加载到 Spark 中,我可以将它们全部加载,然后在那里进行连接和选择。 然而,这是非常低效的。 我只想加载由我的 SQL 查询生成的表。 这是我目前的代码近似值,它不起作用。 Mysql-connector 有一个选项“dbtable”,可用于加载整个表。 我希望有某种方式来指定查询 val df = sqlContext.format("jdbc"). option("url", "jdbc:mysql://localhost:3306/local_content"). option("driver", "com.mysql.jdbc.Driver"). option("useUnicode", "true"). option("continueBatchOnError","true"). option(
  • (四)关于Mybatis别名定义
    代码托管在github上【https://github.com/Damaer/Mybatis-Learning】的mybatis-04 在前面的例子中(三)Mybatis使用工具类读取配置文件以及从属性读取DB信息,我们改进了两点:使用工具类获取sqlSession以及从属性中读取数据库信息,那么我们下面需要改进的是别名,也趁这个机会介绍一下别名的作用。 其实在我们实际开发中,大多数情况下,一个mapper.xml文件对应的是对一个对象的操作,当前的mapper如下:<mapper namespace="mapper1"> <insert id="insertStudent" parameterType="bean.Student"> insert into student(name,age,score) values(#{name},#{age},#{score}) insert>mapper>我们可以看出parameterType有时候会写很长很长,每写一个sql我们就要使用parameterType传值或者使用返回类型,意思就是这个parameterType太长了,有没有什么办法可以让我们就写类名就可以了,其实是有的!!!那就是别名,mybatis可以让我们起一个别名给它,别名定义是在mybatis.xml主配置文件中。注意别名标签应该定义在后面,在前面,顺序不能颠倒
  • Mybatis-XML配置文件的详细属性及配置
    Mybatis-XML配置文件 我们在使用Mybatis框架的时候,一开始就需要先把它的配置文件写好,虽然它的名字可以为任意值,但是官方建议我们使用mybatis-config.xml命名,关于该配置文件中的配置,有如下标签: 属性(properties)设置(settings)类型别名(typeAliases)类型处理器(typeHandlers)对象工厂(objectFactory)插件(plugins)环境配置(environments)数据库厂商识别(databaseIdProvider)映射器(mappers) 以上都是Mybatis配置文件中的相关配置标签,我们在Mybatis的配置文件中使用它们也不能乱用,特别是顺序,我们要按照以上顺序在配置文件中定义自己需要的配置,一般智能IDE都会有提示,使用记事本手撕代码的读者可要多多注意,虽然看起来较为复杂,但是我们实际使用的也不多,下面展示博主认为常用的一些: 属性(properties) 这个标签主要用于从外部引入某些属性的值,我们以前使用原生JDBC的代码连接数据库通常都是将数据库的连接信息用一个properties文件将其存储,让程序来读取配置文件,从而获得其中对应的属性值,这里的properties也可以理解为这个作用。 db.properties: mysql.driver=com.mysql.jdbc
  • 基于 Spring Javaconfig 的按名称自动装配不起作用(Spring Javaconfig based autowire by name not working)
    问题 我正在尝试使用基于 Javaconfig 的 Spring 配置。 我有两个相同类型的 bean,并试图通过 Qualifier 自动装配它们。 但它似乎不起作用。 这是我的配置类 @Configuration @EnableAutoConfiguration @ComponentScan("com.test") public class BasicConfig { @Bean(name = "mysqlSource") @Qualifier("mysqlSource") public DataSource jdbcTemplateMySql() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=UTF-8"); dataSource.setUsername(mysqlUser); dataSource.setPassword(mysqlPass); return dataSource; } @Bean(name =
  • Mybatis的配置文件和映射文件详解
    一、Mybatis的全局配置文件 1、SqlMapConfig.xml是mybatis的全局配置文件,配置内容如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境集合属性对象) --environment(环境子属性对象) ----transactionManager(事务管理) ----dataSource(数据源) mappers(映射器) 2、properties 将数据库连接参数单独配置在db.properties中,放在类路径下。这样只需要在SqlMapConfig.xml中加载db.properties的属性值。这样在SqlMapConfig.xml中就不需要对数据库连接参数硬编码。 将数据库连接参数只配置在db.properties中,原因:方便对参数进行统一管理,其它xml可以引用该db.properties。 使用示例: jdbc.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql:///test jdbc.name=root jdbc.pwd=123456 相应的SqlMapConfig.xml <
  • spring 数据 jpa utf-8 编码不起作用(spring data jpa utf-8 encoding not working)
    问题 我使用spring-data-jpa和mysql数据库。 我的表格字符集是 utf-8。 我还添加了?useUnicode=yes&characterEncoding=utf8到 application.properties 文件中的 mysql url。 当我将诸如“ąčęėį”之类的字符传递给控制器​​以将其保存在mysql中时出现问题。 在 mysql 我得到了??? 分数。 但是当我使用 mysql 控制台示例update projects_data set data="ąęąčę" where id = 1; 每一个都很好。 应用程序属性: # "root" as username and password. spring.datasource.url = jdbc:mysql://localhost:3306/gehive?useUnicode=yes&characterEncoding=utf8 spring.datasource.username = gehive spring.datasource.password = pass spring.datasource.driver-class-name=com.mysql.jdbc.Driver # Keep the connection alive if idle for a long time
  • mybatis-day01笔记
    1.Mybatis简介 1.1原始jdbc操作(查询数据) 1.2原始jdbc操作(插入数据) 1.3 原始jdbc操作的分析 原始jdbc开发存在的问题如下: ①数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能 ②sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变java代码。 ③查询操作时,需要手动将结果集中的数据手动封装到实体中。插入操作时,需要手动将实体的数据设置到sql语句的占位符位置 应对上述问题给出的解决方案: ①使用数据库连接池初始化连接资源 ②将sql语句抽取到xml配置文件中 ③使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射 #内省 BeanUtils.populate(user,map);// 通过反射,给对象属性赋值的操作叫做内省 jdbc jdbcTemplate dbutils hibernate mybatis 1.3) (补)为什么不使用jdbcTemplate 1) sql 语句在代码中硬编码,造成代码不易维护 2) sql 参数封装麻烦 3) 不智能,我们希望有一个框架能自动帮助我们生成sql 语句而不是每次都手写(后续补充讲解,mybatis 提供了工具能够自动生成dao 层的代码) 1.4 什么是Mybatis (ibatis) mybatis