//在全局配置文件中添加别名的配置:<configuration> <!-- 类型别名 --> <typeAliases> <typeAlias type="com.shan.hello.User" alias="User"/> </typeAliases></configuration> //在Mapper文件中使用:<select id="get" parameterType="java.lang.Long" resultType="User"> select * from t_user where id = #{id}</select>//在全局配置文件中添加别名的配置:<configuration> <!-- 类型别名 --> <typeAliases> <!-- <typeAlias type="com.shan.hello.User" alias="User"/>--> <!-- 一般包写到domain包即可,系统自动为该包的类起别名,使用直接是简单类首字母小写 --> <package name="com.shan.hello"/> </typeAliases></configuration> //在Mapper文件中使用:<select id="get" parameterType="java.lang.Long" resultType="user"> select * from t_user where id = #{id}</select>---就是基本类型加个下划线,包装类型的别名就是基本类型啦。例如int的别名是_int, Integer的别名是int
<!-- 查询总数 --><select id="getCounts" resultType="int"> select count(id) from t_user;</select> /* 测试查询总数 */ @Test public void testGetCounts() throws IOException { SqlSession session = MyBatisUtil.getSession(); //4、进行数据库操作(CRUD) int count = session.selectOne("com.shan.hello.UserMapper.getCounts"); System.out.println(count); //5、关闭资源 session.close(); } <!-- 查询部分列,每一行记录以map[键值对]形式返回 --><select id="getPartCrows" resultType="map"> select id, name from t_user where id = #{id};</select> /* 测试查询部分列 */ @Test public void testGetPartCrows() throws IOException { SqlSession session = MyBatisUtil.getSession(); //4、进行数据库操作(CRUD) Map<String, Object> user = session.selectOne("com.shan.hello.UserMapper.getPartCrows", 2L); System.out.println(user); //5、关闭资源 session.close(); }(1)建立一个外部的.properties 文件 【key=value形式】:
driver=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://localhost:3306/mybatisdemousername=rootpassword=admin(2)引入和动态替换,通过properties的resource引入,然后动态替换是使用${}:
<configuration> <!-- 属性properties配置 --> <!-- 文件的根目录是.classpath路径 --> <properties resource="db.properties"/> <environments default="dev"> <!-- 1、配置数据库的环境 --> <environment id="dev"> <!-- ① 事务管理器 --> <transactionManager type="JDBC"/> <!-- ② 连接池【连接数据库4要素】 --> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> </configuration>列名和对象的属性名不匹配的问题]resultType 是要求表的列名和对象的属性名要一致,否则会出错。 <select id="getList" parameterType="java.lang.Long" resultType="user"> select u_id id, u_name name, u_salary salary from t_user; </select> <!-- resultMap 结果集合对象映射:解决表的列名和对象的属性名不匹配的问题 id:唯一标识 type:封装结果集的每一行记录的类型 子元素:result 匹配对象中的哪一个属性对应表的哪一列 【若是主键,建议使用id元素代替result元素提高性能】 --> <resultMap id="BaseResultMap" type="User" > <id column="u_id" property="id"/> <result column="u_name" property="name"/> <result column="u_salary" property="salary"/> </resultMap> <select id="getList" parameterType="java.lang.Long" resultMap="BaseResultMap"> select u_id, u_name, u_salary from t_user;</select> public void testGet() throws IOException { // 创建SqlSession会话对象,好比连接对象Connection SqlSession session = MyBatisUtil.getSession(); // 进行数据库操作(CRUD) User user = session.selectOne("com.shan.hello.UserMapper.get", 2L);//第一个参数是字符串无法编译时检查,第二个参数是Object类型也无法编译时检查 System.out.println(user); // 关闭资源 session.close(); }(1)第一个参数:因为传入的是String类型的参数,可能会写错,写错检查也是等到运行时才发现
(2)第二个参数:Object类型,不需要被检查,万物皆对象
(3)每个操作【增删改查】的代码模板是相同的,可以抽取
--------解决:使用Mapper 接口,类似DAO接口,在Mapper接口中去定义每一个操作方法。
跟业务代码混杂在一起;②而且每次操作数据库时都需要重复书写代码(1)Mapper 文件和Mapper 接口应该放到同一包下
(2)Mapper文件中的namespace 对应 Mapper接口的全限定名称
(3)Mapper文件中的操作元素的**id **对应 Mapper接口的方法名称
/* Mapper 接口*/public interface UserMapper { void save(User user); void delete(Long id); void update(User user, Long id); void get(Long id); List<User> getListAll();}<!-- Mapper文件 --><!-- Mapper文件的namespace对应Mapper 接口的全限定名 --> <mapper namespace="com.shan.hello.mapper.UserMapper"> <!-- 保存操作 --> <!-- Mapper 文件的操作元素的id对应Mapper接口的方法名 --> <insert id="save"> insert into t_user (name, salary) values (#{name}, #{salary}); </insert> <!-- 删除操作 --> <delete id="delete"> delete from t_user where id = #{id}; </delete> <!-- 更改操作 --> <update id="update"> update t_user set name = #{name}, salary = #{salary} where id = #{aid}; </update> <!-- 查询操作 --> <select id="get" parameterType="java.lang.Long" resultType="user"> select * from t_user where id = #{id} </select> <select id="getListAll" parameterType="java.lang.Long" resultType="user"> select * from t_user; </select> </mapper>/* 测试,调用Mapper接口操作数据库 */@Testpublic void testGetList() throws IOException{ SqlSession session = MyBatisUtil.getSession(); UserMapper userMapper = session.getMapper(UserMapper.class); List<User> users = userMapper.getListAll(); System.out.println(users); }---myBatis默认情况下只能处理一个参数,解决查询多个参数的方法:
/* ClientMapper 接口 */public interface ClientMapper { //将多个参数封装成一个Map对象 Client login2(Map<String,Object> map);}<!-- Mapper文件 --><mapper namespace="com.shan.params.mapper.ClientMapper"> <select id="login2" resultType="Client"> select id, username, password from client where username = #{username} and password = #{password} ; </select></mapper> /* 测试 */ @Testpublic void testLogin2() throws IOException { Map<String,Object> paramMap = new HashMap<String, Object>() { { //设置map的元素的键值对的值 this.put("username", "shan"); this.put("password", "1"); } }; SqlSession session = MyBatisUtil.getSession(); ClientMapper clientMapper = session.getMapper(ClientMapper.class); Client client = clientMapper.login2(paramMap); System.out.println(client); session.close();} /* ClientMapper 接口 */public interface ClientMapper { //使用params注解封装多个参数 Client login3(@Param("username")String username, @Param("password")String password);}<!-- Mapper文件 --><mapper namespace="com.shan.params.mapper.ClientMapper"> <select id="login3" resultType="Client"> select id, username, password from client where username = #{username} and password = #{password} ; </select></mapper> /* 测试 */ @Testpublic void testLogin2() throws IOException { SqlSession session = MyBatisUtil.getSession(); ClientMapper clientMapper = session.getMapper(ClientMapper.class); Client client = clientMapper.login3("shan", "1"); System.out.println(client); session.close();} 