Mybatis对数据库的基本操作

通过XML配置文件连接到数据库以及配置执行SQL语句的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>
	<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="20001101pyj" />
			</dataSource>
		</environment>
	</environments>

	<mappers>
		<mapper resource="EmployeeMapper.xml" />
		<mapper resource="EmployeeMapperPlus.xml" />
	</mappers>
</configuration>

<mapper>标签中的XML文件是写SQL语句的

通过接口的方式创建操作数据库的规范

public interface EmployeeMapper {
	public Employee getEmpById(int id);
	
	public List<Employee> getEmpByNameLike(@Param("name")String name);
	
	public void addEmp(Employee emp);
	
	public void insert(@Param("lastName")String lastName,@Param("email")String         
    email,@Param("gender")String gender);
	
	public void update(int id,String lastName,String gender,String email);
	
	public void deleteById(int id);
}

接口对应的XML文件

namespace="com.pyj.mybatis.dao.EmployeeMapper"是与对应的接口建立联系

<?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.pyj.mybatis.dao.EmployeeMapper">
	<select id="getEmpById"
		resultType="com.pyj.mybatis.bean.Employee">
		select id,last_name lastName,gender,email from tbl_employee where id = #{id}
	</select>
	
	<select id="getEmpByNameLike" resultType="com.pyj.mybatis.bean.Employee">
		select id,last_name lastName,gender,email from tbl_employee where last_name like #{name}
	</select>
	
	<insert id="insert"
		parameterType="com.pyj.mybatis.bean.Employee">
		insert into tbl_employee(last_name,email,gender)
		values(#{lastName},#{email},#{gender})
	</insert>
	
	<insert id="addEmp"
		parameterType="com.pyj.mybatis.bean.Employee">
		insert into tbl_employee(last_name,email,gender)
		values(#{lastName},#{email},#{gender})
	</insert>
	
	<update id="update">
		update tbl_employee
		set last_name=#{param2},gender=#{param4},email=#{param3}
		where id=#{param1}
	</update>
	
	<delete id="deleteById">
		delete from tbl_employee where id=#{id}
	</delete>
	
</mapper>

增删改查

XML文件中通过<insert>进行增添操作,其中id对应的是接口中对应的方法,parameterType是传入的类型(可写可不写)

<insert id="insert"
		parameterType="com.pyj.mybatis.bean.Employee">
		insert into tbl_employee(last_name,email,gender)
		values(#{lastName},#{email},#{gender})
	</insert>
	
	<insert id="addEmp"
		parameterType="com.pyj.mybatis.bean.Employee">
		insert into tbl_employee(last_name,email,gender)
		values(#{lastName},#{email},#{gender})
	</insert>

#{}中对应的是输入的数据

1.接口中的方法通过注解@Param("lastName")为每一个属性创建名字,好应用在#{}中。

	public void insert(@Param("lastName")String lastName,@Param("email")String         
    email,@Param("gender")String gender);

2. 接口中的方法通过传入一个具体的对象,#{}中填入对象具体的属性即可

public void addEmp(Employee emp);

除上述两种方法之外要想通过#{}赋值给SQL语句还可以根据传入值的顺序依次写入param1,param2。具体见更新方法

XML文件中通过<delete>进行删除操作

    <delete id="deleteById">
		delete from tbl_employee where id=#{id}
	</delete>

对应接口中的方法

public void deleteById(int id);

如果传入的值只有一个则#{}中可以直接写对应的变量

XML文件中通过<update>进行更新操作

    <update id="update">
		update tbl_employee
		set last_name=#{param2},gender=#{param4},email=#{param3}
		where id=#{param1}
	</update>

对应接口中的方法

public void update(int id,String lastName,String gender,String email);
	

此时既没有传入一个对象,有没有加注释,所以在#{}中写的是param

XML文件中通过<select>进行查询操作

使用resultType

1.查一条数据,resultType是得到的数据类型

注:若数据库表中对应列的名字与java类对应的名字不同,需将对应列起别名

    <select id="getEmpByid" resultType="com.pyj.mybatis.bean.Employee">
		select id,last_name lastName,gender,email from tbl_employee where id=#{name}
	</select>

对应接口中的方法

public Employee getEmpById(int id);

2.查一堆数据

    <select id="getEmpByNameLike" resultType="com.pyj.mybatis.bean.Employee">
		select id,last_name lastName,gender,email from tbl_employee where last_name like #{name}
	</select>

对应接口中的方法

public List<Employee> getEmpByNameLike(@Param("name")String name);

使用resultMap标签

若一个类对象A中的属性还是一个类对象B,那么SQL语句查询到的数据只能是B对象的属性值,并不能将查询到的对象B的数据封装到B对象中(暂时的理解:数据库中的列名与B对象没有对应关系)。此时需用resultMap标签来实现

将上面的resultType标签换成resultMap标签,同时在resultMap中对应好关系

 column代表数据库中的列名,property代表java中的类对象的名字

dept就是B类,dname就是他的一个属性

方法一:通过对象.属性为对象赋值

<mapper namespace="com.pyj.mybatis.dao.EmployeeMapperPlus">
	<resultMap type="com.pyj.mybatis.bean.EmployeeAndDep" id="Emp">
		<id column="id" property="id"/>
		<result column="last_name" property="lastName"/>
		<result column="email" property="email"/>
		<result column="gender" property="gender"/>
		<result column="name" property="dept.dname"/>
	</resultMap>
	
	<select id="getEmpAndDept" resultMap="Emp">
		SELECT e.`id`,e.`last_name`,e.`email`,e.`gender`,d.`name` FROM tbl_employee e,development d
		WHERE e.`d_id`=d.`id` AND e.`id`= #{id}
	</select>
</mapper>

对应接口中的方法(EmployeeAndDep就是类A)

public EmployeeAndDep getEmpAndDept(Integer id);

方法二:

1.为单个对象赋值使用association标签

<resultMap type="com.pyj.mybatis.bean.EmployeeAndDep" id="Emp2">
		<id column="id" property="id"/>
		<result column="last_name" property="lastName"/>
		<result column="email" property="email"/>
		<result column="gender" property="gender"/>
        <!-- property="dept"是B类在A类中的变量名,javaType是B类的路径 -->
		<association property="dept" javaType="com.pyj.mybatis.bean.Development">
        <!-- B类中的一个属性 -->
			<result column="name" property="dname"/>
		</association>
	</resultMap>
	
	<select id="getEmpAndDept2" resultMap="Emp3">
		SELECT e.`id`,e.`last_name`,e.`email`,e.`gender`,d.`name` FROM tbl_employee e,development d
		WHERE e.`d_id`=d.`id` AND e.`id`= #{id}
	</select>

2.为对象集合赋值使用collection标签

<resultMap type="com.pyj.mybatis.bean.Development" id="Emp3">
		<id column="did" property="id"/>
		<result column="name" property="dname"/>
		<!-- 定义集合 -->
        <!-- property="emps"是B类在A类中的变量名,ofType是B类的路径 -->
		<collection property="emps" ofType="com.pyj.mybatis.bean.EmployeeAndDep">
			<id column="eid" property="id"/>
			<result column="last_name" property="lastName"/>
			<result column="email" property="email"/>
			<result column="gender" property="gender"/>
		</collection>
	</resultMap>
	
	<select id="getByIdPlus" resultMap="Emp3">
		SELECT d.id did,last_name,gender,email,d_id,e.id eid,`name`
		FROM tbl_employee e LEFT JOIN development d
		ON e.`d_id`=d.`id` WHERE d.id=#{id}
	</select>

 3.分段赋值

select语句获得根据传入的类A的id,得到类A的所有属性值,association中select是找到B类执行SQL语句的XML文件,也就是DevelopmentMapper.xml文件中方法(select中的id)为getById的执行语句,column是将当前SQL查询到的d_id值传递给找到的方法的SQL语句

若需要传递多个对象写法为column=["d_id",]

<resultMap type="com.pyj.mybatis.bean.EmployeeAndDep" id="Emp3">
		<id column="id" property="id"/>
		<result column="last_name" property="lastName"/>
		<result column="email" property="email"/>
		<result column="gender" property="gender"/>
<!-- select是找到DevelopmentMapper.xml文件中方法(select中的id)为getById的执行语句,column是将当前SQL查询到的d_id值传递给找到的方法的SQL语句 -->
		<association property="dept" select="com.pyj.mybatis.dao.DevelopmentMapper.getById" column="d_id">
		</association>
	</resultMap>
	
	<select id="getEmpAndDeptStep" resultMap="Emp3">
		select * from tbl_employee where id=#{id}
	</select>

找到的XML文件中对应的方法将查找到的值赋值给当前A对象中的B对象

<select id="getById" resultType="com.pyj.mybatis.bean.Development">
		select name AS dname,id from development where id=#{id}
	</select>

具体实现

首先与主的XML文件建立联系,找到所有可以执行SQL语句的XML配置文件,在此基础上创建一个工厂sqlSessionFactory用来创建执行者openSession

openSession.getMapper(EmployeeMapperPlus.class)方法是通过接口的类找到对应的接口

而执行SQL语句的XML文件在这篇文章最开始的地方通过namespace="com.pyj.mybatis.dao.EmployeeMapper"与对应的接口建立联系

mapper就是接口的实现类,通过mapper.接口中的方法就能执行SQL语句了

如果执行增删改操作可能需要提交

public void test() throws Exception {
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory =
		 new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession openSession = sqlSessionFactory.openSession();
		try {
			EmployeeMapperPlus mapper = openSession.getMapper(EmployeeMapperPlus.class);
			EmployeeAndDep ead=mapper.getEmpAndDept(1);
		}finally {
			openSession.close();
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值