一、JDBC编程及问题
1.1 JDBC使用步骤
(1)引入依赖jar包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
(2)编程流程
加载数据库驱动–>获取数据库的连接–>创建statement对象–>执行SQL–>对结果集处理–>关闭资源
public static void main(String[] args) throws SQLException {
//1、加载数据库的驱动 "com.mysql.jdbc.Driver" 在5.XXX版本下驱动全路径
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
/**
* 2、获取数据库的连接
* Connection getConnection(String url,String user, String password)
* url:连接数据库的信息 =>jdbc:子协议(区分不同的数据库;比MySQL)://ip:端口/库名
* =>jdbc:mysql://localhost:3306/test
* user:用户名
* password:密码
*/
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/zzztest","root","");
System.out.println("连接成功啦");
//3、创建Statement对象
Statement statement = connection.createStatement();
//4、执行相关的SQL
String sql = "select * from student";
ResultSet resultSet = statement.executeQuery(sql);
//5、对结果集处理
while (resultSet.next()) {
int sid = resultSet.getInt("SID");
String sname = resultSet.getString("Sname");
int sage = resultSet.getInt("Sage");
String ssex = resultSet.getString("Ssex");
System.out.println(sid+","+sname+","+sage+","+ssex);
}
//6、关闭资源
connection.close();
statement.close();
resultSet.close();
} catch (SQLException e) {
System.out.println("连接失败");
e.printStackTrace();
}
}
1.2 JDBC存在问题及解决方案
(1)数据库连接创建,释放频繁造成了系统资源的浪费从而影响系统性能
解决方案:使用连接池可以来复用数据库连接
(2)SQL语句在java代码中硬编码,造成了代码不易维护,实际使用过程SQL变化可能比较大,SQL变动需要修改java编码
解决方案:将SQL语句放在配置文件中(XML),需求改变就直接修改配置文件
(3)对结果集解析存在硬编码(查询行号),SQL变化导致解析的代码的变化
解决方案:将数据库中的数据映射成java对象
二、Mybatis的介绍及原理
2.1 mybatis介绍
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2.2 mybatis使用demo
以查询zzztest库下的student表为例:通过ID查询学生信息
1、在pom.xml文件中引入依赖
<!--MySQL驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
主要给定mybatis依赖,因为连接数据库,还需要使用数据库驱动
2、全局配置文件(mybatisConfig.xml)。在main目录下创建目录resources:main下新建Directory,命名resources—>设置为Resources root。在resources目录下新建mybatisConfig.xml文件。
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/zzztest"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<!--映射文件-->
<mappers>
<!--resource属性,指定mapper.xml文件的路径-->
<mapper resource="mapper/StudentMapper.xml"/>
</mappers>
</configuration>
3、pojo类:在mybatis目录下新建pojo目录
/**
* 将数据库中student表数据映射为student对象
*/
public class Student {
private Integer SID;
private String Sname;
private String Ssex;
private Integer Sage;
public Integer getSID() {
return SID;
}
public void setSID(Integer SID) {
this.SID = SID;
}
public String getSname() {
return Sname;
}
public void setSname(String sname) {
Sname = sname;
}
public String getSsex() {
return Ssex;
}
public void setSsex(String ssex) {
Ssex = ssex;
}
public Integer getSage() {
return Sage;
}
public void setSage(Integer sage) {
Sage = sage;
}
@Override
public String toString() {
return "Student{" +
"SID=" + SID +
", Sname='" + Sname + '\'' +
", Ssex='" + Ssex + '\'' +
", Sage=" + Sage +
'}';
}
}
4、Mapper接口文件(StudentMapper.java)
public interface StudentMapper {
Student selectStudentById(Integer id);
}
5、配置Mapper.xml文件
在resources目录下新建mapper包,在mapper下创建StudentMapper.xml文件
<?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">
<!--根标签 namespace命名空间:给定接口文件的全路径-->
<mapper namespace="MyBatis.mapper.StudentMapper">
<!--select标签是查询操作标签
id属性:Statement的id,必填的,和接口文件中的方法名保持一致
parameterType:表示输入参数的类型
resultType:表示输出参数的类型
#{XXX}:表示占位符 XXX:接口方法中的参数名称
-->
<select id="selectStudentById" parameterType="int" resultType="MyBatis.pojo.Student">
select * from student where SID =#{id}
</select>
</mapper>
6、修改全局配置文件
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/zzztest"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<!--映射文件-->
<mappers>
<!--resource属性,指定mapper.xml文件的路径-->
<mapper resource="mapper/StudentMapper.xml"/>
</mappers>
</configuration>
7、执行查询操作
public class TestMybatis {
public static void main(String[] args) throws IOException {
//创建SQLSessionFactory对象
//1、读取全局配置文件
String path = "mybatisConfig.xml";
//通过Resources获取配置文件流
InputStream resourceAsStream = Resources.getResourceAsStream(path);
//创建会话工厂,通过SQLSessionFactory来创建
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//创建会话
SqlSession sqlSession = sqlSessionFactory.openSession();
//通过代理模式创建代理类
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
Student student = studentMapper.selectStudentById(4);
System.out.println(student);
}
}
mybatis使用步骤:
1.配置mybatis的全局配置文件(数据源,mapper映射)
2.创建sqlSessionFactory对象
3.通过sqlSessionFactory创建sqlSession对象
4.通过sqlSession来操作数据库
5.关闭SQLsession资源
三、mybatis日志分析
1、日志框架依赖jar
在pom.xml中配置log4j日志依赖
<!--log4j日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
2、日志配置文件
在resources根路径下创建log4j.properties
## debug级别
log4j.rootLogger = DEBUG,Console
log4j.appender.Console = org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target = System.out
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t] [%c] [ %p ] - %m%n
log4j.logger.com.mybatis=DEBUG /
## 输出sql语句
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG