JDBC链接数据库实例与mybatis链接数据库实例。比较!

JDBC链接数据库实例

1,加载数据库驱动
2,创建并获取数据库链接
3,创建jdbc statement对象
4,设置sql语句
5,设置sql语句中的参数(用用preparedStatement)
6,通过statemnet执行sql并获取结果
7,对sql执行结果进行解析处理
8,释放资源(resultSet,preparedStatement,connection)

public static void main(String[] args){
Connection connectio=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;

try{
加载驱动类
Class.forName(“com.mysql.jdbc.Driver”);
通过驱动管理类获取数据库链接
connection=DriverManager.getConnection(“jdbc:mysql://localhost::3306/mybatis?characterEncoding=utf-8”,”root”,”root”);
定义sql语句 ,?表示占位符
String sql=”select *form user where username=?”;
获取预处理statement
preparedStatement=connection.prepareStatement(sql);
设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值。
preparedStatement.setString(1,”miss”);
向数据库发出sql执行查询,查询出结果集
resultSet=preparedStatement.executeQuery();
遍历查询结果集
while(resultSet.next()){
System.out.println(resultSet.getString(“id”)+” “+resultSet.getString(“username”));
}
}catch(Exception e){
e.printStackTrace();
}finally{
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

JDBC链接数据库问题如下:

1,如果需要调用的sql语句较多,则会频繁的船舰和释放数据库链接,造成系统资源浪费,从而影响系统的性能。如果使用数据库连接池可解决此问题。
2,Sql语句在代码中硬编码,造成代码不易维护,实际应用中sql变化的可能比较大,sqk变动需要改变java源代码。
3,使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还需要修改代码,系统不易维护。
4,对结果集鸡西存在硬编码,sql变化导致解析代码变化,系统不惜以维护。

mybatis

1,mybatis配置
SqlMapConfig.xml:此文件作为mybatis的全局配置文件,配置了mybatis的运行的环境等信息。
mapper.xml:是sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2,通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂。
3,由会话工厂创建sqlSession即会话,操作数据库需要sqlSession进行。
4,mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器,一个是缓存执行器。
5,Mapped Statement 也是mybatis一个底层封装对象,他包装了mybatis配置信息和sql映射信息等。mapper.xml文件中一个sql对应一个MapperdStatement对象,sql的id即是MappedStatement的id。
6,MappedStatement对sql执行输出结果进行定义,包括HashMap,基本类型,pojo,Executor通过MappedStatement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7,MappedStatement对sql执行输出结果进行定义,包括HasMap,基本类型,pojo,Executor通过MappedStatement在执行sql后将输出结果映射至java对象中,输出结果映射过程想到与jdbc编程中对结果的解析处理过程。

创建SqlMapConfig.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>
!– 和spring整合后 environments配置将废除 –>
environments default=”development”>
environment id=”development”>
使用jdbc事务管理
transactionManager type=”JDBC”/>
数据库连接池
dataSource type=”POOLED”>
property name=”driver” value=”com.mysql.jsbc.Driver”/>
property name=”url” value=”jdbc:mysql://Localhost:3306/mybatis?characterEncodinutf-8”/>
property name=”username” value=”root”/>
property name=”password” value=”root”/>
/dataSource>
/environment>
/environments>
/configuration>

创建pojo

Public class User {
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址

get/set……

sql映射文件

?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:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 –>
mapper namespace=”test”>
id:statement的id或者是sql的id
parameterType:声明输出结果的类型,
result Type声明输出结果的类型,应该填写pojo的全路径
#{}:输入参数的占位符,相当于jdbc的?
select id=”queryUserById” parameterType=”int” resultType=”mybatis.pojo.User”>
select * from user where id= #{}
/select>
模糊查找方法一:
!– 如果返回多个结果,mybatis会自动把返回的结果放在list容器中 –>
!– resultType的配置和返回一个结果的配置一样 –>
select id=”queryUserByUsername1” parameterType=”string”
resultType=”cn.itcast.mybatis.pojo.User”>
SELECT * FROM user WHERE username LIKE #{username}
/select>
模糊查找方法二:
!– 如果传入的参数是简单数据类型, valuesql 里 面 必 须 写 v a l u e , 单 引 号 是 因 为 s q l 语 句 中 除 了 数 之 外 的 值 都 需 要 用 , 百 分 号 是 转 义 字 符 , 因 为 {}并不是字符而是有意义的表达式! –>
select id=”queryUserByUsername2” parameterType=”string”
resultType=”cn.itcast.mybatis.pojo.User”>
SELECT * FROM user WHERE username LIKE ‘%${value}%’
/select>
insert id=”insertUserByAge” parameterType=”userDao.User” >
!–
select LAST_INSERT_AGE()
/selectKey> –>
insert into user(name,sex) values(#{name},#{sex})
/insert>
update id=”updateUserByAge” parameterType=”userDao.User” >
update user
set name=#{name}, age=#{age},sex=#{sex}
where age=#{age}
/update>
delete id=”deleteUserByAge” parameterType=”int” >
delete from user
where age=#{age}
/delete>
/mapper>

加载映射文件

mybatis框架需要加载Mapper.xml映射文件
将users.xml添加在SqlMapConfig.xml
这里写图片描述

创建测试类

1,创建SqlSessionFactoryBulider对象
2,加载SqlMapConfig.xml配置文件
3,创建SqlSessionFactory对象
4,创建SqlSession对象
5,执行SqlSession对象查询,获取User
6,打印结果
7,释放资源
public class MybatisTest{
private SqlSessionFactory sqlSessionFactory=null;
public void init() throws Exception{
创建SqlSessionFactoryBulider对象
SqlSessionFactoryBulider sqlSessionFactoryBulider=new SqlSessionFactoryBuilder();
加载SqlMapConfig.xml配置文件
InputStream inputStream=Resources.getResourceAsStream();
加载SqlSessionFactory对象
this.sqlSessionFactory=sqlSessionFactoryBulider.bulid(inputStream);
@Test
public void testQueryUserById() throws Exception {
// 4. 创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();

    // 5. 执行SqlSession对象执行查询,获取结果User
    // 第一个参数是User.xml的statement的id,第二个参数是执行sql需要的参数;
    Object user = sqlSession.selectOne("queryUserById", 1);

    // 6. 打印结果
    System.out.println(user);

    // 7. 释放资源
    sqlSession.close();
}
模糊查找测试一:
@Test
public void testQueryUserByUsername1() throws Exception {
    // 4. 创建SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();

    // 5. 执行SqlSession对象执行查询,获取结果User
    // 查询多条数据使用selectList方法
    List<Object> list = sqlSession.selectList("queryUserByUsername1", "%王%");

    // 6. 打印结果
    for (Object user : list) {
        System.out.println(user);
    }

    // 7. 释放资源
    sqlSession.close();
}
模糊查找测试二:
@Test

public void testQueryUserByUsername2() throws Exception {
// 4. 创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();

// 5. 执行SqlSession对象执行查询,获取结果User
// 查询多条数据使用selectList方法
List<Object> list = sqlSession.selectList("queryUserByUsername2", "王");

// 6. 打印结果
for (Object user : list) {
    System.out.println(user);
}

// 7. 释放资源
sqlSession.close();

}

}

mapper动态开发

就是在mybatis开发的基础上进行改进,取消了实现类,用接口类来代替,从而减少了代码的重复率,提高开发效率和资源利用率。
mapper动态开发有四个准则:
1,接口类的方法名要和mapper.xml中的sql语句的id名相同
2,接口类的方法的返回值要和mapper.xml中的返回值类型一致
3,接口类的方法的参数要和mapper.xml中的参数类型一致
4,在mapper.xml中的namespace的值要和接口类的全路径相同,绑定在一起。

小结

#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

sql 表 示 拼 接 s q l 串 , 通 过 {}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, pojoparameterType 可 以 接 收 简 单 类 型 值 或 p o j o 属 性 值 , 如 果 p a r a m e t e r T y p e 传 输 单 个 简 单 类 型 值 , {}括号中只能是value。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值