JDBC执行数据库操作的步骤

JDBC连接数据库的七个步骤:

1、加载驱动:

成功加载后,会将Driver类的实例注册到DriverManager类中

Class.forName("com.mysql.jdbc.Driver") ;

2、创建数据库连接:

要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。

使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。

//test指的是数据库的名称
String url = "jdbc:mysql://localhost:3306/test" ;  
//用户名
String username = "root" ;   
//密码
String password = "123456" ;   
try{   
	Connection con = DriverManager.getConnection(url , username , password ) ;   
}catch(SQLException e){   
	System.out.println("数据库连接失败!");   
	e.printStackTrace() ;   
}

3、编写sql语句:

String sql = "select * from dept where id=? and name=?";

4、获得执行者对象:

try {
    PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement(sql);
    pstmt.setString(1,id);
    pstmt.setString(2,name);
} catch (SQLException e) {
    e.printStackTrace();
}

5、执行sql语句:

//执行查询数据库的SQL语句,返回一个结果集
ResultSet rs = pstmt.executeQuery();
//用于执行INSERT、UPDATE或 DELETE语句以及SQL DDL语句
int i = pstmt.executeUpdate();

6、处理结果:

两种情况:
1>执行更新返回的是本次操作影响到的记录数。
2>执行查询返回的结果是一个ResultSet对象。

while(rs.next()){
    String name = rs.getString("name") ;
    String pass = rs.getString(1) ; // 此方法比较高效
}

7、处理异常,关闭JDBC对象资源:

操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声 明顺序相反:
1>先关闭requestSet
2>再关闭preparedStatement
3>最后关闭连接对象connection

JDBC的问题:

1、每次连接都要加载驱动

2、步骤重复

3、处理结果集Rs,字段多的情况下很麻烦

4、sql语句和Java代码混合在一起,可读写差,维护不便

Mybatis:

1、什么是mybatis

MyBatis最早源自Apache基金会的一个开源项目iBatis,2010年这个项目由Apache software foundation 迁移到了google code ,并且改名为MyBatis;

MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架;

MyBatis封装了几乎所有的JDBC代码和参数的手工设置以及结果集的检索;MyBatis使用简单的做配置和定义映射关系,将Java的POJOs ( Plain Old Java Objects )映射成数据库中的记录。

2、MyBatis与JDBC比较

减少了62%的代码量
最简单的持久化框架
架构级性能增强
SQL代码从程序代码中彻底分离,可重用
增强了项目中的分工
增强了移植性

3、到maven仓库中查找mybatis依赖

mybatis连接数据库mysql_sql

mybatis连接数据库mysql_mysql_02

<!--mybatis依赖-->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.4.6</version>
</dependency>

<!--mysql-jdbc依赖-->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.48</version>
</dependency>

4、配置连接池

xml文件示例:

<books>
	<book id="100">
        <name>java</name>
        <price>30</price>
        <autho>张三</autho>
    </book>
    
    <book id="101">
        <name>c</name>
        <price>26</price>
        <autho>张三</autho>
    </book>
    
    <book id="102">
        <name>python</name>
        <price>32</price>
        <autho>张三</autho>
    </book>
    
</books>

mybatis连接数据库mysql_数据库_03

1>在resources目录下创建mybatis-config.xml
2>复制官网的web.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">

//头部:定义了这个xml文件下可以使用哪些标签

mybatis连接数据库mysql_数据库_04

3>配置环境
<?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="enviroment01"><!--默认的环境-->
        <environment id="enviroment01"><!--环境:可以配置多个-->
            <transactionManager type="JDBC"></transactionManager><!--事务管理:JDBC-->
            <dataSource type="POOLED"><!--连接池-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/train12306-2?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>
4>获得MyBatis连接

在使用MyBatis框架时,主要涉及以下几个API

1)SqlSessionFactoryBuilder
该对象负责根据MyBatis配置文件SqlMapConfig.xml构建SqlSessionFactory 实例。

2)SqlSessionFactory
每一个MyBatis的应用程序都以一个SqlSessionFactory对象为核心。该对象负责创建SqlSession对象实例

3)SqlSession
该对象包含了所有执行SQL操作的方法,用于执行已映射的SQL语句

package com.cykj;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/**
 * mybatis管理连接的类
 */
public class MybatisDbHelper {
    //得到连接
    public static SqlSession getSession(){
        SqlSession sqlSession = null;

        try {
            //1、创建一个连接工厂构建器
            SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
            //2、拿到工厂实例
            String fpath = "mybatis-config.xml";
//            SqlSessionFactory sf = sfb.build(new FileInputStream(new File(fpath)));
            SqlSessionFactory sf = sfb.build(Resources.getResourceAsStream(fpath));
            //3、通过工厂实例获得一个连接
            sqlSession = sf.openSession();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sqlSession;
    }

    public static void main(String[] args) {
        System.out.println(getSession());
    }
}

//关闭连接的方法
    public static void closeSession(SqlSession sqlSession){
        try {
            if(null!=sqlSession){
                sqlSession.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
5>增删改查
1>创建实体类
2>dao包下创建接口和实现类
//增加用户
    public boolean addForeUser(Foreuser foreuser);
    //删除用户
    public boolean delForeUser(long fuId);
    //修改用户密码
    public boolean updateForeUser(long fuId,String fuPwd);
    //查询所有用户列表
    public List<Foreuser> selectAllForeUser();

    //根据用户名模糊查找,带分页
    public List<Foreuser> selectForeUserByName(String fuName,int pageNo);
package com.cykj.dao;

import com.cykj.bean.Foreuser;
import com.cykj.dao.ForeUserDao;
import com.cykj.tools.MybatisDbHelper;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ForeUserDaoImpl implements ForeUserDao {
    @Override
    public boolean addForeUser(Foreuser foreuser) {
        boolean flag = false;
        try {
            //得到连接
            SqlSession sqlSession = MybatisDbHelper.getSession();
            //执行sql
            int i = sqlSession.insert("addForeUser",foreuser);
            //提交
            sqlSession.commit();
            if(i>0){
                flag = true;
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return flag;
    }

    @Override
    public boolean delForeUser(long fuId) {
        boolean flag = false;
        try {
            //得到连接
            SqlSession sqlSession = MybatisDbHelper.getSession();
            //执行sql
            int i = sqlSession.delete("delForeUser",fuId);
            //提交
            sqlSession.commit();
            if(i>0){
                flag = true;
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return flag;
    }

    @Override
    public boolean updateForeUser(long fuId, String fuPwd) {
        boolean flag = false;
        try {
            //得到连接
            SqlSession sqlSession = MybatisDbHelper.getSession();
            //执行sql
            Map map = new HashMap();
            map.put("fuId",fuId);
            map.put("fuPwd",fuPwd);

            int i = sqlSession.update("updateForeUser",map);
            //提交
            sqlSession.commit();
            if(i>0){
                flag = true;
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return flag;
    }

    @Override
    public List<Foreuser> selectAllForeUser() {
        List<Foreuser> foreUserList = null;
        try {
            //得到连接
            SqlSession sqlSession = MybatisDbHelper.getSession();
            //执行sql
            foreUserList = sqlSession.selectList("selectAllForeUser");
        }catch(Exception e){
            e.printStackTrace();
        }
        return foreUserList;
    }

    @Override
    public List<Foreuser> selectForeUserByName(String fuName, int pageNo) {
        List<Foreuser> foreUserList = null;
        try {
            //得到连接
            SqlSession sqlSession = MybatisDbHelper.getSession();
            RowBounds rb = new RowBounds(pageNo,5);
            //执行sql
            foreUserList = sqlSession.selectList("selectForeUserByName",fuName,rb);
        }catch(Exception e){
            e.printStackTrace();
        }
        return foreUserList;
    }
}
3>编写sql语句-----对应的mapper.xml

mybatis连接数据库mysql_数据库_05

mybatis连接数据库mysql_数据库_06

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="aa">
    <insert id="addForeUser" parameterType="com.cykj.bean.Foreuser">
        insert into foreUser (fuName,fuPwd,realName,cardType,cardNo,email,phone,travelType)
            values(#{fuName},#{fuPwd},#{realName},#{cardType},#{cardNo},#{email},#{phone},#{travelType});
    </insert>
    
    <delete id="delForeUser" parameterType="java.lang.Long">
        delete from foreUser where fuId = #{fuId}
    </delete>

    <update id="updateForeUser" parameterType="java.util.Map">
        update foreUser set fuPwd=#{fuPwd} where fuId=#{fuId}
    </update>

    <select id="selectAllForeUser" resultType="com.cykj.bean.Foreuser">
        select * from foreUser
    </select>

    <select id="selectForeUserByName" resultType="com.cykj.bean.Foreuser" parameterType="java.lang.String">
        select * from foreUser where fuName like concat("%",#{fuName},"%")
    </select>
</mapper>

4>mybatis-config.xml中引用xml:加载sql

<mappers>
        <mapper resource="mapper/ForeUserMapper.xml"></mapper>
    </mappers>

5、单元测试

1>依赖:

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

2、创建一个文件夹,标记为test

3、在测试目录下新建一个Java类(注意:类名不能为Test)

4、创建测试方法:public,void,方法前面要加上注解@Test

ForeUserDao foreUserDao = new ForeUserDaoImpl();

    @Test
    public void addForeUser(){
        Foreuser foreuser = new Foreuser();
        foreuser.setFuName("cykj001");
        foreuser.setRealName("张三");
        foreuser.setCardType(1);
        foreuser.setCardNo("3522666666");
        foreuser.setEmail("110@qq.com");
        foreuser.setPhone("152....");
        foreuser.setTravelType(1);
        boolean f = foreUserDao.addForeUser(foreuser);
        System.out.println(f);
    }

    @Test
    public void delForeUser(){
        boolean f =  foreUserDao.delForeUser(3);
        System.out.println(f);
    }

    @Test
    public void updateForeUser(){
        boolean f = foreUserDao.updateForeUser(1,"666666");
        System.out.println(f);
    }

    @Test
    public void selectForeUserByName(){
        List<Foreuser> list = foreUserDao.selectForeUserByName("cykj",0);
        for(Foreuser foreUser:list){
            System.out.println(foreUser);
        }
    }

    @Test
    public void selectAllForeUser(){
        List<Foreuser> list = foreUserDao.selectAllForeUser();
        for(Foreuser foreUser:list){
            System.out.println(foreUser);
        }
    }

6、常见错误

1>数据库名称写错

mybatis连接数据库mysql_mysql_07

2>驱动名称写错