1、Mybatis简介
以前称iBatis-->现在称mybatis
作用:封装jdbc操作,简化了数据库访问方式
封装功能如下:
(1)获得连接
(2)执行sql
(3)释放连接
(4)sql参数的设置(直接传递Emp实体对象作为参数)
sql语句的新写法:insert into emp (name,age) values (#{name},#{age});
其中#{name},#{age}即指代的是Emp实体的属性,名称要与实体的属性名一致
(5)封装了结果集映射成实体对象的过程
要求:实体类属性名要与ResultSet结果集中的列名保持一致
开发者的主要工作:写实体类以及sql语句,然后使用SqlSession对象执行sql操作
2、搭建MyBatis开发环境,并对Emp表进行操作
(1)引入相关的MyBatis的jar包
(2)添加一个配置文件,mybatis-config.xml,指定数据库连接参数,以及sql定义文件
(3)编写一个Emp实体类,属性名一般与Emp表中的字段表名称保持一致
(4)创建一个EmpSql.xml文件,里面编写相关的sql语句(定义sql,指定结果集需要映射称哪个实体类)
(5)利用mybatis-config.xml,得到SqlSession对象,即可执行某些数据库操作
添加一个mybatis-config.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/test?serverTimezone=UTC&useUnicode=ture&characterEncoding=utf8"/>
<property name="username" value="zlc"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--需要加载的sql定义文件 -->
<mappers>
<!--<mapper resource="org/mybatis/example/BlogMapper.xml"/>-->
</mappers>
</configuration>
创建一个实体类:
package com.zlc.entity;
public class User {
private Integer user_id;
private String user_name;
private Integer age;
private Double salary;
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
}
创建一个UserMapper.xml
<!-- namespace名字随意,但是不能与项目中其他mapper中namespace名字相同 -->
<mapper namespace="userMapper">
<!-- id指的是sql语句唯一标识 -->
<select id="findAll" resultType="com.zlc.entity.User">
select * from user
</select>
<!-- 带一个参数的查询 -->
<select id="findByName" parameterType="java.lang.String"
resultType="com.zlc.entity.User">
select * from user where user_name = #{name}
</select>
<insert id="addUser" parameterType="com.zlc.entity.User">
insert into user (user_name,age,salary) values (#{user_name},#{age},#{salary});
</insert>
</mapper>
测试类:
public static void main(String[] args) throws IOException {
String conf = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(conf);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
SqlSession session = ssf.openSession();
User user1 = new User();
user1.setUser_name("张凌超");
user1.setAge(23);
user1.setSalary(8000.0);
session.insert("addUser", user1);
session.commit();
List<User> userlist = session.selectList("findAll");
for(User user : userlist) {
System.out.println(user.getUser_name());
System.out.println(user.getSalary());
}
}
返回类型还可以指定为map类型
<!-- id指的是sql语句唯一标识,map是mybatis中对Map类型的简写,类似的还有string等 -->
<select id="findAll" resultType="map">
select * from user
</select>
java代码:
List<Map<String,Object>> userlist = session.selectList("findAll");
for(Map<String,Object> m : userlist) {
System.out.println(m.get("user_name"));
System.out.println(m.get("age"));
}
2、传递多个参数的方法.
(1)使用实体类传递参数,采用表达式指明参数,参数名称与实体类属性名称一致
<insert id="addUser" parameterType="com.zlc.entity.User">
insert into user (user_name,age,salary) values (#{user_name},#{age},#{salary});
</insert>
java代码:
User user1 = new User();
user1.setUser_name("张凌超");
user1.setAge(23);
user1.setSalary(8000.0);
session.insert("addUser", user1);
session.commit();//增删改必须要有这个操作才生效
(2)使用Map类集合,采用表达式指明参数,参数名称与Map集合key一致
<insert id="addUser" parameterType="map">
insert into user (user_name,age,salary) values (#{user_name},#{age},#{salary});
</insert>
java代码:
Map<String,Object> user1 = new HashMap<>();
user1.put("user_name","王五");
user1.put("age", 20);
user1.put("salary",5609);
session.insert("addUser", user1);
session.commit();//增删改必须要有这个事务提交操作
3、返回值类型
(1)实体类
(2)Map集合类
(3)基本类型
常见问题:
(1)实体类属性与数据库中表的列名不一致时,怎么办?
解决1:sql语句查询时使用别名,例如:select user_name name from user
解决2:不使用resultType映射结果集,而是采用resultMap,例如:
<select id="findPart" resultMap="userMap">
select user_id,user_name,age,salary from user
</select>
<resultMap type="com.zlc.entity.User" id="userMap">
<!-- property指的是实体类User的属性名,
而column指的是结果集中的列名,这里描述他们的对应关系 ,
这里未指明的映射关系,则默认实体类的某个属性,对应结果集中名称一致的列-->
<!-- id标志映射主键值 -->
<id property="id" column="user_id"></id>
<!-- result标志映射其他属性 -->
<result property="name" column="user_name"/>
</resultMap>