MyBatis的简介及其基本使用
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>