Mybatis的入门详解

  1. mybatis简介
    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
    Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
  2. mybatis解决jdbc的问题
    1、数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。
    解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。
    2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
    解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
    3、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
    解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
    4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
    解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
  3. mybatis的入门详解
    -|导包
    mybatis的核心包:
核心包
	mybatis-3.2.7.jar
	mysql-connector-java-5.1.7-bin.jar
依赖包:主要第打印log及其他
	asm-3.3.1.jar
	cglib-2.2.2.jar
	commons-logging-1.1.1.jar
	/javassist-3.17.1-GA.jar
	log4j-1.2.17.jar
	log4j-api-2.0-rc1.jar
	log4j-core-2.0-rc1.jar
	slf4j-api-1.7.5.jar
	slf4j-log4j12-1.7.5.jar
导包完成
  1. 准备数据库:测试用的bos_puya32数据库,操作的表为t_customer
    -|t_customer分别有
    id,name,station,telephone,address,decidedzone_id 这几个字段,
    5.准备接入数据,创建t_t_customer对应的实体类,包名为com.puya.mybatis.pojo
package com.puya.mybatis.pojo;

import java.io.Serializable;

public class User implements Serializable {
	private Integer id;
	private String name;
	private String station;
	private String telephone;
	private String address;
	private String decidedzone_id;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getStation() {
		return station;
	}
	public void setStation(String station) {
		this.station = station;
	}
	public String getTelephone() {
		return telephone;
	}
	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getDecidedzone_id() {
		return decidedzone_id;
	}
	public void setDecidedzone_id(String decidedzone_id) {
		this.decidedzone_id = decidedzone_id;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", station=" + station + ", telephone=" + telephone + ", address="
				+ address + ", decidedzone_id=" + decidedzone_id + "]";
	}
	

	
}

  1. 配置log4j,创建一个log4j.properties,内容如下,主要是打印log的作用
# 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. 配置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">
  1. 填写mybatis的configuration内容,注意数据库的名字和登录的账号和密码,否则jdbc连接不上
<?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/bos_puya32?characterEncoding=utf-8" />
				<property name="username" value="root" />
				<property name="password" value="123456" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- Mapper的位置  Mapper.xml 写Sql语句的文件的位置 -->
	<mappers>
		<mapper resource="com/puya/mybatis/sqlmap/User.xml"/>
		
	</mappers>
</configuration>
  1. 书写测试的代码,通过id查找一个对象
@Test
	public void testMybatis() throws Exception {
		//加载核心的配置文件
		String path ="sqlMapConfig.xml";
		//读取配置文件获取流
		InputStream in = Resources.getResourceAsStream(path);
		//创建sqlSessionFactory
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建session
		SqlSession session = sessionFactory.openSession();
		//执行sql语句
		User user = session.selectOne("user.findUserById", 1);
		
		System.out.println(user); 
	}
	
  1. 在这里就疑问sql语句写在哪里? 每一个实体类都需要对应一个实体类的xml文件,然后配置在mybatis的文件中去
    User类对应的实体xml文件,User.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">

<!-- 写sql语句的地方 -->
<mapper namespace="user">
	<!--
		mapper参数详解:
			namespace:命名空间,区分不同的sql,调用的时候使用 user.findUserById
		select 参数详解
			parameterType  : 传入参数的类型,mybatis封装了基本类,只需要写
			resultType     : 返回的数据类型,一般是全类名
	
	  -->

	<select id="findUserById" parameterType="Integer" resultType="com.puya.mybatis.pojo.User">
		select * from t_customer where id = #{v}
	
	</select>
	<!-- 
	#{v}            表示占位符v可以是任何字符           select * from t_customer where id = ?
	${value}        表示字符拼接,只能是value  select * from t_customer where name like '%张三%'  ,有单引号的
					为了防止sql注入  ${value}  可以这样写   select * from t_customer where name like "%"#{value}"%"
	 -->
	<select id="findUserByUserName" parameterType="String" resultType="com.puya.mybatis.pojo.User">
		<!-- select * from t_customer where username like '%${value}%' -->
		select * from t_customer where name like "%"#{value}"%"     <!-- 这个可以防止sql注入  -->
	</select>
	
	<insert id="insertUser" parameterType="com.puya.mybatis.pojo.User">
		<!--private Integer id;
		private String name;
		private String station;
		private String telephone;
		private String address;
		private String decidedzone_id;  -->
		<selectKey keyProperty="id" resultType="Integer" order="AFTER">
			select LAST_INSERT_ID()    <!-- 这个表示执行最新的id 服装到User的id中去-->
		</selectKey>
		insert into t_customer (name,station,telephone,address,decidedzone_id) value(#{name},#{station},#{telephone},#{address},#{decidedzone_id})
	
	</insert>
	
	<update id="updateUserById" parameterType="com.puya.mybatis.pojo.User">
		update t_customer 
		set name=#{name},station=#{station},telephone=#{telephone},address=#{address},decidedzone_id=#{decidedzone_id}
		where id=#{id}
	</update>
	
	<delete id="deleteUserById" parameterType="Integer">
		delete from t_customer where id =#{value}
		
	</delete>



</mapper>

一定要记得配置到sqlMapConfig.xml 文件中去,路径配置正确即可

	<!-- Mapper的位置  Mapper.xml 写Sql语句的文件的位置 -->
	<mappers>
		<mapper resource="com/puya/mybatis/sqlmap/User.xml"/>
		
	</mappers>
	//执行sql语句
	User user = session.selectOne("user.findUserById", 1);
	这句代码执行的时候就会执行User.xml文件中的
	<select id="findUserById" parameterType="Integer" resultType="com.puya.mybatis.pojo.User">
	select * from t_customer where id = #{v}

</select>
语句,就查询到了响应的User对象
  1. 根据用户名字模糊查询
	@Test
	public void findUserByUserName() throws Exception {
		//加载核心的配置文件
		String path ="sqlMapConfig.xml";
		//读取配置文件获取流
		InputStream in = Resources.getResourceAsStream(path);
		//创建sqlSessionFactory
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建session
		SqlSession session = sessionFactory.openSession();
		//执行sql语句
		List<User> data = session.selectList("user.findUserByUserName", "张三");
	
		for (User user2 : data) {
			System.out.println(user2);
			
		}
	}

对应的User.xml文件中的sql语句

	<!-- 
	#{v}            表示占位符v可以是任何字符           select * from t_customer where id = ?
	${value}        表示字符拼接,只能是value  select * from t_customer where name like '%张三%'  ,有单引号的
					为了防止sql注入  ${value}  可以这样写   select * from t_customer where name like "%"#{value}"%"
	 -->
	<select id="findUserByUserName" parameterType="String" resultType="com.puya.mybatis.pojo.User">
		<!-- select * from t_customer where username like '%${value}%' -->
		select * from t_customer where name like "%"#{value}"%"     <!-- 这个可以防止sql注入  -->
	</select>
<!--   注意这些占位符和字符串拼接的书写
#{v}            表示占位符v可以是任何字符           select * from t_customer where id = ?
${value}        表示字符拼接,只能是value  select * from t_customer where name like '%张三%'  ,有单引号的
				为了防止sql注入  ${value}  可以这样写   select * from t_customer where name like "%"#{value}"%"
  1. 插入一个用户
	@Test
	public void insertUser() throws Exception {
		//加载核心的配置文件
		String path ="sqlMapConfig.xml";
		//读取配置文件获取流
		InputStream in = Resources.getResourceAsStream(path);
		//创建sqlSessionFactory
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建session
		SqlSession session = sessionFactory.openSession();
		
		User user = new User();
		
		user.setAddress("湖北省咸宁市通城县");
		user.setName("纱布都");
		user.setStation("文员");
		user.setTelephone("15526896541");
		session.insert("user.insertUser", user);
		
		//插入数据,一定要交事务
		session.commit();
		
		System.out.println(user.getId());
	
	}
  1. 更新一个用户
	@Test
	public void updateUser() throws Exception {
		//加载核心的配置文件
		String path ="sqlMapConfig.xml";
		//读取配置文件获取流
		InputStream in = Resources.getResourceAsStream(path);
		//创建sqlSessionFactory
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建session
		SqlSession session = sessionFactory.openSession();
		
		User user = new User();
		
		user.setAddress("湖北省咸宁市通城县22222222");
		user.setId(10);
		user.setName("纱布都");
		user.setStation("文员2222222");
		user.setTelephone("15526896541");
		session.update("user.updateUserById", user);
		
		//插入数据,一定要交事务
		session.commit();

	
	}
  1. 删除一个用户
	@Test
	public void deleteUserByid() throws Exception {
		//加载核心的配置文件
		String path ="sqlMapConfig.xml";
		//读取配置文件获取流
		InputStream in = Resources.getResourceAsStream(path);
		//创建sqlSessionFactory
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建session
		SqlSession session = sessionFactory.openSession();

		session.update("user.deleteUserById", 10);
		
		//插入数据,一定要交事务
		session.commit();

	
	}

增删改的响应的sql语句都在上面的User.xml文件中相对应,可以嘻嘻查看

这就是mybatis的基本使用了,希望对您有帮助

猜你喜欢

转载自blog.csdn.net/puyaCheer_xu/article/details/84991467
今日推荐