Mybatis详解
来源:互联网 发布:淘宝上的死飞耐用吗 编辑:程序博客网 时间:2024/04/28 11:42
Mybatis详解
关于Mybatis的具体介绍请参考http://www.mybatis.org/mybatis-3/zh/
创建Mybatis程序的大致步骤是:
1.添加Mybatis 的配置文件Configuration.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"> <property name="" value="" /> </transactionManager> <dataSource type="UNPOOLED"> <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="" /> </dataSource> </environment> </environments></configuration>
2.创建实体类User
和定义操作users 表的sql 映射文件userMapper.xml
在这里定义了一个select
语句。
<?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="mybatis.test1.userMapper"> <!--根据id查询到一个uesr对象 --> <select id="getUser" parameterType="int" resultType="mybatis.test1.User"> select * from users where id=#{id} </select></mapper>
resultType
表示的是返回值类型
3.在Configuration.xml
文件中注册userMapper.xml
文件
<mappers> <mapper resource="mybatis/test1/userMapper.xml" /></mappers>
4.执行定义的select
语句
String resource = "Configuration.xml"; //加载mybatis 的配置文件(它也加载关联的映射文件) Reader reader = Resources.getResourceAsReader(resource); //构建sqlSession 的工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); //创建能执行映射文件中sql 的sqlSession SqlSession session = sessionFactory.openSession(); //映射sql 的标识字符串 String statement = "mybatis.test1.userMapper"+".getUser"; //执行查询返回一个唯一user 对象的sql User user = session.selectOne(statement, 1); System.out.println(user);
这是的statement
是userMapper.xml
中mapper
的namespace
属性,加上select
的id
属性
增删改查操作
XML实现
添加数据
添加数据要使用insert
标签,如下:
<insert id="addUser" parameterType="mybatis.test2.User"> insert into users(name, age) values(#{name}, #{age})</insert>
parameterType
使用的是User对象的全类名。 values(#{name}, #{age}
中#{}
括号中对应的是User
类的属性
编写测试类,测试下:
@Testpublic void testAdd() { int insert = session.insert("mybatis.test2.userMapper.addUser", new User(-1, "xiaozhao", 23)); System.out.println(insert);}
insert
表示受影响的行数,此时提示是1,表示是成功的,但是此时去查看数据库,会发现并没有插入的数据。是因为session = sessionFactory.openSession();
是手动提交事务的,所以需要使用如下的方式:
int insert = session.insert("mybatis.test2.userMapper.addUser", new User(-1, "xiaozhao", 23));session.commit();
设置自动提交
session = sessionFactory.openSession(true);
删除数据
删除数据使用delete
标签
<delete id="deleteUser" parameterType="int"> delete from users where id=#{id}</delete>
测试如下:
int delete = session.delete("mybatis.test2.userMapper.deleteUser", 6);session.commit();
修改数据
修改数据使用update
标签
<update id="updateUser" parameterType="mybatis.test2.User"> update users set name=#{name}, age=#{age} where id=#{id}</update>
测试如下:
int insert = session.update("mybatis.test2.userMapper.updateUser", new User(4, "xiaowang", 30));session.commit();
查询数据
查询单个对象
在xml中的配置如下:
<!--根据id查询到一个uesr对象 --><select id="getUser" parameterType="int" resultType="mybatis.test2.User"> select * from users where id=#{id}</select>
获取查询的对象:
User user = session.selectOne("mybatis.test2.userMapper.getUser", 1); session.commit(); System.out.println(user);
查询所有对象
在xml中配置如下:
<select id="getAllUsers" resultType="mybatis.test2.User"> select * from users</select>
测试如下:
List<User> users = session.selectList("mybatis.test2.userMapper.getAllUsers"); session.commit(); System.out.println(users);
注解实现
基于注解实现,先写一个接口,把所有的sql语句写到接口中
package mybatis.test3;import java.util.List;import org.apache.ibatis.annotations.Delete;import org.apache.ibatis.annotations.Insert;import org.apache.ibatis.annotations.Select;import org.apache.ibatis.annotations.Update;import mybatis.test2.User;public interface UserMapper { @Insert("insert into users(name, age) values(#{name}, #{age})") public int add(User user); @Delete("delete from users where id=#{id}") public int deleteById(int id); @Update("update users set name=#{name}, age=#{age} where id=#{id}") public int update(User user); @Select("select * from users where id=#{id}") public User getById(int id); @Select("select * from users") public List<User> getAll();}
将接口文件添加到Configuration.xml
的mappers
中
<mappers> <mapper class="mybatis.test3.UserMapper" /></mappers>
测试添加如下:
UserMapper mapper = session.getMapper(UserMapper.class); int add = mapper.add(new User(-1, "xiaoqian", 23)); session.commit(); System.out.println(add);
优化
数据库连接单独放在一个文件
创建db.properties
文件
driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/mybatisusername=rootpassword=
在Configuration.xml
中导入文件
<properties resource="db.properties"></properties>
在dataSource
标签中引用这些值:
<dataSource type="UNPOOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource>
为实体类定义别名,简化sql 映射xml 文件中的引用
配置别名
<!-- 配置实体类的别名 --><typeAliases> <typeAlias type="mybatis.test2.User" alias="_User"/></typeAliases>
使用别名
<select id="getAllUsers" resultType="_User"> select * from users</select>
可以在src 下加入log4j 的配置文件,打印日志信息
log4j.properties
配置信息如下:
log4j.properties,log4j.rootLogger=DEBUG, Console#Consolelog4j.appender.Console=org.apache.log4j.ConsoleAppenderlog4j.appender.Console.layout=org.apache.log4j.PatternLayoutlog4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%nlog4j.logger.java.sql.ResultSet=INFOlog4j.logger.org.apache=INFOlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG
解决字段名与实体类属性名不相同的冲突
创建如下的orders表:
CREATE TABLE orders(order_id INT PRIMARY KEY AUTO_INCREMENT,order_no VARCHAR(20),order_price FLOAT);INSERT INTO orders(order_no, order_price) VALUES('aaaa', 23);INSERT INTO orders(order_no, order_price) VALUES('bbbb', 33);INSERT INTO orders(order_no, order_price) VALUES('cccc', 22);
创建orders表对应的实体类,Order:
package mybatis.bean;public class Order { private int id; private String orderNo; private float price; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getOrderNo() { return orderNo; } public void setOrderNo(String orderNo) { this.orderNo = orderNo; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public Order() { } public Order(int id, String orderNo, float price) { super(); this.id = id; this.orderNo = orderNo; this.price = price; } @Override public String toString() { return "Order [id=" + id + ", orderNo=" + orderNo + ", price=" + price + "]"; }}
可以发现,字段名和属性名并不一致。
创建orderMapper.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="mybatis.test4.orderMapper"> <!--根据id查询到一个order对象 --> <select id="getOrder" parameterType="int" resultType="mybatis.bean.Order"> select * from orders where order_id=#{id} </select></mapper>
使用如下方式来获取order对象:
Order order = session.selectOne("mybatis.test4.orderMapper.getOrder", 1); System.out.println(order);
会发现输出结果为null
如何显示order的查询呢?
1.通过在sql 语句中定义别名
<select id="getOrder" parameterType="int" resultType="mybatis.bean.Order"> select order_id id, order_no orderNo, order_price price from orders where order_id=#{id}</select>
2.通过<resultMap>
<!-- resultMap封装映射关系 --><resultMap type="mybatis.bean.Order" id="orderMap"> <!-- 针对主键 --> <id property="id" column="order_id"/> <result property="orderNo" column="order_no"/> <result property="price" column="order_price"/></resultMap><select id="getOrder" parameterType="int" resultMap="orderMap"> select * from orders where order_id=#{id}</select>
- MyBatis 详解
- Mybatis详解
- MyBatis详解
- mybatis详解
- Mybatis详解
- mybatis详解
- mybatis详解
- mybatis 详解
- mybatis 详解
- Mybatis详解
- MyBatis详解
- mybatis详解
- mybatis(三)-mybatis-config详解
- mybatis注解详解
- mybatis注解详解
- springMVC+mybatis配置详解
- MyBatis动态SQL详解
- mybatis 标签详解
- linux 安装Mysql方式
- Md5与对称非对称加密的比较区别
- Activity中finish()和onDestroy()的区别
- Java与算法之(7) - 完全二叉树
- Android 手机获取手机通讯录(按时间排序)
- Mybatis详解
- 【JavaWeb-8】JSP原理、3大命令、6大动作、9大对象、4大域对象、EL表达式、JSTL的几个标签
- leetcode之137. Single Number II(C++解法 哈希表计数)
- 工厂模式Factory
- Android使用React Native 出现的问题
- Struts工作原理和入门小实例
- 保存数据时结束编辑
- 机器学习(2.7.2)数据知识积累——概率论-超几何分布
- Linux下查找特定时间创建的文件