Mybatis:
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。 MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO( Plain Old Java Objects,普通的Java 对象)映射成数据库中的记录.
1)MyBATIS 目前提供了三种语言实现的版本,包括:Java、.NET以及Ruby。(我主要学习java,就讲java的使用)
2)它提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
3)mybatis与hibernate的对比?
mybatis提供一种“半自动化”的ORM实现。
这里的“半自动化”,是相对Hibernate等提供了全面的数据库封装机制的“全自动化”ORM实现而言,“全自动”ORM实现了POJO和数据库表之间的映射,以及 SQL 的自动生成和执行。
而mybatis的着力点,则在于POJO与SQL之间的映射关系。
工程结构:
工具:eclipse
mysql
代码:
数据库表
DROP TABLE IF EXISTS `workers`;
CREATE TABLE `workers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`address` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
pojo(实体类)
package com.qyn.pojo;
/*
* workers的实体类
* */
public class Workers {
private int id;
private String name;
private int age;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String toString() {
return "Workers [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
}
}
config
<?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别名定义 -->
<typeAliases>
<typeAlias alias="Workers" type="com.qyn.pojo.Workers"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- mybatis的mapper文件,每个xml配置文件对应一个接口 -->
<mappers>
<mapper resource="com/qyn/mapper/Workers.xml"/>
</mappers>
</configuration>
mapper
<?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="com.qyn.operation.IWorkerOperation">
<!-- select语句 -->
<select id="selectByID" parameterType="int" resultType="Workers">
select * from workers where id = #{id}
</select>
<select id="selectByName" parameterType="string" resultType="Workers">
select * from workers where name = #{name}
</select>
<!--执行增加操作的SQL语句。id和parameterType分别与IUserOperation接口中的add方法的名字和参数类型一致。
useGeneratedKeys设置为"true"表明要MyBatis获取由数据库自动生成的主键;keyProperty="id"指定把获取到的主键值注入到Workers的id属性-->
<insert id="add" parameterType="Workers"
useGeneratedKeys="true" keyProperty="id">
insert into workers(name,age,address)
values(#{name},#{age},#{address})
</insert>
<update id="update" parameterType="Workers" >
update workers set name=#{name},age=#{age},address=#{address} where id=#{id}
</update>
<delete id="delete" parameterType="int">
delete from workers where id=#{id}
</delete>
</mapper>
operation
package com.qyn.operation;
import java.util.List;
import com.qyn.pojo.Workers;
public interface IWorkerOperation {
Workers selectByID(int id);
List<Workers> selectByName(String name);
void add(Workers worker);
void update(Workers worker);
void delete(int id);
}
log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c:%L - %m%n
log4j.rootLogger=warn, stdout
log4j.logger.org.hibernate.tool.hbm2ddl=debug
测试类
package com.qyn.test;
import java.io.Reader;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.qyn.operation.IWorkerOperation;
import com.qyn.pojo.Workers;
/*
* 测试类:按主键,姓名查询用户表的相关信息
* 插入用户
* 按主键删除用户
* 修改用户
*/
public class Test {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static {
try {
reader = Resources.getResourceAsReader("com/qyn/config/Configuration.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSession() {
return sqlSessionFactory;
}
public void getByID(int id) {
SqlSession session = sqlSessionFactory.openSession();
try {
IWorkerOperation iwo = session
.getMapper(IWorkerOperation.class);
Workers worker = iwo.selectByID(id);
if (worker != null) {
System.out.println(worker.getId() + ":" + worker.getName()
+ ":" + worker.getAge()+":"+worker.getAddress());
}
} finally {
session.close();
}
}
public void getWorkersList(String name) {
SqlSession session = sqlSessionFactory.openSession();
try {
IWorkerOperation iwo = session
.getMapper(IWorkerOperation.class);
List<Workers> worker = iwo.selectByName(name);
for (Workers user : worker) {
System.out.println(user.getId() + ":" + user.getName()
+ ":" + user.getAge()+":"+user.getAddress());
}
} finally {
session.close();
}
}
/**
* 增加后要commit
*/
public void add() {
Workers worker = new Workers();
worker.setAddress("china");
worker.setName("tom");
worker.setAge(21);
SqlSession session = sqlSessionFactory.openSession();
try {
IWorkerOperation iwo = session
.getMapper(IWorkerOperation.class);
iwo.add(worker);
session.commit();
System.out.println("新增用户ID:" + worker.getId());
} finally {
session.close();
}
}
/*
* 修改后要commit
*/
public void update() {
SqlSession session = sqlSessionFactory.openSession();
try {
IWorkerOperation iwo = session
.getMapper(IWorkerOperation.class);
Workers worker = iwo.selectByID(7);
if (worker != null) {
worker.setAddress("安徽");
iwo.update(worker);
session.commit();
}
} finally {
session.close();
}
}
/**
* 删除后要commit.
*
* @param id
*/
public void delete(int id) {
SqlSession session = sqlSessionFactory.openSession();
try {
IWorkerOperation iwo = session
.getMapper(IWorkerOperation.class);
iwo.delete(id);
session.commit();
} finally {
session.close();
}
}
public static void main(String[] args) {
Test t = new Test();
//t.delete(4);
//t.getByID(1);
//t.update();
//t.add();
//t.getByID(7);
//t.getWorkersList("tom");
t.update();
}
}