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>
模糊查找方法二:
!– 如果传入的参数是简单数据类型, 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或其它名称。

s q l {}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, p o j o p a r a m e t e r T y p e {}括号中只能是value。

猜你喜欢

转载自blog.csdn.net/qq_42799000/article/details/81414537