发表于: 2017-04-12 21:28:10
3 1430
今天完成的任务:
springMVC架构的理解,这几天一直在边做project边理解,对文件结构和内在逻辑有了较为清晰的认识,虽然离真正的内涵很远,至少目前的任务阶段应该是够用了.
1:JDBC
还是从最简单的JDBC开始,在只有Java,mysql的情况下,完成对mysql中数据的增删改查处理,jdbc就是基础的工具,其实它本质还是几个集合了相关类的jar包,主要部分当然是在Java.sql.*中,包括常用的四个类,
java.sql.Connection;
java.sql.DriverManager;
java.sql.SQLException;
java.sql.Statement;
一般完成最简单的增删改查,都要引入这四个类才能帮助我们完成具体业务中执行程序的编写.逻辑很简单,建立联系,开始session,加载驱动,异常处理,sql语句推送.有了它,才能和mysql建立通道,方便数据的出入.以下是实例:
项目结构:
package com.ptteng.dreamguy.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
public class JdbcTest
{
private final static String URL="jdbc:mysql://localhost:3306/student";
public final static String USERNAME="root";
public final static String PASSWORD="woxxxxxxxx";
public final static String DRIVER="com.mysql.jdbc.Driver";
public static void main(String[] args)
{
insert();
insert1();
update();
delete();
}
@Test
public static void insert()
{
try
{
Class.forName(DRIVER);
Connection connection=DriverManager.getConnection(URL,USERNAME,PASSWORD);
String sql="insert into student(name,age) values('韩小明',25)";
Statement state=connection.createStatement();
state.executeUpdate(sql);
state.close();
connection.close();
System.out.println("insert success");
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
@Test
public static void insert1()
{
String name="胡清";
int age=27;
try
{
Class.forName(DRIVER);
Connection connection=DriverManager.getConnection(URL,USERNAME,PASSWORD);
String sql="insert into student(name,age) values('"+name+"',"+age+")";
Statement state=connection.createStatement();
state.executeUpdate(sql);
state.close();
connection.close();
System.out.println("success.");
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
@Test
public static void update()
{
try
{
Class.forName(DRIVER);
Connection connection=DriverManager.getConnection(URL,USERNAME,PASSWORD);
String sql="update student set age=15 where id=1";
Statement state=connection.createStatement();
state.close();
connection.close();
System.out.println("update success");
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
catch(SQLException e)
{
e.printStackTrace();
}
}
@Test
public static void delete()
{
try
{
Class.forName(DRIVER);
Connection connection=DriverManager.getConnection(URL,USERNAME,PASSWORD);
String sql="delete from student where id=11";
Statement state=connection.createStatement();
state.executeUpdate(sql);
state.close();
System.out.println("delete success");
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
2:MyBatis
实际的使用中,JDBC是被封装起来的,因为即使是小型网站的应用,存取数据也是相对频繁的,每次增删改查都直接用JDBC开启关闭与数据库之间的连接,系统开销很大,成本高昂,效率低下,数据库和Java之间的频繁连接过程需要专门分出来处理,因为它是一个通道,好比公路,只要维护好这条路的通畅就行了,至于路上运行什么货物(数据),运到哪里去,并不需要实现业务逻辑的程序员关心.而这里的mybatis就是实现封装的工具中的一种,具体的原理涉及到ORM(Object Relational Mapping),或者可以叫O/R Mapping,其实后一种写法更能看明白这个概念的内涵,O是指编程里的面向对象,Java里一切都是对象,是基本的操作元素,而mysql里最基本的是表,而表内部,表之间都是通过各种关系串起来,形成复杂的数据库结构.那现在我要把数据元素从mysql里提出来,或者Java把数据元素送进去,他们组织的方式不同,建立他们之间的映射关系就顺理成章了.Java里操作对象的value通过ORM送进mysql就变成了各种复杂关系表中字段的value.说起来很抽象,看看我的实例吧.
首先是项目结构:
可以看到相关的package进行了分类,第一个package中有一个实体类Student(对应mysql中的student表),里面包括了具体的操作元素,以及元素的数据类型,set方法,get方法,可以直接用来获取元素的value,或者设置value,如果描述的业务复杂,可以编写多个实体类,对应多个数据表,甚至各自之间也可以联系,是一到三,三到万的过程而已; 第二个package是一个映射关系表,表示里面的sql语句是对实体类中各元素的操作,建立了Java元素和mysql表中字段的联系,想深一步,name是Java实体类Student中成员变量name和mysql表格student中字段name的相对应,如果student中的name改成汉字的"名字",就会出现错误.而连接两边的桥梁就是这张StudentMapper.xml表.
示例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">
<mapper namespace="com.ptteng.mapping.StudentMapper">
<select id="getStudent" parameterType="int"
resultType="com.ptteng.domain.Student">
select * from student where id=#{id}
</select>
<insert id="addStudent" parameterType="com.ptteng.domain.Student">
insert into student(name,age) values(#{name},#{age})
</insert>
<delete id="deleteStudent" parameterType="int">
delete from student where id=#{id}
</delete>
<update id="updateStudent" parameterType="com.ptteng.domain.Student">
update student set name=#{name},age=#{age} where id=#{id}
</update>
<select id="getAllStudent" resultType="com.ptteng.domain.Student">
select * from student
</select>
<select id="getStudentIdByName" resultType="com.ptteng.domain.Student">
select id from student where name=#{name}
</select>
</mapper>
第三个package里面就是开关数据库的工具类了,可以看前面JDBC中每一次增删改查都要写代码来执行数据库连接过程的被封装成单独的一个类,其他类需要连接数据库存取的时候,只需要调用它就行了.它就是一把钥匙,我们不用像JDBC里一样关注开启数据库的每一步,关心钥匙开锁的原理是什么,只在需要开启的时候调用钥匙打开数据库就行了.
package com.ptteng.util;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
// 调用会话工厂开始组建一个会话
public static SqlSessionFactory getSqlSessionFactory() {
String resource = "config.xml";
InputStream is = MyBatisUtil.class.getClassLoader().getResourceAsStream(resource);
// 将驱动,连接,用户名,密码等资源信息输送给会话工厂组建一个会话实例,资源在config.xml中.
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
return factory;
}
// 获得一个连接
public static SqlSession getSqlSession() {
return getSqlSessionFactory().openSession();
}
public static SqlSession getSqlSession(boolean isAutoCommit) {
return getSqlSessionFactory().openSession(isAutoCommit);
}
}
未完待续^^^^^^
明天的计划:
null
遇到的问题:
null
收获:
null
评论