MyBatis是一个支持普通SQL查询、存储过程以及高级映射的持久层框架,也被称作ORM(Object/Relation Mapping对象关系映射框架);mybatis就是采用pojo作为持久化类来完成对数据库操作的
- MyBatis是一个半自动映射的框架,需要手动匹配提供POJO、SQL和映射关系;但是MyBatis可以配置动态SQL并优化SQL,可以通过配置决定SQL的映射规则,还支持存储过程等。(适用于复杂的和需要优化性能的项目)
- Hibernate,是一个全表映射的框架,会自动生成SQL并调用JDBC接口执行编写,开发效率会高于MyBatis;但是它不支持存储过程,在多表关联时,对SQL查询的支持较差;更新数据时,需要发送所有字段;不能通过优化SQL来优化性能等。
- 在写实现类和配置文件前先创建一个测试数据库customer
USE mybatis;
CREATE TABLE t_customer(
id INT(32) PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
jobs VARCHAR(50),
phone VARCHAR(16)
);
INSERT INTO t_customer (id,username,jobs,phone) VALUES (1,'Jack','Student','123456789');
INSERT INTO t_customer (id,username,jobs,phone) VALUES (2,'Rose','Teacher','234567890');
INSERT INTO t_customer (id,username,jobs,phone) VALUES (3,'Tom','Doctor','890423271');
SELECT * FROM t_customer;
- 导入14个工具包
- 在class path路径下创建日志文件log4j.properties(日志文件包含了全局日志配置、mybatis的日志配置和控制台输出,其中mybatis的日志配置用于将包下所有类的日志记录级别设置为DEBUG)
# 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
- 创建POJO类customer,作为mybatis进行sql映射使用,po类通常与数据库表对应
package example07;
//customer持久化类
public class customer {
/*
* 持久化类customer的属性字段与数据库中的表字段相对应,
* 他就是一个POJO(普通Java对象)
* mybatis就是采用pojo作为持久化类来完成对数据库操作的
*/
private int id;
private String username;
private String jobs;
private String phone;
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 getJobs() {
return jobs;
}
public void setJobs(String jobs) {
this.jobs = jobs;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "customer [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]";
}
}
- 创建sql映射文件CustomerMapper.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="example07.CustomerMapper">
<select id="findcustomerByName" parameterType="string"
resultType="example07.customer">
select * from t_customer where username like #{username}
</select>
//这里写的是模糊查询
</mapper>
- 创建MyBatis核心配置文件sqlMapConfig.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>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="ZSX101626" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="CustomerMapper.xml" />
</mappers>
</configuration>
- 创建测试类MybatisTest
public class MybatisTest {
private SqlSessionFactory sqlSessionFactory=null;
@Before
public void init() throws Exception {
// 1. 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2. 加载SqlMapConfig.xml配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 3. 创建SqlSessionFactory对象
this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
public void testQueryUserById() throws Exception {
// 4. 创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 5. 执行SqlSession对象执行查询,获取结果User
List<Object> list = sqlSession.selectList("findcustomerByName", "%j%");
for(Object user : list) {
// 6. 打印结果
System.out.println(user);
}
// 7. 释放资源
sqlSession.close();
}
}
上面实现的是数据库表的查询,下面实现增删改:
增:
<insert id="add" parameterType="example07.customer">
insert into t_customer (id,username,jobs,phone) values (#{id},#{username},#{jobs},#{phone})
</insert>
@Test
public void add() throws Exception{
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory build= new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = build.openSession();
customer t_customer = new customer();
t_customer.setUsername("大娃");
t_customer.setJobs("项目经理");
t_customer.setPhone("1166661616");
int insert = sqlSession.insert("add", t_customer);
System.out.println(insert);
sqlSession.commit();
sqlSession.close();
}
删:
<delete id="deletecustomer" parameterType="example07.customer">
delete from t_customer where id=#{id}
</delete>
@Test
public void deletec() throws Exception{
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory build= new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = build.openSession();
int delete = sqlSession.delete("deletecustomer", 2);
System.out.println(delete);
sqlSession.commit();
sqlSession.close();
}
改:
<update id="change" parameterType="example07.customer">
update t_customer set username=#{username},jobs=#{jobs},phone=#{phone} where id=#{id}
</update>
@Test
public void updatec() throws Exception{
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory build= new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = build.openSession();
customer t_customer = new customer();
t_customer.setUsername("小周");
t_customer.setJobs("产品经理");
t_customer.setPhone("15993110921");
int update = sqlSession.update("change", t_customer);
System.out.println(update);
sqlSession.commit();
sqlSession.close();
}
占位符#{}和${}拼接符:
- #{}
- #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值
- #{}相当于"?",可以自动进行Java类型和jdbc类型转换。
- #{}可以有效防止sql注入,可以接收简单类型值或pojo属性值
- 如果parameterType传输单个简单类型值,#{}括号中可以是value或其他名称
- ${}
- 表 示 拼 接 s q l 串 , 通 过 {}表示拼接sql串,通过表示拼接sql串,通过{}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换
- ${}可以接受简单类型值或pojo属性值
- 如果parameterType传输单个简单类型值,${}括号中只能是value
- ${}不能防止sql注入。如果需要防止注入,可以这样处理:去掉参数中的“;”,或者使用concat()拼接。
- sql注入:
SELECT * FROM t_customer WHERE username LIKE '%%';DELETE FROM t_customer; SELECT * FROM t_customer WHERE username LIKE '%%'
parameterType和resultType
- parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中
- resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中。
selectOne和selectList
- selectOne:查询一条记录,如果使用selectOne查询多条记录则抛出异常
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)
- selectList:可以查询一条或多条记录。
版权声明:本文为qq_44050958原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。