初识MyBatis
MyBatis框架介绍
MyBatis是一个开源的数据持久层框架。它内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询,存储过程和高级映射,几乎消除了所有的JDBC代码和参数的手工设置以及结果集的检索,MyBatis作为持久层框架,其主要思想是将程序中的大量的SQL语句剥离出来,配置在配置文件中,实现SQL的灵活配置。这样做的好处是将SQL与程序代码分离,可以在不修改程序代码的情况下,直接在配置文件中修改
MyBatis的前身是iBatis,本是Apache的一个开源项目,2010年这个项目由Apache Software Foundation迁移到了Google Code,并改名为MyBatis。2013年迁移到Github
MyBatis官网:http://mybatis.org
Github:http://github.com/mybatis
什么是ORM
ORM(Object/Relational Mapping)即对象/关系映射,是一种数据持久化技术。它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过javaBean对象去操作数据库表中的数据
MyBatis是ORM解决方案
基于ORM,MyBatis在对象模型和关系数据库的表之间建立了一座桥梁,通过MyBatis建立SQL关系映射,以便捷地实现数据存储,查询,更改,和删除等操作
下面是入门代码
下面是jar包
主配置文件
<?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事务管理,事务控制由mybatis -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池,由mybatis -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sqlmap/UserMapper.xml"/>
</mappers>
</configuration>
mapper.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">
<!-- namespace命名空间 作用是对sql进行分类化管理 理解sql隔离 -->
<mapper namespace="test">
<!-- 在映射文件中可以配置很多sql语句 通过select进行用户查询
这里面的id进行称为statement的id
#{}表示一个占位符
parameterType:指定输入参数的类型
#{id}:这里面的id表示接收一个名字为id的参数 如果输入参数的类型为简单类型那么这里的名字可以任意
resultType:将数据查出来然后映射到相应的类中
-->
<select id="findUserByID" parameterType="int" resultType="com.bdqn.cn.user.User">
select * from User where id=#{id}
</select>
<!-- parameterType="java.lang.String":这里的参数可以是String 不一定非要写成全部形式 -->
<select id="findUserByName" parameterType="java.lang.String" resultType="com.bdqn.cn.user.User">
<!-- '%${value}%' == #{value} 但是测试代码那边参数要写成 "%赵%" 使用${}进行拼接容易引起sql注入
%${value}%表示接收传入的参数 这里面只能使用value
-->
select * from user where username like '%${value}%';
</select>
<insert id="insertUser" parameterType="com.bdqn.cn.user.User" >
<!-- keyProperty:将查询到的主键设置到parameterType指定的对象的哪个属性
order: select last_insert()_id 执行顺序 相对于insert语句来说他的执行顺序
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into User(username,sex,birthday,address) values(#{username},#{sex},#{birthday},#{address})
</insert>
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
<update id="updateUser" parameterType="com.bdqn.cn.user.User">
update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id}
</update>
</mapper>
实体类
public class User {
private int id;
private String username;
private String sex;
private Date birthday;
private String address;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(int id, String username, String sex, Date birthday,
String address) {
super();
this.id = id;
this.username = username;
this.sex = sex;
this.birthday = birthday;
this.address = address;
}
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ ", birthday=" + birthday + ", address=" + address + "]";
}
}
测试类:
public class MybatisFirst {
//根据用户查询 最后得到一条记录
@Test
public void findUserByIDTest(){
try {
//sqlmap配置文件
String resource = "SqlMapConfig.xml";
InputStream config = Resources.getResourceAsStream(resource);
//创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(config);
//通过工厂得到SqlSession
SqlSession openSession = sqlSessionFactory.openSession();
System.out.println(1);
//通过SqlSession操作数据库 第一个参数 映射文件中statement的id 第二个参数 指定和映射文件中所匹配的parameterType类型的参数
User u = openSession.selectOne("test.findUserByID", 1);
System.out.println(u);
//释放资源
openSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void Method2(){
try {
//sqlmap配置文件
String resource = "SqlMapConfig.xml";
InputStream config = Resources.getResourceAsStream(resource);
//创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(config);
//通过工厂得到SqlSession
SqlSession openSession = sqlSessionFactory.openSession();
//通过SqlSession操作数据库 第一个参数 映射文件中statement的id 第二个参数 指定和映射文件中所匹配的parameterType类型的参数
//selectOne()表示要查询的是一条数据
// User u = openSession.selectOne("test.findUserByID", 1);
// selectList()表示获取很多数据
List<User> selectList = openSession.selectList("test.findUserByName", "赵");
System.out.println(selectList);
//释放资源
openSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void insertMethod(){
try {
//sqlmap配置文件
String resource = "SqlMapConfig.xml";
InputStream config = Resources.getResourceAsStream(resource);
//创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(config);
//通过工厂得到SqlSession
SqlSession openSession = sqlSessionFactory.openSession();
User user = new User();
user.setUsername("马超");
user.setSex("男");
user.setBirthday(new Date());
user.setAddress("北京");
openSession.insert("test.insertUser",user);
//提交事务
openSession.commit();
//获取用户主键ID
System.out.println("返回的主键为:"+user.getId());
//释放资源
openSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void deleteUser(){
try {
//sqlmap配置文件
String resource = "SqlMapConfig.xml";
InputStream config = Resources.getResourceAsStream(resource);
//创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(config);
//通过工厂得到SqlSession
SqlSession openSession = sqlSessionFactory.openSession();
//通过SqlSession操作数据库 第一个参数 映射文件中statement的id 第二个参数 指定和映射文件中所匹配的parameterType类型的参数
//selectOne()表示要查询的是一条数据
// User u = openSession.selectOne("test.findUserByID", 1);
// selectList()表示获取很多数据
openSession.delete("test.deleteUser",4);
//提交事务
openSession.commit();
//释放资源
openSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void updateUser(){
try {
//sqlmap配置文件
String resource = "SqlMapConfig.xml";
InputStream config = Resources.getResourceAsStream(resource);
//创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(config);
//通过工厂得到SqlSession
SqlSession openSession = sqlSessionFactory.openSession();
//通过SqlSession操作数据库 第一个参数 映射文件中statement的id 第二个参数 指定和映射文件中所匹配的parameterType类型的参数
//selectOne()表示要查询的是一条数据
// User u = openSession.selectOne("test.findUserByID", 1);
// selectList()表示获取很多数据
User user = new User();
user.setId(2);
user.setUsername("张飞");
user.setSex("男");
user.setBirthday(new Date());
user.setAddress("南京");
openSession.update("test.updateUser",user);
//提交事务
openSession.commit();
//释放资源
openSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}