mybatis:
Mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的orm框架,而mybatis是一个不完全的orm框架。
Mybatis让程序员只关注sql本身,而不需要去关注如连接的创建、statement的创建等操作。
Mybatis会将输入参数、输出结果进行映射。
原生的操作数据库JDBC:
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//1、加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2、通过驱动管理类获取数据库链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "root");
//3、定义sql语句 ?表示占位符
String sql = "select * from user where username = ?";
//4、获取预处理statement
preparedStatement = connection.prepareStatement(sql);
//5、设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "王五");
//6、向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
//7、遍历查询结果集
while(resultSet.next()){
User user
System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//8、释放资源
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、 在执行statement时存在硬编码
配置文件(映射文件)
3、 频繁的开启和关闭数据库连接,会造成数据库性能下降。
数据库连接池(全局配置文件)
Mybatis的框架原理
mybatis下载地址https://github.com/mybatis/mybatis-3/releases
工程搭建
1.Mybatis的核心包和依赖包
2.MySQl的驱动包
3.Junit(非必须)
MyBtis的简单案例:
新建一个Javabean,
package mybatis_Test.response;
public class User {
private int id;
private String username;
private String money;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", money=" + money
+ "]";
}
}
在创建一个MyBatis的xml配置,MyBatisConfig.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>
<!-- 配置mybatis的环境信息,与spring整合,该信息由spring来管理 -->
<environments default="development">
<environment id="development">
<!-- 配置JDBC事务控制,由mybatis进行管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源,采用mybatis连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/transaction1" />
<property name="username" value="root" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="mybatis_Test/invoke/query_user_dao_invoke.xml"/>
</mappers>
</configuration>
创建一个根据id查询用户的接口:
package mybatis_Test.invoke;
import java.io.IOException;
import mybatis_Test.response.User;
public interface QueryUserDaoInvoke {
User findUserById(int id) throws IOException;
}
创建这个接口对应的xml文件,query_user_dao_invoke.xml:
<?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">
<mapper namespace="mybatis_Test.invoke.QueryUserDaoInvoke">
<select id="findUserById" parameterType="int" resultType="mybatis_Test.response.User">
select * from account where id=#{id}
</select>
</mapper>
最后写一个测试类:
package test;
import java.io.IOException;
import java.io.InputStream;
import mybatis_Test.invoke.QueryUserDaoInvoke;
import mybatis_Test.response.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
public class DemoTest {
@Test
public void test() throws IOException{
// QueryUserApi api = new QueryUserApi();
// User user = api.findUserById(1);
// System.out.println(user);
//mybatis的配置文件
String resource = "config/MyBatisConfig.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream is = DemoTest.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
//Reader reader = Resources.getResourceAsReader(resource);
//构建sqlSession的工厂
//SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建能执行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession();
/**
* 映射sql的标识字符串,
* me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
* getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
// String statement = "com.company.User.getUser";//映射sql的标识字符串
QueryUserDaoInvoke userMapper = session.getMapper(QueryUserDaoInvoke.class);
//执行查询返回一个唯一user对象的sql
User user = userMapper.findUserById(1);
System.out.println(user);
session.close();
}
}
打印结果:
log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
User [id=1, username=fly, money=60]
所有的路径都是src下面的路径。