1.jdbc编程实现数据库操作
package com.iot.mybatis.jdbc;
//import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcTest {
public static void main(String[] args) {
//数据库连接
Connection connection = null;
//预编译的Statement,使用预编译的Statement提高数据库性能
PreparedStatement preparedStatement = null;
//结果集
ResultSet resultSet = null;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//通过驱动管理类获取数据库链接
connection = DriverManager.getConnection("jdbc:mysql://120.25.162.238:3306/mybatis001?characterEncoding=utf-8", "root", "123");
//定义sql语句 ?表示占位符
String sql = "select * from user where username = ?";
//获取预处理statement
preparedStatement = connection.prepareStatement(sql);
//设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "王五");
//向数据库发出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();
}
}
}
}
}
上面的代码存在的问题:
(1).数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。
设想:使用数据库连接池管理数据库连接。
(2).将sql语句硬编码到java代码中,如果sql语句修改,需要重新编译java代码,不利于系统维护。
设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。
(3).向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
设想:将sql语句及占位符号和参数全部配置在xml中。
(4).从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。
设想:将查询的结果集,自动映射成java对象。
2.mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。
mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
mybatis框架原理图:
3.入门程序示例
(1)创建SqlMapConfig.xml全局配置文件
(2)映射文件User.xml(原始的ibatis命名方式),在映射文件中配置sql语句
parameterType:在映射文件中通过parameterType指定输入参数的类型
resultType:在映射文件中通过resultType指定输出结果的类型
#{}和${}
#{} 表示一个占位符号
${}表示一个拼接符号,会引起sql注入,所以不建议使用
selectOne和selectList
selectOne表示查询一条记录进行映射,使用selectList也可以使用,只不过只有一个对象
selectList表示查询出一个列表(参数记录)进行映射,不嗯能够使用selectOne查,不然会报下面的错:
(3)在SqlMapConfig.xml中加载User.xml映射文件
(4)加载配置文件,根据会话工厂SqlSessionFactory 创建会话SqlSession对象,通过SqlSession操作数据库
详见,以下大佬博客内容,
https://blog.csdn.net/h3243212/article/details/51016271
4.使用mapper代理方法开发
1.编写mapper.xml和mapper.java接口文件
2.在mapper.xml种namespace等于mapper接口的地址
3.mapper.java接口种的方法和mapper.xml种id一致
4.mapper.java接口中的方法输入参数类型和mapper.xml中的statement的parameterType指定的类型一致。
5.mapper.java接口中的返回值和mapper.xml中的statement的resultType指定的类型一致。
以上开发规范主要是对以下代码的统一生成:
User user = sqlSession.selectOne(“test.findUserById”,id) ;
sqlSession.insert(“test.insertUser”,user) ;
…
5.在spring-mybatis.xml中加载mapper.xml文件
1.加载单个映射文件
< mapper resource=”“>
2.通过mapper接口加载
< mapper class=”mapper.xml的路径”>
3.批量加载多个
< package name=”包名”>
6.输入映射
1.简单类型
2.复杂类型
类
包装类(用于连接查询,不同的类组成一个包装类)
7.输出映射
1.resultType
使用resultType进行输出映射,只有查询出来的列明和pojo中的属性名一致,该列才可以映射成功。
不管是输出pojo单个对象还是一个列表,在mapper.xml中mapper.xml中resultType指定的类型是一样的。只在mapper.java中指定的返回值类型不一样。如果是单个对象,返回值是对象类型,如果是对象列表,返回值是List
2.resultMap
如果查询出来的列明和pojo属性名不一样,通过顶i有一个resultMap对列明和pojo属性名之间做一个映射。
1.定义resultMap
type:最终映射的对象类型
id:对resultMap的唯一标识
column:查询出来的列明
property:type指定的pojo类型中的属性名
<resultMap id="UserInfoMap" type="org.javaex.blog.view.UserInfo">
<result column="id" property="id" />
<result column="login_name" property="loginName" />
<result column="pass_word" property="passWord" />
resultMap>
//....
<select id="checkUser" resultMap="UserInfoMap">
8.Spring整合Mybatis
(1)整合思路
需要spring通过单例方式管理SqlSessionFactory。
spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSession。(spring和mybatis整合自动完成)
持久层的mapper都需要由spring进行管理。
1.配置sqlSessionFactory——spring.xml
1.1 配置数据数据库连接参数及连接池
<util:properties id="config" location="classpath:db.properties">util:properties>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="#{config.driver}" />
<property name="url" value="#{config.url}" />
<property name="username" value="#{config.username}" />
<property name="password" value="#{config.password}" />
bean>
1.2 配置sqlSessionFactory
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource">property>
<property name="mapperLocations" value="classpath:cn/javaex/blog/dao/*.xml">property>
bean>
2.mapper代理开发
2.1 mapper.java和mapper.xml(mapper.java接口不需要实现类)
2.2 在spring.xml中通过MapperFactoryBean创建代理对象
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
//mapperInterface指定mapper接口
<property name="mapperInterface" value="com.iot.ssm.mapper.UserMapper"/>
//ref就是上面配置的sqlSessionFactory
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
bean>
2.2 最终版
因为上面只能一次配置一个mapper,因此最终版应该如下:在spring.xml中通过MapperScannerConfigurer进行mapper扫描(建议使用)
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.iot.ssm.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
bean>
3.在spring-mybatis中加载mapper.xml(上面三种方法)