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依赖-->
<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>
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文件下可以使用哪些标签
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
<?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>数据库名称写错
2>驱动名称写错