mybatis框架实现数据库增删改查(含模糊查询)

MyBatis是一个支持普通SQL查询、存储过程以及高级映射的持久层框架,也被称作ORM(Object/Relation Mapping对象关系映射框架);mybatis就是采用pojo作为持久化类来完成对数据库操作的

  • MyBatis是一个半自动映射的框架,需要手动匹配提供POJO、SQL和映射关系;但是MyBatis可以配置动态SQL并优化SQL,可以通过配置决定SQL的映射规则,还支持存储过程等。(适用于复杂的和需要优化性能的项目)
  • Hibernate,是一个全表映射的框架,会自动生成SQL并调用JDBC接口执行编写,开发效率会高于MyBatis;但是它不支持存储过程,在多表关联时,对SQL查询的支持较差;更新数据时,需要发送所有字段;不能通过优化SQL来优化性能等。

  1. 在写实现类和配置文件前先创建一个测试数据库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;

  1. 导入14个工具包
  2. 在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
  1. 创建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 + "]";
	}
	
	

}
  1. 创建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>
  1. 创建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>
  1. 创建测试类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版权协议,转载请附上原文出处链接和本声明。