一:原生态jdbc程序中问题总结
原生态jdbc代码:
public class jdbcTest {
public static void main(String[] args){
//数据库的连接
Connection connection=null;
//预编译的Statement
PreparedStatement ps=null;
//结果集
ResultSet rs=null;
try{
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//通过驱动获取数据库连接
connection= DriverManager.getConnection("jsbc:mysql://localhost:3306/mybatis");
//定义sql语句
String sql="select * from user where username=?";
//获取预处理
ps=connection.prepareStatement(sql);
//设置参数,第一个参数为sql语句中参数的序号
ps.setString(1,"xiaowang");
//向数据库发出SQL执行查询,查询出结果集
rs=ps.executeQuery();
//遍历结果集
while(rs.next()){
System.out.println(rs.getString("id")+" "+rs.getString("username"));
}
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}finally {
if(rs!=null){
try{
rs.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(ps!=null){
try{
ps.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
}
问题总结:
1):数据库连接,使用时就创建,不适用就立即释放,对数据库进行频繁连接开启和关闭,造成对数据库资源的浪费,影响数据库的性能
设想:使用数据库连接池管理数据库的连接
2):将SQL语句硬编码到ava代码中,如果sql语句修改,需要重新编译java代码,不利于系统的维护
设想:将sql语句配置在XML文件中
3):向preparedStatement中设置参数,对占位符位置和设置参数值,硬编码在java代码中
设想:将sql语句及占位符和参数值配置在xml中
4):在rs结果集中遍历时存在硬编码
设想:将查询的结果集,自动的映射成java对象
二:mybatis是什么
mybatis是一个持久层框架,是Apache下的顶级项目
mybatis让程序将主要的精力放在SQL上,通过mybatis提供的映射方式,自由灵活生成满足要求的SQL语句
三:mybatis框架
1):SqlMapConfig.xml(是mybatis的全局配置文件,配置了数据源,事务等mybatis运行环境)
2):SqlSessionFactory(会话工厂):创建SQLSession
3):SqlSession(会话):操作数据库
4):executor(执行器):sqlSession内部是通过执行器来操作数据库
5):mapped Statement(底层封装对象):对操作数据库存储封装,包括sql语句,输入,输出对象等
流程为:1)->2)->3)->4)->5)->数据库
四:环境准备
1):创建java程序
2):加入jar包
mybatis-3.4.6jar 和mysql-connector-java-5.1.46.jar
3):log4j.properties
#Global logging configuration
log4j.rootLogger=DEBUG,stdout
#Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] -%m%n
4):配置sqlMapConfig.xml(名字可以任意命名)文件
<configuration>
<!--和spring整合后environment配置将废除-->
<environments default="development">
<environment id="development">
<!--使用jdbc事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!--数据库连接池,由mybatis管理-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc://mysql:///mybatis"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</dataSource>
</environment>
</environments>
</configuration>
5):编写sql语句
<!--namespace命名空间,作用是对sql进行分类化管理-->
<mapper namespace="test">
<!--在映射文件中配置很多sql语句-->
<!--通过select执行数据库查询
id:表示映射文件中的SQL,称为statement的id,将sql语句封装到mappedStatement对象中-->
<select id="findUserById" parameterType="int" resultType="main.test.User">
SELECT * from user where id=#{id}
</select>
</mapper>
6):在SqlMapConfig.xml文件中加载xml文件
<!--加载映射文件-->
<mappers>
<mapper resource="User.xml"/>
</mappers>
7):编写测试类
//根据id查询用户信息,得到一条查询语句
@Test
public void findUserById() throws IOException{
//mybatis配置文件
String resource= "src/main/config/SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SQLSession
SqlSession sqlSession=sqlSessionFactory.openSession();
//通过SQLSession操作数据库
User user=sqlSession.selectOne("test.findUserById",1);
System.out.println(user.getUsername());
//释放资源
sqlSession.close();
}
}