一、数据库中创建表指定引擎并指定字符集
-- 指定存储引擎和字符集 --
create table `test`.`users`(
id int primary key,
name varchar(40),
password varchar(40),
email varchar(60),
birthday date
)engine=InnoDB default CHARSET = utf8;
我尝试过,在这个5.7的版本如果不指定字符集的话,insert进去中文会提示报错信息,所以为了以后的工作还是先记下来。
二、Java连接数据库语句
// 在此处设置连接字符集,如果不设置连接字符集,那么连接的时候会出现,使用预编译的查询但是传递参数后得不到想要的结果。
String url = "jdbc:mysql://localhost:3306/test?useSSL=true&useUnicode=true&characterEncoding=UTF-8";
String username = "lxj";
String password = "123456";
/*
* 1、加载驱动
* 2、获取连接
* 3、获取statement对象
* 4、向数据库发送sql语句
* 5、从结果集中获取数据
*/
Connection conn = null;
java.sql.PreparedStatement ps = null;
ResultSet rs = null;
String sql =null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, username, password);
// 或者(不推荐)
// DriverManager.registerDriver(new com.mysql.jdbc.Driver());
ps = conn.prepareStatement("select * from users where name = ?");
ps.setString(1, "李二");
rs = ps.executeQuery();
while(rs.next()) {
System.out.println("id="+rs.getObject("id"));
System.out.println("name="+rs.getObject("name"));
System.out.println("password="+rs.getObject("password"));
System.out.println("email="+rs.getObjectuseUnicode=true&characterEncoding=UTF-8("email"));
System.out.println("birthday="+rs.getObject("birthday"));
}
rs.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在这里值得注意的有两点,一个是SSL连接设置为true,不设置的话mysql会提醒,第二个,在连接属性中设置字符集,我做过测试,加入不设置,我用预编译的方式写sql,设置了参数后,却得不到正确的结果。
三、常用类方法说明
Connection类
代表连接的类,与数据库进行交互就靠这类了,可以获取statement类。设置commit属性
- createStatement():创建向数据库发送sql的statement对象。
- prepareStatement(sql):创建向数据库发送预编译sql的PrepareSatement对象。
- prepareCall(sql):创建执行存储过程的callableStatement对象。
- setAutoCommit(boolean autoCommit):设置事务是否自动提交。
- commit():在链接上提交事务。
- rollback():在此链接上回滚事务。
Statement类
sql语句相关的类,分为statement和preparestatement两种,后者采用预编译的方式处理sql,可动态的填写参数
- setXxx(index,val);设置参数,从1开始
- executeQuery(String sql):用于向数据库发送查询语句。
- executeUpdate(String sql):用于向数据库发送insert、update或delete语句。
- execute(String sql):用于向数据库发送任意sql语句。
- addBatch(String sql):把多条sql语句放到一个批处理中。
- executeBatch():向数据库发送一批sql语句执行。
ResultSet类
ResultSet对象维护了一个指向表格数据行的 游标,初始的时候,游标在第一行之前,调用ResultSet.next()方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。- 获取任意类型的数据
- getObject(int index)
- getObject(string columnName)
- 获取指定类型的数据,例如:
- getString(int index)
- getString(String columnName)
总结,看来字符集的坑处处都有啊!!